2015-05-19 118 views
2

我正在尝试学习传感器融合,并通过Android应用程序记录了加速度计,Gryoscope和磁力计的原始数据。使用互补滤波器的传感器融合

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

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

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

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

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

  4. 最后(但肯定不是最后的),我该如何估算标题?

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

如果有人能指引我正确的方向,我将非常感激。

问候

Chintan

回答

1

从我的经验,没有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如何估计“当前”旋转矩阵。

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