2015-05-19 33 views
2

我正在嘗試學習傳感器融合,並通過Android應用程序記錄了加速度計,Gryoscope和磁力計的原始數據。使用互補濾波器的傳感器融合

我遇到了卡爾曼濾波器,但它們太複雜而難以理解,我不想僅僅採取任何代碼並在沒有正確理解的情況下實施它。

然後我發現this鏈接爲補充過濾器,看起來很有希望,因爲它很容易理解。所以我有以下疑問。 (這是我第一次處理所有這些傳感器,所以我要問我的所有問題)

  1. 的互補濾波器從傳感器讀取信號,並在俯仰,滾轉和偏航方面輸出的方向。這是否意味着它會過濾時域信號並以角度提供輸出?在那種情況下,是否有可能獲得濾波的時域信號?

  2. 我遇到了this着名的Google Talk視頻,並且他提到要獲得線性加速,您需要從原始加速度計數據中減去重力。我如何獲得重力矢量?

  3. 此外,我對加速度信號爲什麼必須轉換爲地球座標系有些困惑。我已經閱讀了一些文件,但我仍然感到困惑。我可以看到它爲什麼完成,但是如何計算所需的旋轉矩陣。

  4. 最後(但肯定不是最後的),我該如何估算標題?

所以基本上,我有傳感器數據,我想跟蹤設備的方向以及人員朝哪個方向前進。這些問題聽起來很基本,但我需要專家對這個主題進行澄清,所以我可以去研究一些奇特的算法。

如果有人能指引我正確的方向,我將非常感激。

問候

Chintan

回答

1

從我的經驗,沒有AHRS算法,可以在準確的方式擴展卡爾曼濾波競爭。如果你想計算用戶加速度,精度非常重要,因爲你的旋轉矩陣的不準確會導致用戶加速度的漂移。

對於問題1: 我不明白你的意思是什麼濾波時域信號。測量樣本始終提供時間戳。

答2和3:

計算用戶加速你需要計算的態度(旋轉矩陣)提前。因爲您需要根據您的AHRS算法計算的姿態來旋轉輸入的ACC數據,以將其從「手機空間」轉換爲「世界空間」。因此,手機的上移(無論是哪個方向)總是會導致用戶加速度中Y值的增加。我希望你明白我的意思。現在我們有世界空間中的原始加速度計數據並減去重力(矢量3(0,9.81f,0))。因此,如果沒有移動,我們的新用戶加速度始終顯示(0,0,0)。

這是很容易的部分。我們現在在世界空間有用戶加速。但是我們想要一個位置偏移量(路徑)。你不能只將加速度與速度以及之後的速度整合爲路徑/方式。 (請原諒我的英語;-))因爲加速計的測量樣本從來不足以精確到導出路徑的2倍。你必須編程約束來控制你的導出速度,所以如果加速度的值和斜率爲零,它將被設置回零。否則,總會有剩餘的速度導致計算出的路徑隨時間漂移很大。我認爲對於最好的從內到外的位置跟蹤,您需要對(世界空間)用戶加速度進行一些分析並重新構建一個乾淨的速度圖,以便在沒有加速度時平滑移動始終回到零。我自己編寫了這個程序,它可以工作,但並不確切。一個問題是,公認的運動取決於速度/加速度。運動越慢,加速度計的值越低,直到它們在傳感器噪聲中消失。另一個問題是要認識到,當一個運動已經結束,以消除其對速度產生的所有影響。

AHRS算法不需要磁強計傳感器,因爲它不夠可靠,並且總會引入誤差。磁力儀受環境影響很大。例如看看谷歌Cardboard磁力計開關。當您拉動谷歌紙板觸發器時,打開傳感器測試應用程序,查看磁力計傳感器。它將在磁力計上產生巨大的價值,這根本不代表航向。同樣的事情可能發生在微波爐等。 因此,爲了獲得良好的北向航向,您必須始終檢查磁場的方向和大小是否自特定時間以來未發生變化,並且都是合理的值。然後,您可以使用磁力計數據作爲旋轉您從AHRS算法獲得的方位旋轉矩陣的參考,以將方向糾正爲北方。

回答4: 您從旋轉矩陣中獲得標題。

vector3 headingDirection = new vector3(rotMat[8], rotMat[9], rotMat[10]); 

根據您的旋轉矩陣的形式(列主要或行主)您可能需要調整指數。 看約翰·舒爾茨這裏的答案: http://www.gamedev.net/topic/319213-direction-vector-from-rotation-matrix/

的rotationMatrix應該通過將當前旋轉速度(陀螺儀)來估算乘以你的最後估計旋轉和現在之間的時間。

譯註:

我覺得如果你要玩的傳感器融合和用戶加速它可能是最好的使用擴展卡爾曼濾波器從cardboard.jar爲出發點。您可以將其與您的算法進行比較。

看看這裏: https://github.com/Zomega/Cardboard/blob/master/src/com/google/vrtoolkit/cardboard/sensors/internal/OrientationEKF.java

雖然它使用magentometer(processMag)的方法,這種方法不會被調用在硬紙板的API。

鏈接文件中的方法「getPredictedGLMatrix」顯示了Google如何估計「當前」旋轉矩陣。

我希望這能回答你的一些問題。