IMU学习

参考https://zhuanlan.zhihu.com/p/356693537

IMU在定位、建图等系统中都是非常核心的传感器。

使用IMU时,核心问题是建立IMU测量值z与系统状态[公式]之间的关系[公式] 。建立这种关系可以采用两种形式:

1)积分

2)微分

还有一个有趣的现象,迭代形式的IMU预积分公式与直接积分公式,在重力为0的情况下,是相同的。

这样在写代码时我们可以只实现直接积分方法,把重力设成0就变成了预积分了。

1、积分形式的用法

这种方式通过积分IMU数据的形式,建立IMU与State的关系

1.1 IMU ODE

 

 具体可参考:https://arxiv.org/abs/1711.02508

1.2在滤波算法中的用法

滤波算法中,如EKF,一般用IMU做状态预测。相关的系统如IMU&GPS惯导,MSCKF等。具体的就是对(1)式进行积分,将k时刻的state predict到k+1时刻。

 

 对于上面的式子可以采用各种数值积分(欧拉、中值、RK4)计算。以Euler积分为例:

 

 采用这个式子,就可以做EKF的预测了。状态转移矩阵/雅克比的具体形式可参考这里:https://docs.openvins.com/propagation.html

1.3在优化算法中的用法

IMU的频率远高于相机/Lidar的帧率,基于优化的系统,如VIO/LIO中,一般将两个(关键)帧之间的IMU做积分,形成与两端state的关系方程。构造这个方程有两种方法。

1.3.1直接积分法

 采用(2)式,对IMU进行直接积分,从上一个关键帧state推演到下一个关键帧。这样,我们可以建立下面的约束。

 

这种方法的缺点很明显,每次优化迭代之后, [公式]变化,积分[公式]就要重新计算。

但是优势也很突出,每次都重新积分,意味着更高的精度。如果对精度要求高,又不在意计算量,建议采用这种形式。

1.3.2 预积分

预积分开始由Lupton提出,后来由Forster推广到了manifold上面。李明扬在MSCKF2.0中也有提到相关的思想。最关键的Paper是https://ieeexplore.ieee.org/document/7557075

(4)式的问题是不能把约束建立成[公式],z为常量,这种形式。这种形式的方程,当状态[公式]变化时,也不会影响到z。预积分的精髓就在于,找到一个与状态无关的测量值z

具体的,我们把(2)式重写一下,将积分基准设在k帧上,[公式] 就与状态无关了,就是我们的预积分量。

 

 预积分的迭代形式为:

 

 我们对比一下(6)式和(2)式可以发现一个很有意思的现象:把(2)式中的重力加速度 [公式] 设置成0,(2)和(6)两者在形式上是完全相同的。就是说,迭代形式的IMU预积分公式与IMU直接积分相同。这样我们在写代码的时候,只需要写个直接积分的代码。把重力设成0就可以直接当预积分去使用。

上面的与积分假设了IMU bias不变,但是实际优化过程中 IMU bias是会变的。因此需要进行补偿。具体的是采用一阶近似。

[公式]

这种近似相对于直接积分的方法就有一些精度损失。

预积分的好处是可以避免重复积分。
但是因为有一些近似,比如(7)式,所以理论上精度上不如直接积分。

具体的预积分实现和论文请可以参考:

https://github.com/borglab/gtsam/tree/develop/gtsam/navigation

https://github.com/UZ-SLAMLab/ORB_SLAM3/blob/master/src/ImuTypes.cc

https://github.com/HKUST-Aerial-Robotics/VINS-Mono/blob/master/vins_estimator/src/factor/integration_base.h

2、微分形式的用法

我们如果对IMU数据进行积分,就可以得到pose,从而可以建立IMU与state的关系。那么我们反过来想,对state进行微分,一阶微分就可以得到速度、角速度,二阶微分就可以得到加速度,这样也可以建立IMU的角速度、加速度与state的关系。

关键是如何对state进行微分呢?而且state一般是离散分布的。常用的办法是插值,给定一些离散的state,可以通过插值获取任意时刻的pose。比较常用的插值方法是b-spline。如下图,我们可以在一个IMU采样时刻,插值一个state [公式] ,由与其相邻的四个state插值而来。

 

 

 

 对其进行相对时间的微分,可以建立与IMU的关系,即加速度的误差和角速度的误差。

 

 具体形式,可参考:

https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8432102

https://vision.cs.tum.edu/_media/spezial/bib/sommer19spline.pdf

 

posted on   gary_123  阅读(538)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2017-10-20 vscode的使用记录_2_git
2017-10-20 vscode的使用记录_1
2017-10-20 C++11的chrono库,可实现毫秒微秒级定时
2016-10-20 2、传输层:TCP、UDP和SCTP

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示