3

我正在尝试学习传感器融合,为此我已经通过一个安卓应用程序记录了加速度计、陀螺仪和磁力计的原始数据。

我遇到了卡尔曼滤波器,但它们太复杂而无法理解,我不想在没有正确理解的情况下获取任何代码并实现它。

然后我找到了互补过滤器的这个链接,看起来很有希望,因为它很容易理解。所以我有以下疑问。(这是我第一次处理所有这些传感器,所以我要问我所有的问题)

  1. 互补滤波器从传感器获取信号,并根据俯仰、滚动和偏航输出方向。这是否意味着它会过滤时域信号并根据角度提供输出?在这种情况下,是否有可能获得滤波后的时域信号?

  2. 我看到了这个著名的 Google Talk 视频,其中他提到要获得线性加速度,您需要从原始加速度计数据中减去重力。如何获得重力矢量?

  3. 另外,我对为什么必须将加速度信号转换为地球坐标系感到有些困惑。我已经阅读了一些文件,但我仍然感到困惑。我可以看到它为什么完成,但是如何计算所需的旋转矩阵。

  4. 最后(但肯定不是最终的),我如何估计航向?

所以基本上,我有传感器数据,我想跟踪设备的方向以及人的前进方向。这些问题可能听起来很基础,但我需要专家对此主题的一些澄清,这样我才能去研究一些花哨的算法。

如果有人能指出我正确的方向,我将不胜感激。

此致

钦坦

4

1 回答 1

2

根据我的经验,没有任何 AHRS 算法可以在精度方面与扩展卡尔曼滤波器相媲美。如果要计算用户加速度,精度非常重要,因为旋转矩阵的不准确会导致用户加速度的漂移。

问题1:我不明白你对过滤时域信号的确切含义。测量样本始终提供时间戳。

回答 2 和 3:

要计算用户加速度,您需要事先计算姿态(旋转矩阵)。因为您需要以您的 AHRS 算法计算的姿态旋转传入的 ACC 数据,以使其从“电话空间”到“世界空间”。因此,手机的向上移动(无论哪个方向)总是会导致用户加速度中的 Y 值增加。我希望你明白我的意思。现在我们在世界空间中有原始加速度计数据并减去重力( vector3(0,9.81f, 0) )。因此,如果没有运动,我们的新用户加速度始终显示 (0,0,0)。

这是最容易的部分。我们现在有了世界空间中的用户加速度。但是我们想要一个位置偏移(路径)。您不能只将加速度与速度相结合,然后再将速度与路径/方式相结合。(请原谅我的英语;-))因为加速度计的测量样本永远不够精确,无法得出路径的 2 倍。您必须对约束进行编程以控制导出的速度,以便在加速度的值和斜率为零时将其设置回零。否则,总会有剩余的速度量,导致计算出的路径随时间发生巨大的漂移。我认为为了获得最佳的由内而外的位置跟踪,您需要对(世界空间)用户加速度进行一些分析并重建一个干净的速度图,以便在没有加速度的情况下获得始终返回零的平滑运动。我自己编写了这个程序,它可以工作,但并不准确。一个问题是,识别的运动取决于速度/加速度。运动越慢,加速度计的值越低,直到它们消失在传感器噪声中。另一个问题是要识别,何时运动已经结束,以消除其对结果速度的所有影响。

AHRS 算法不需要磁力计传感器,因为它不够可靠并且总是会引入错误。磁力计受环境影响很大。例如看看 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”显示了谷歌如何估计“当前”旋转矩阵。

我希望这能回答你的一些问题。

于 2015-06-02T10:30:57.613 回答