根据我的经验,没有任何AHRS算法能够与扩展卡尔曼滤波相比较,就准确度而言。而准确度对于计算用户加速度非常重要,因为旋转矩阵的不准确性会导致用户加速度的漂移。
对于问题1:
我不太明白您所说的过滤时间域信号是什么意思。测量样本始终提供时间戳。
对于问题2和3的回答:
为了计算用户加速度,您需要事先计算出姿态(旋转矩阵)。因为您需要使用AHRS算法计算出的姿态将传入的ACC数据从“手机空间”旋转到“世界空间”。这样,无论手机处于哪种方向,上移动都会使用户加速度的Y值增加。希望您能理解我的意思。现在我们在世界空间中拥有原始加速度计数据并减去重力(vector3(0,9.81f,0))。因此,如果没有运动,我们的新用户加速度将始终显示(0,0,0)。
这是简单的部分。现在我们在世界空间中拥有用户加速度。但是我们想要一个位置偏移(路径)。您不能只将加速度积分到速度,然后将速度积分到路径/路程。(请原谅我的英语;-))因为加速度计的测量样本永远不够精确,无法推导出2次路径。您必须编写约束条件来控制您派生的速度,以便在加速度的值和斜率为零时将其设置回零。否则,始终会剩余一定数量的速度,导致随时间漂移的计算路径巨大。我自己编写了这个程序,它可以工作,但不是很准确。一个问题是,识别的运动取决于速度/加速度。运动越慢,加速度计的值就越低,直到它们在传感器噪声中丢失。另一个问题是要识别运动何时结束以消除其对结果速度的影响。
磁力计传感器不需要用于AHRS算法,因为它不够可靠,并且始终会引入误差。磁力计可能会受到环境的影响。例如,看看Google Cardboard的磁力计开关。打开传感器测试应用程序,在拉动Google Cardboard触发器时查看磁力计传感器。它将产生一个巨大的值,根本不代表方向。类似的事情可能会发生在微波等设备上。因此,要获得良好的北向头,您必须不断检查自从特定时间以来磁场的方向和大小是否未发生变化并且是否合理。然后,您可以将磁力计数据用作参考,旋转您从AHRS算法获得的方向旋转矩阵,以校正朝向北。
对于问题4的回答:
您可以从旋转矩阵中获取方向。
vector3 headingDirection = new vector3(rotMat[8], rotMat[9], rotMat[10])
根据您的旋转矩阵形式(列主或行主),您可能需要调整索引。请参考John Schultz在此处的答案:
http://www.gamedev.net/topic/319213-direction-vector-from-rotation-matrix/。
通过将当前旋转速度(陀螺仪)乘以从上次估计旋转到现在所经过的时间来估算旋转矩阵。
注释:
我认为,如果您想尝试传感器融合和用户加速度,最好使用cardboard.jar中的扩展卡尔曼滤波器作为起点。您可以将其与您的算法进行比较。
请参见:
https://github.com/Zomega/Cardboard/blob/master/src/com/google/vrtoolkit/cardboard/sensors/internal/OrientationEKF.java。
虽然它有一个使用磁力计的方法(processMag),但该方法从未在cardboard-api中被调用。
链接文件中的“getPredictedGLMatrix”方法显示了Google如何估计“当前”旋转矩阵。
希望这回答了您的一些问题。