從我的經驗,沒有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如何估計「當前」旋轉矩陣。
我希望這能回答你的一些問題。