2011-02-01 108 views
13

因此,我一直在努力解決這個問題一段時間,並沒有任何運氣挖掘互聯網和相關SO帖子的智慧。如何校準Android加速度計並減少噪音,消除重力

我正在編寫一個使用無處不在的加速度計的Android應用程序,但即使在休息時,我似乎也得到了令人難以置信的「噪音」量,似乎無法弄清楚如何處理它作爲我的讀數需要相對準確。我認爲,也許我的手機(宏達不可思議)功能失常,但傳感器似乎與我玩​​過的其他遊戲和應用程序運行良好。

我試過使用各種「過濾器」,但我似乎無法將我的思想包裹在它們周圍。我知道重力必須以某種方式處理,也許這就是我出錯的地方。目前,我已經試過了,改編自SO answer,這是指從iPhone SDK的例子:

   accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor); 
       accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor); 


       double x = event.values[0] - accel[0]; 
       double y = event.values[1] - accel[1]; 

海報上寫着的kFilteringFactor值「一起玩」(kFilteringFactor = 0.1F中的例子),直到滿意爲止。不幸的是,我似乎還是聽到了很多噪音,而這一切似乎只是讓讀數以小數字形式出現,這對我來說並沒有多大幫助,而且似乎只是讓傳感器不那麼敏感。我的大腦的數學中心也因多年的忽視而萎縮,所以我不完全理解這個過濾器是如何工作的。

有人可以向我詳細解釋一下如何從加速度計讀取有用的?一個簡潔的教程將是一個難以置信的幫助,因爲我沒有找到一個很好的(至少針對我的知識水平)。我感到沮喪,因爲我覺得所有這些對我來說應該更加明顯。任何幫助或方向將不勝感激,當然,如果需要,我可以從我的代碼中提供更多樣本。

我希望我不是要求太多吃飽;除非我一直試圖弄清楚我們的情況,否則我不會問。它看起來似乎還有其他SO成員的興趣。

+7

讓我知道如果你在「消除重力」部分得到任何線索,我的氣墊船邊業務就是*這個關閉*! – 2011-02-02 00:15:05

+3

哈哈喬恩,你沒聽到?谷歌固定重力。他們很快就會發布API。 – malfunction 2011-02-02 00:47:06

回答

4

要從加速度計中獲得正確的讀數,您需要使用方程速度= SQRT(x * x + y * y + z * z)。使用這個,當手機靜止時,速度將是重力 - 9.8m/s。所以,如果你減去(SensorManager.GRAVITY_EARTH),那麼當手機靜止時,你將有0 m/s的讀數。至於噪音,即使在我的手機處於靜止狀態時,Blrfl對於便宜的加速度計也許是正確的,但它每秒會持續閃爍幾分之一米。你可以設置一個小的閾值,例如0.4m/s,如果速度沒有超過這個值,那麼它就處於靜止狀態。

5

部分答案:

精度。如果您正在尋找高精度,您在手機中找到的便宜加速度計不會切斷芥末。作爲比較,適用於工業或科學用途的三軸傳感器僅用於傳感器價格1,500美元以上;增加硬件來驅動它,並將其讀數變成計算機可以使用的價格的兩倍。手機中的傳感器數量遠低於5美元。

噪音。便宜的傳感器是不準確的,而不準確性會導致噪音。不移動的不精確傳感器不總是顯示零點,它會在某個範圍內顯示任一側的值。關於你能做的最好的事情就是在靜止的時候對傳感器進行特性分析,以獲得一些想法,並根據預期誤差將測量結果轉化爲不太精確的尺度。 (換句話說,如果它的誤差在±x m/s^2之內,可以肯定地說傳感器沒有移動,但是你不能確切地確定,因爲它可能運動非常緩慢)。在每臺設備上都要這樣做,因爲它們並不都使用相同的加速計,而且它們的行爲都不相同。我想這是iPhone的一個優勢:硬件非常齊全。

重力。SensorEvent documentation中有一些討論關於加速度計說的重力因素。你會注意到它與你發佈的代碼有很多相似之處,除了它更清楚它正在做什麼。:-)

HTH。

+0

感謝您深思熟慮的回覆,Blrfl。清理了我一直存在的一些更概念性的問題,並確認我沒有注意到來自加速度計的值的波動。 – malfunction 2011-02-05 18:44:15

1

你如何處理抖動?你平滑數據。不是將傳感器的值序列看作是您的值,而是將它們平均計算,並且形成的新序列成爲您使用的值。這使每個抖動值更接近移動平均值。平均值必然會消除相鄰值的快速變化。這也是爲什麼人們使用術語低(頻率)通過濾波的原因,因爲現在每個樣本(或單位時間)原來可能變化很大的數據現在變化更慢。

例如,您可以用許多方式對這些值進行平均,而不是使用值10 6 7 11 7 10。例如,我們可以使用下一個原始數據點,根據運行平均值的相等權重(即,您上次處理的數據點的權重)計算下一個值。對於上述數字使用50-50混合,我們得到10,8,7.5,9.25,8.125,9.0675。這個新的序列,我們處理過的數據,將被用來代替噪音數據。當然,我們可以使用不同於50-50的混音。

作爲一個比喻,假設您僅使用視力報告某個人所在的位置。你可以看到更廣闊的風景,但是這個人被霧淹沒了。你會看到引起你注意的身體碎片......左右手,右腳,眼鏡等發出緊張感,但每個值都非常接近真正的質心。如果我們運行某種運行平均,那麼當它在霧中移動時,我們會得到接近目標質量中心的值,並且實際上比我們(傳感器)報告的值更精確多霧路段。

現在看來我們正在失去可能有趣的數據來獲得無聊的曲線。這很有道理。如果我們試圖在霧中重新創建人的準確圖像,首要任務是獲得質量中心的良好平滑近似值。爲此,我們可以添加來自互補傳感器/測量過程的數據。例如,一個不同的人可能接近這個目標。這個人可能會提供非常準確的身體動作描述,但可能在濃霧中,並不知道目標結束的整體情況。這是我們第一次得到的補充位置 - 第二個數據準確無誤地提供了詳細的位置。這兩部分數據將被拼接在一起。我們低通第一組(如你在這裏提出的問題),以獲得一個沒有噪音的一般位置。我們很高興通過第二組數據來獲取詳細信息,而不會對總體位置產生不必要的誤導性貢獻。我們使用高質量的全球數據和高質量的本地數據,每套都以互補的方式進行了優化,並防止破壞另一套(通過2次過濾)。

具體來說,我們會混合陀螺儀數據 - 在「樹木」的局部細節中準確的數據,但在森林中迷路(漂移) - 進入這裏討論的數據(來自加速度計)森林很好但不是樹木。總而言之,我們從傳感器的低通數據中感到不安,但仍然接近「質量中心」。我們將這個基本平滑值與詳細數據精確但漂移的數據相結合,因此第二組高通濾波。當我們處理每組數據以清除不正確的方面時,我們可以得到兩全其美的好處。對於加速度計,我們通過對其測量值運行平均值的一些變化來有效地平滑/低通數據。如果我們正在處理陀螺儀數據,我們會做有效保持細節(接受增量)的數學計算,同時拒絕最終會增長並損壞加速計平滑曲線的累積誤差。怎麼樣?本質上,我們使用實際的陀螺儀值(不是平均值),但是在得出我們的總最終清潔值時,使用少量的樣品(增量值)。使用少量增量可保持總體平均曲線大部分沿着由低通階段(通過平均加速度計數據)跟蹤的相同平均值,其形成每個最終數據點的大部分。