LIO-SAM深度解读:紧耦合因子图如何融合激光雷达与IMU
发布时间:2026/10/20 8:57:55 锦皓数字建站

LIO-SAM这篇论文我前后读了三遍第一遍囫囵吞枣看流程第二遍抠公式推导第三遍对照代码逐行验证。说实话在激光惯性SLAM这个方向能让我愿意花这么多时间的论文不多但LIO-SAM确实是绕不开的一座山。如果你刚接触这个方向或者已经在用LOAM、Lego-LOAM这类框架但被漂移问题折磨过这篇论文值得从头到尾啃一遍。它解决的问题很直接单一传感器在退化场景下容易挂而简单的松耦合融合又不够稳。LIO-SAM给出的答案是紧耦合因子图把激光雷达、IMU、回环全部塞进一个优化框架里让每一帧观测都参与全局状态修正。这篇读后总结我打算从论文思路、系统架构、核心推导、复现经验到踩坑记录一条线讲透。1. 这论文到底解决了什么问题1.1 为什么需要LIO-SAM这类紧耦合方案先聊一个最直观的问题为什么纯激光SLAM不够用我在实际跑数据时遇到过这种情况机器人进到一条长走廊前后都是相似的墙面激光扫描在走廊方向上的约束几乎为零纯雷达里程计会沿着走廊方向越飘越远。这种场景叫退化环境本质是观测矩阵在某些方向上信息不足。此时哪怕雷达本身精度再高也无法消除位姿漂移。IMU正好能补这个短板。它高频、短时稳定性好不受环境结构影响可以在两次激光扫描之间提供可靠的相对运动估计。但怎么用IMU是个讲究早期方案是松耦合IMU单独做姿态估计然后给激光匹配提供一个初始值这种做法的毛病在于IMU和激光各自的误差没有被联合优化一旦其中一个传感器出错另一个救不回来。LIO-SAM的核心思路是把两者放到同一张因子图里做联合优化激光的扫描匹配结果、IMU的预积分约束、回环检测的位姿约束全部作为因子写入图中通过非线性最小二乘统一求解。这就是标题里Tightly-coupled的由来。相比松耦合紧耦合能在传感器退化时自动增加可靠约束的权重让系统整体更鲁棒。1.2 和LOAM、Lego-LOAM的传承关系光说概念不够把LIO-SAM放进SLAM发展脉络里看会更清楚。如果读过LOAM论文会发现很多影子LIO-SAM继承了LOAM中基于曲率提取角点和平面点的做法也用scan-to-map进行帧与局部地图的配准。但LOAM没有IMU融合用的是一个简单的高频运动补偿模型本质上还是纯激光里程计。Lego-LOAM在此基础上加了轻量化的地面分割和因子图框架引入了回环检测但它的IMU约束是松耦合的回到前面说的问题。LIO-SAM则把Lego-LOAM的因子图框架继承下来同时把IMU预积分正式纳入因子图形成真正的紧耦合。你可以把LIO-SAM理解为在LOAM的特征提取和匹配框架上套了一个包含IMU预积分约束的因子图后端并用回环检测做全局修正。所以读这篇论文之前最好先对LOAM和Lego-LOAM有个基本认识不然看到它提炼特征、计算曲率、维护局部地图这些环节会有点懵。当然即使没有前导知识直接读LIO-SAM也能跟上主线只不过有对比才有更深的体会。2. 系统框架拆解四个核心模块LIO-SAM的系统结构并不是特别复杂拆开看主要有四个部分激光里程计、IMU预积分、因子图后端、回环检测。这四个模块各司其职我一个个拆开讲。2.1 激光里程计模块延续LOAM的精髓激光里程计负责在两次关键帧之间通过特征匹配计算相对位姿变换。LIO-SAM沿用了LOAM的经典做法先对一帧点云按曲率挑出角点和平面点然后用角点匹配角点、平面点匹配平面点的方式求解当前帧相对于局部地图的位姿。一个容易被忽略的细节是LIO-SAM会根据IMU预积分给出的帧间相对运动对当前帧点云做去畸变。这一步在低速场景下看起来可有可无但在车辆高速转弯或者手持设备快速晃动时如果不去畸变边缘特征会糊成一团匹配精度直线下降。我在实际测试中对比过开关去畸变的效果同一段数据集开启去畸变的轨迹误差可以小一个数量级。激光里程计输出的是一个相对位姿变换这个变换会作为因子图中的里程计因子。但它只约束相邻两个关键帧之间的相对关系不会直接修正全局轨迹。2.2 IMU预积分模块关键帧之间的连接桥IMU预积分是LIO-SAM里最值得抠的模块。简单说就是利用两帧激光之间的所有IMU测量积出相对旋转、相对速度、相对位移然后作为约束因子放进图里。为什么叫预积分因为它在优化之前就把一段IMU测量积分好了不需要在每次优化迭代时重新处理原始IMU数据。我在阅读时最大的困惑是为什么不用简单的状态递推而非要搞预积分后来想明白了一个关键点如果直接把IMU测量积到当前位姿里那么一旦后端优化更新了之前的位姿所有后续IMU积分结果都要重算计算量爆炸。预积分的妙处在于它把积分参考系固定在起始关键帧上整个积分结果只与起始位姿和IMU测量相关优化调整其他变量不会影响这个积分值自然就可以作为独立因子重复使用了。当然预积分不等于没有误差。IMU的陀螺仪和加速度计有零偏零偏本身会随时间漂移预积分模块里已经把零偏建模进误差传播过程作为待优化变量一起估计。2.3 因子图与后端优化多源约束的统一场因子图是LIO-SAM的骨架。图中的每个节点代表一个待优化变量包括关键帧位姿、IMU速度、IMU零偏每条边代表一个约束包括IMU预积分因子、激光里程计因子、回环因子和先验因子。这里必须说清楚一个概念为什么用因子图而不是直接做联合概率估计因为SLAM问题天然稀疏相邻关键帧之间才有关联相距很远的关键帧之间约束很弱甚至没有。因子图天然表达了这种稀疏性使得后端可以用增量平滑算法做高效优化而不必每次插入新帧都重算全部历史状态。后端优化的数学本质是求解一个大型非线性最小二乘问题。LIO-SAM用的是GTSAM库里的增量平滑求解器这也是论文作者在实现上的一个重要选择。增量求解的妙处在于它的更新计算跟受影响节点范围成正比而不是跟整个图规模成正比这就在保证全局精度的同时拿到了实时性。2.4 回环检测模块消除长航时漂移回环检测是LIO-SAM补齐全局一致性的最后一块拼图。如果只有局部里程计因子和IMU因子系统的轨迹会随时间慢慢漂移漂移量跟运动距离大致成正比。回环检测的作用是当机器人回到曾经去过的地方时提供一个历史帧与当前帧之间的位姿约束把累积漂移一次性拉回来。LIO-SAM使用基于欧氏距离的回环候选搜索就是拿当前关键帧的粗略位置去找之前所有关键帧里距离比较近的那几个然后在这几个候选帧上进行帧间配准算法细节原文用的是基于点云配准的方式配准结果作为回环因子加入到因子图中。这种方法取决于位姿先验的准确性没有视觉词袋那样的外观描述子所以在长回环或雷达退化场景下可能检测不到回环。但好处是简洁、计算开销低在中等规模的室内外场景已经很够用。如果你跑的数据集回环频繁想增强回环能力后期可以换成基于特征的全局描述子做重定位这在工程上也是常见的扩展方向。3. 关键公式与实现细节透视这部分是论文硬核所在。网上的解读大多讲流程少有人把公式推导掰开揉碎。我把自己理解最透的几个关键公式写出来配上实际场景解释帮助大家建立直觉。3.1 IMU预积分的推导逻辑IMU的测量模型是这样的陀螺仪测量角速度加速度计测量比力比力是物体受到的惯性力与重力之差都带零偏和噪声。要从两个激光帧之间的所有IMU测量中求出相对运动常规做法是从第i帧的位姿开始按时间顺序递推到第j帧。预积分的核心变化是换参考系。传统递推中每个时刻的旋转都要依赖上一时刻的绝对旋转而预积分把所有测量投影到第i帧的机体坐标系里于是相对旋转、相对速度、相对位移这三个量只依赖于IMU测量和两个关键帧之间的时间差而不再直接依赖第i帧的绝对位姿。什么意思举个例子。机器人在t1时刻有绝对位姿A在t2时刻有绝对位姿B。常规递推从A开始把IMU测量一步步积上去得到B。一旦后端优化把A改成A从A重新递推才能得到新的B这相当于所有历史帧都要重新积分。预积分则是直接算出A到B的相对变化量就算A被优化成A你只需要通过一个简单的变换就能从A得到B无需重新处理IMU原始数据。零偏的处理也在这部分。预积分结果可以看成关于陀螺仪零偏和加速度计零偏的一个函数当零偏变化时预积分项的变化可以用线性化近似逼近也就是通过预积分结果对零偏的雅可比矩阵来做一阶修正从而避免了每次零偏更新都重新积分的麻烦。3.2 因子图残差与信息矩阵的意义LIO-SAM中每个因子本质上是一个残差函数加一个信息矩阵协方差矩阵的逆。残差是实际测量值和当前状态期望值之间的差值信息矩阵表示我们对该约束的信任程度。IMU预积分因子的残差由四个部分组成相对旋转残差、相对速度残差、相对位移残差、零偏残差。前三个衡量的是预测值和IMU预积分值之间的差第四个则给零偏一个较小的约束防止零偏乱跳。这个零偏约束非常重要没有它优化过程中零偏有可能收敛到不物理的值。激光里程计因子的残差则相对简单就是对当前帧相对位姿预测值和激光配准结果做差。它对应的信息矩阵通常来自配准的协方差估计或者干脆设成一个经验权重。论文里对信息矩阵的讨论不算多但工程上这个东西直接决定紧耦合的平衡性如果IMU约束给得太强激光在退化环境里的有价值信息会被淹没反之又回到纯激光的老问题。回环因子的残差与里程计因子形式一致但它的信息矩阵通常设得更大表示我们非常信任回环匹配给出的相对位姿。一个值得思考的问题是回环约束的权重过大会导致整个图被少数几个回环匹配主导一旦其中一个回环配准失败全局轨迹可能被拉断。所以在工程实现中回环因子的鲁棒核函数和权重裁剪都是必要的处理手段。3.3 匹配细节与运动补偿scan-to-map匹配的质量很大程度上决定LIO-SAM的局部精度。论文中沿用了LOAM的匹配策略先建立局部地图把激光帧投影到地图坐标系然后对每个特征点在局部地图中找到对应特征用点到线、点到面的距离构建残差最小化总残差求得位姿变换。这里有一个容易忽略的细节局部地图的组织方式。直接维护一个全局点云地图每次匹配都拿全图去搜最近邻计算量不可接受。LIO-SAM维护的是以当前关键帧为中心的一个局部子图通常取附近一定范围内的历史关键帧的点云拼起来。这个局部子图随着机器人移动不断滑动更新匹配时只需要在这个小地图里搜索特征对应点计算开销可控。运动补偿方面LIO-SAM利用IMU预积分提供的帧间运动把一帧内不同时刻采集到的点全部变换到帧起始时刻的坐标系下。这样即便是旋转速率很高的场景匹配时也能把激光点云当作静止刚体来处理。我自己的经验是运动补偿的质量对结果的影响非常显著而很多跑LIO-SAM的朋友直接用官方默认配置在剧烈运动的场景下效果打折扣第一件事就该查这里的参数。4. 复现与工程化实践建议论文读得再通透最后还是要落地。下面这部分是我在实际复现、调参和二次开发中沉淀下来的经验希望能让你省点时间。4.1 环境搭建与数据准备要点LIO-SAM官方实现基于ROS需要先安装好ROS环境然后安装GTSAM库。这里有个常见坑GTSAM的版本和ROS发行版的兼容性。我实测下来用较新版本的GTSAM配合Noetic或者Melodic都能正常编译但如果用了过老的GTSAM版本部分接口和预积分类型定义会对不上。数据集方面官方提供了几个户外数据集链接也支持你使用自己的bag包。跑自己的数据时要特别注意IMU和激光雷达的时间戳同步LIO-SAM对IMU频率有最低要求一般建议至少100Hz低于50Hz时预积分的精度会明显下降。理论上你还需要同时拿到激光和IMU的外参标定结果。LIO-SAM使用了IMU和激光之间的旋转平移这个外参如果标定不准紧耦合融合的效果会大幅受损。我的建议是第一次跑官方数据集时先不要改外参用默认值确认系统正常工作后再换成自己的外参做实验。4.2 关键参数调优心得官方配置里的参数并不需要全部理解但以下几个参数值得花时间调关键帧距离阈值和关键帧角度阈值共同决定关键帧插入频率。阈值设得太小关键帧过于密集后端优化规模膨胀实时性下降设得太大帧间约束变弱精度下降。原则是让关键帧之间的位移量适中保证匹配有足够的重叠度。局部地图的搜索半径决定scan-to-map匹配时用到多少历史点云。搜索半径太小退化场景下局部地图信息不够半径太大匹配计算变慢。IMU预积分噪声参数陀螺仪白噪声密度、加速度计白噪声密度、随机游走密度都需要根据IMU手册或离线标定结果填入。这些参数直接影响信息矩阵的权重分配。如果填得太小系统认为IMU非常精确会过度信任预积分如果填得太大IMU约束变弱紧耦合的作用打折扣。回环检测的搜索半径和匹配阈值决定了回环候选的筛选范围和回环接受条件。我建议选一段包含退化环境和多个回环的数据集每次只调一个参数把轨迹误差作为评价指标集中精力看某些参数带来的效果。盲目同时调整多个参数最后根本定位不到是哪个参数带来的改变。4.3 代码阅读顺序与二次开发建议读LIO-SAM代码时不要从主函数开始那会让你淹没在回调函数的海洋里。我推荐的顺序是先读IMU预积分相关的类把预积分公式和代码对上再看特征提取部分理解曲率计算和角点平面点的分类逻辑然后看scan-to-map匹配流程理解局部地图的构建和残差计算最后看因子图构建部分观察各类因子如何被添加进图里。二次开发时最常做的三件事换回环检测算法、加全局位姿修正、改造多传感器融合结构。LIO-SAM的代码结构对这三件事都比较友好因为因子图本身是模块化的把回环检测模块替换成基于全局描述子的重定位算法并不需要改动其他部分。如果你打算在自己的平台部署LIO-SAM我的建议是前期先在仿真或开源数据上验证再上真机。真机的IMU噪声特性和外参偏差会带来很多隐性问题这些在真机上排查起来耗时耗力。5. 踩坑记录与疑难排查做了近一年的LIO-SAM相关研究踩过的坑比读过的论文多。我把最典型的问题整理成一份速查表附带我的排查思路希望对你有实质帮助。5.1 常见问题速查表问题现象可能原因排查思路轨迹在初始阶段就漂移IMU初始化未完成 / 外参不准检查IMU数据频率和静止初始化校准外参快速旋转时点云错位严重运动补偿错误计 / IMU时间戳偏移检查时间同步确认IMU预积分结果scan-to-map匹配频率骤降局部地图点云太大调小搜索半径适当降低地图分辨率后端优化耗时持续增长关键帧过于密集调大关键帧距离/角度阈值回环闭合后轨迹断裂回环匹配失败 / 信息矩阵权重过大检查匹配阈值加鲁棒核函数轨迹精度优于纯雷达但仍有指数漂移雷达噪声方差设置不合理调大雷达里程计因子的噪声参数排查的前提是有一个可视化工具将轨迹、地图、关键帧、因子图实时显示出来。我在调试时发现绝大多数问题通过可视化都能一眼看出大致原因真正需要通过日志翻代码定位的问题其实很少。5.2 三个容易忽略的实现细节第一个细节是雷达噪声方差的设置。LIO-SAM允许后台通过参数设置雷达噪声但这个噪声值需要根据雷达的测距精度来填不能随便给个默认值。我见过有人在参数里把噪声设得很小结果系统完全被激光约束主导IMU的紧耦合优势被抹平退化场景下照样漂移。反过来噪声设置过大系统又会过度依赖IMU长时间运行会缓慢膨胀。最稳的做法是根据雷达手册给的测距误差来估算方差再乘一个安全系数。第二个细节是IMU初始化的质量。LIO-SAM在启动时要通过静止状态估计IMU零偏和重力方向。如果机器人在启动时有轻微晃动或者系统没有给IMU足够的静止时间就进入运动零偏估计不准预积分误差会一路累积下去。启动流程建议固定几步静止三到五秒、完成初始化、检查IMU零偏估计值是否在合理范围内。第三个细节是地图坐标系和重力轴对齐。LIO-SAM默认把重力方向视为Z轴初始化时会根据IMU重力测量校准姿态。如果你的系统把重力方向设在别的轴上就需要修改相关代码。这个细节在很多人跑自定义数据集时忽然爆发表现为点云地图以奇怪的角度倾斜其实是重力和坐标轴的关系没搞对。5.3 一些提高效率的工作习惯两次跑同样的数据配置和参数完全一致但结果不同先检查随机种子和时间戳处理。用rosbag replay时为了模拟真机行为可以用--clock参数发布仿真时间确保ROS整个图使用同一时间源。我在复现测试中经常忘了这个导致时间戳错乱所有传感器数据对不齐系统性能一个大滑坡。日志信息的输出级别也可以调整。调试阶段把日志级别升到Debug能观察到因子图每个迭代的残差变化和更新节点数这对定位后端优化的异常非常有帮助。稳定运行后调回Info级别减少刷屏。6. 从论文到系统的思考我个人在实际操作中的体会是读完论文只是一个起点真正理解LIO-SAM的是你去复现它、改造它、让它从论文变成能跑的系统。LIO-SAM设计的巧妙之处不在于单个算法模块多新颖而在于把已有的成熟手段精妙组合成了一个整体。激光雷达里程计给出局部精确的相对约束IMU预积分提供高频运动先验和退化场景下的稳定支撑因子图把这些约束统一在一个框架里进行全局优化回环检测则消除长期漂移。每一个环节都不是革命性的但组合在一起的成品达到了让人惊喜的效果。论文可以改进的地方也很明显。回环检测依赖距离搜索在大型场景下效率不理想没有视觉信息纯几何特征在结构重复的环境里会出现误匹配IMU预积分假设噪声特性是高斯白噪声在某些低质量IMU上这一假设并不严格成立。之后基于LIO-SAM延伸出了很多新系统比如加入视觉因子、用学习算法做特征提取等。如果你吃透了这篇论文再去看这些后继工作会发现它们的核心框架大多没有偏离LIO-SAM的因子图思路只是在传感器类型、因子类型、或者异常处理机制上做了增强。最后说一个小技巧在调试LIO-SAM时把回环检测的阈值临时调到很严格观察退化环境下的漂移轨迹能快速暴露IMU和里程计因子的权重是否合理。这个手段我用过很多次比直接看最终轨迹误差更容易定位问题源头。希望这篇总结能让你在LIO-SAM的阅读和复现上少走一些弯路。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。