c++ - 使用具有传感器融合的 9DOF IMU 在 C++ 中进行双积分加速

标签 c++ c accelerometer numerical-integration inertial-navigation

我花了几个小时研究数值积分和速度/位置估计,但我无法真正找到我的大脑可以理解或适合我的情况的答案。

我有一个 IMU(惯性测量单元),它有一个陀螺仪、一个加速度计和一个磁力计。所有这些传感器都在融合,这意味着例如使用陀螺仪我能够补偿加速度计读数中的重力,而磁力计补偿漂移。 换句话说,我可以使用这种设置获得纯加速度读数。

现在,我正在尝试根据加速度准确估计位置,您可能知道这需要二重积分,并且有多种方法可以做到这一点。但我不知道哪个在这里最合适。 有人可以分享一些关于这个的信息吗? 另外,如果你能在不使用任何复杂的数学公式/符号的情况下向我解释它,我将不胜感激,我不是数学家,这是我在寻找信息时遇到的问题之一。

谢谢

最佳答案

您可以通过简单地将加速度 vector 乘以时间步长(IMU 的周期)相加得到速度,然后将速度乘以时间步长相加得到位置,从而对加速度进行积分。您可以使用各种方法传播(而不是整合)方向,具体取决于您选择的方向表示(欧拉角、四元数、姿态矩阵( DCM)、轴角等)。

但是你有一个更大的问题。

长话短说:除非您拥有海军品质的 IMU(200,000 美元以上),否则您无法简单地整合加速度和角速率来获得准确的姿态(位置和方向)估计值。

我假设您使用的是低成本(低于 1,000 美元)的 IMU - 您的加速度计和陀螺仪会受到噪声和偏差的影响。这些都会导致无法通过简单的积分得到准确的位姿。

在实践中做你打算做的事情需要融合位置的“校正”测量和可选的方向。 IMU“预测”位置/方向,而另一个传感器模型(相机功能、GPS、高度计、距离/方位测量)获取预测位置并“修正”它。有多种融合这些数据的方法,其中最多产的是扩展卡尔曼滤波器或误差状态(间接)卡尔曼滤波器。

回到你原来的问题;我会将方向表示为四元数,您可以使用错误- quaternion derivative 传播四元数方向。以及陀螺仪的角速率。

编辑:

The noise problem can be partially worked around by using a high pass filter, but what kind of bias are you exactly talking about?

您应该阅读 sources of error in MEMS accelerometers :恒定对齐偏差、随机游走偏差、白噪声和温度偏差。正如您所说,您可以使用高通滤波器来降低噪声的影响——但这并不完美,因此存在明显的残余噪声。残余噪声的二重积分给出二次方增加的位置误差。即使在去除重力加速度后,由于这些误差源,仍会测量到明显的加速度,这将导致位置估计在不到 1 秒的积分内不准确。

关于c++ - 使用具有传感器融合的 9DOF IMU 在 C++ 中进行双积分加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091151/

相关文章:

c++ - const 和非 const 类型的相同模板特化

c - C 中的显式类型转换

c++ - 如何在 C/C++ 中创建数学曲线(可能只是图像)

C++ 使用指针

c++ - 解析结构并作为指针参数传递

c++ - 霍夫变换中的OpenCV GPU错误(功能未实现)

c - 我的这个推理哪里错了?

ios - 使用 iphone 中的加速度计功能在步行时计算步数的逻辑

ios - 使用 CoreMotion/Accelerometer 以编程方式检测 iPhone 是否掉落

android - 如何获取设备中只有加速度计传感器的RotationMatrix