我正在尝试学习传感器融合,为此我通过Android应用程序记录了加速度计,Gryoscope和磁力计的原始数据。
我遇到了卡尔曼滤波器,但它们太复杂而无法理解,我不想只是接受任何代码并在没有正确理解的情况下实现它。
然后我找到了this链接的补充过滤器,看起来非常有前途,因为它很容易理解。所以我有以下疑问。 (这是我第一次处理所有这些传感器,所以我会问我所有的问题)
互补滤波器从传感器获取信号,并根据俯仰,滚转和偏航输出方向。这是否意味着它过滤时域信号并提供角度输出?在这种情况下,是否有可能获得滤波后的时域信号?
我遇到了this着名的Google Talk视频,他提到要获得线性加速,您需要从原始加速度计数据中减去重力。如何获得重力矢量?
此外,我对加速信号必须转换为地球坐标系的原因略感疑惑。我看过一些文件,但我仍然感到困惑。我可以看到它为什么要完成,但是如何计算所需的旋转矩阵。
最后(但肯定不是最终的),我如何估算航向?
所以基本上,我有传感器数据,我想跟踪设备的方向以及人员前进的方向。这些问题可能听起来非常基本,但我需要专家就这一主题做一些澄清,因此我可以继续研究一些奇特的算法。
如果有人能指出我正确的方向,我真的很感激。
最好的问候
Chintan
答案 0 :(得分:1)
根据我的经验,没有AHRS算法可以在精确度方面与扩展的卡尔曼滤波器竞争。如果你想计算用户加速度,准确性非常重要,因为旋转矩阵的不准确性会导致用户加速度的漂移。
问题1: 我不明白你对滤波时域信号的意思。测量样本始终提供时间戳。
回答2和3:
要计算用户加速度,您需要事先计算姿态(旋转矩阵)。因为您需要使用AHRS算法计算的姿态旋转传入的ACC数据,以便将其从“电话空间”转换为“世界空间”。因此,手机的向上移动(无论哪个方向)将始终导致用户加速中的Y值增加。我希望你明白我的意思。现在我们在世界空间中使用Raw-Accelerometer-Data并减去重力(vector3(0,9.81f,0))。因此,如果没有移动,我们的新用户加速总是显示(0,0,0)。
这很容易。我们现在在世界空间中拥有用户加速。但我们想要一个位置偏移(路径)。您不仅可以将加速度与速度相结合,还可以将速度与路径/路径相结合。 (原谅我的英文;-))因为加速度计的测量样本永远不够精确,无法得到2倍的路径。您必须编制约束来控制导出的速度,以便在加速度的值和斜率为零时将其设置回零。否则将始终存在剩余的速度量,导致计算的路径随时间的巨大漂移。我认为对于最好的内向外位置跟踪,您需要对(世界空间)用户加速进行一些分析并重建一个干净的速度图,以便在没有加速时始终返回零。我自己编程,它可以工作但不确切。一个问题是,识别的运动取决于速度/加速度。运动越慢,加速度计的值越低,直到它们在传感器噪声中丢失。另一个问题是,当一个动作结束时,要识别它对所得速度的所有影响。
AHRS算法不需要磁力计传感器,因为它不够可靠并且总是会引入错误。磁力计可能会受到环境的影响。例如,看看谷歌纸板磁力仪开关。拉动谷歌纸板触发器时,打开传感器测试应用程序查看磁力计传感器。它将在磁力计上产生巨大的价值,它根本不代表标题。微波等可能会发生同样的事情。 所以为了获得良好的北方标题,你不得不检查是否 磁场的方向和大小自特定时间以来没有变化,是合理的值。然后,您可以使用磁力计数据作为参考来旋转您从AHRS算法获得的Orientation-Rotation-Matrix,以将航向更正为北。
回答4: 您可以从旋转矩阵中获得标题。
vector3 headingDirection = new vector3(rotMat[8], rotMat[9], rotMat[10]);
根据旋转矩阵的形式(列主要或行主要),您可能需要调整索引。 看看John Schultz的答案: http://www.gamedev.net/topic/319213-direction-vector-from-rotation-matrix/
应通过将当前旋转速度(陀螺仪)乘以上次估计旋转与现在之间的经过时间相乘来估算rotationMatrix。
注释:
我认为如果您想要使用传感器融合和用户加速,最好使用来自cardboard.jar的扩展卡尔曼滤波器作为起点。您可以将其与算法进行比较。
虽然它有一种使用测角仪(processMag)的方法,但这种方法永远不会在cardboard-api中被调用。
链接文件中的方法“getPredictedGLMatrix”显示了谷歌如何估算“当前”轮换矩阵。
我希望这可以回答你的一些问题。