IMU 预积分推导说明系列
- IMU 预积分 - 1. 介绍
- IMU 预积分- 2. 预备知识 (1) 关键帧
- IMU 预积分 - 2. 预备知识 (2) 3D 旋转与不确定性
- IMU 预积分 - 3. IMU 模型推导与运动积分
- IMU 预积分 - 4. IMU 预积分测量值推导
- IMU 预积分 - 5. LIO-SAM 中的 IMU 预积分
文章来源主要是翻译Hyungtae Lim的博客。想看原文的直接看原文。
简易解释:“基于流形的实时视觉惯性里程计的预积分”
对于对 VINS(视觉惯性系统)或 LIO(激光雷达惯性里程计)感兴趣的人来说,可能已经听说过 IMU 预积分。IMU 预积分是一种为了有效地利用从相机或 LiDAR 传感器获取的数据进行因子图 SLAM 的方法,旨在处理高频 IMU 数据。
IMU 预积分的重要性
IMU 传感器通常以较高的频率工作(例如,LIO-SAM 的作者使用的高性能 IMU 频率大约为 330Hz),这样可以更好地在离散时间系统中描述真实环境中的连续运动。但问题在于,要在 3D 空间中描述位姿需要 6 个参数(3 个平移参数和 3 个旋转参数)。如果在因子图 SLAM 中为每个 IMU 数据点增加一个因子,参数数量将会变得过多。
举个例子,假设你获取了一个 25 分钟的 ROS bag 文件,由于 IMU 传感器的频率较高,在 25 分钟内大约会有 491,848 个数据点被记录。
要描述每个 IMU 时间步的位姿,你需要 3 个平移参数和 3 个旋转参数,总共 6 个参数。因此,总共需要 491,848 × 6 = 2,951,088 个参数。此外,还需要将激光雷达传感器(/os_cloud_node/points)估计的相对位姿添加到因子图中,参数的数量将会更多。总结来说,在每个 LiDAR 或相机的关键帧之间,将会生成数百个 IMU 因子,这大大增加了 CPU 运算量和内存消耗,影响了因子图 SLAM 的实时性。
在 SLAM 优化过程中,我们需要迭代求解非线性方程,参数数量的增加意味着需要处理的矩阵和向量变得更大。因此,如果直接使用所有 IMU 的位姿估计作为观测值,矩阵的规模将会随时间二次增长,变得过于庞大(相比之下,KITTI 数据集中使用 3D 激光雷达进行因子图 SLAM 时,大约只有 2000 个因子,491,848 个是一个非常庞大的数字)。
为了解决这个问题,IMU 预积分被引入。简而言之,预积分的核心思想是,在将数百个 IMU 数据作为观测值直接加入因子图之前,将这些数据合并为一个单独的因子。
本系列的目标
在编写 LIO-SAM Line by Line 系列文章之前,我觉得有必要先解释 IMU 预积分,因此撰写了这篇文章。文章会简要解释预积分的相关公式推导,并展示如何通过这些公式实现预积分。最终,我还会简要介绍 LIO-SAM 中 imuPreintegration.cpp 的代码实现。
目标是帮助大家理解预积分的实现原理。实际上,计算所需的相关项已经通过 gtsam::PreintegratedCombinedMeasurements
类很好地实现了,因此无需深入了解细节(GTSAM 的文档可以在此参考)。建议结合阅读原论文和本文章作为补充材料。
P.P.S. 理解本系列文章的前提是要具备因子图优化和 3D 旋转的基础知识(例如 SO(3)、反对称矩阵、指数/对数映射等)。关于因子图 SLAM 的学习资料,可以参考基燮整理的 SLAM 后端学习笔记和镇永整理的因子图 SLAM 文章。
如果你对 SO(3)、反对称矩阵、指数/对数映射等术语不熟悉,建议阅读 Joan Sola 的《四元数运动学与误差状态卡尔曼滤波器》前四章(SLAM 工程师的必读书目)。接下来我们将逐步详细讨论预积分的更多细节。