【问题标题】:Sensor fusion using complementary filter使用互补滤波器的传感器融合
【发布时间】:2015-05-19 11:05:35
【问题描述】:

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

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

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

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

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

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

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

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

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

最好的问候

金丹

【问题讨论】:

    标签: android orientation accelerometer gyroscope sensor-fusion


    【解决方案1】:

    根据我的经验,没有任何 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/

    应该通过将当前旋转速度(陀螺仪)乘以您上次估计的旋转和现在之间的经过时间来估计rotationMatrix。

    注释:

    我认为,如果您想尝试传感器融合和用户加速,最好使用 cardboard.jar 中的扩展卡尔曼滤波器作为起点。您可以将其与您的算法进行比较。

    看这里: https://github.com/Zomega/Cardboard/blob/master/src/com/google/vrtoolkit/cardboard/sensors/internal/OrientationEKF.java

    虽然它有一个使用磁强计的方法 (processMag),但这个方法永远不会在 cardboard-api 中被调用。

    链接文件中的“getPredictedGLMatrix”方法显示了 google 如何估计“当前”旋转矩阵。

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

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多