从我的经验,没有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如何估计“当前”旋转矩阵。
我希望这能回答你的一些问题。