
做SLAM的人应该都有过被单传感器坑到怀疑人生的经历纯LiDAR在一条两米宽的走廊里跑着跑着就开始左右横跳点云再多也救不回来纯视觉面对一堵白墙或者突然逆光的窗户特征点直接蒸发轨迹漂得连妈都不认识IMU单拎出来更是离谱多走十秒就开始天旋地转。VIL-SLAM这篇论文的核心贡献就是把双目视觉、IMU、3D LiDAR三种传感器放进同一个因子图优化框架里紧耦合让它们在各自信号最差的时候互相补位。这篇论文全称是“Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping”作者就是做LOAM那个团队所以整篇论文的工程味道非常浓不是花架子而是实打实的硬件上能跑通的融合方案。这篇内容适合三类人一是正在做多传感器融合SLAM、想找一篇完整系统参考的工程师二是准备SLAM面试、需要把“紧耦合”讲清楚的学生三是刚看完《视觉SLAM十四讲》、想从单传感器往多传感器融合进阶的入门者。我会把论文的核心框架、各类残差因子、动态物体剔除、回环检测以及工程落地里的坑全部拆开讲一遍尽可能还原论文中那些容易被一句话带过、但实际非常重要的设计细节。1. 为什么一定要把三种传感器绑在一起1.1 纯激光的退化几何缺失时点云再多也没用先聊纯LiDAR SLAM。LOAM、LIO-SAM这类方案在结构丰富的室外环境里确实很稳但一旦场景退化问题就很明显。最典型的场景是长走廊两边的墙面只能约束位姿的法向方向和绕两个轴的旋转沿走廊方向的位置约束几乎为零。点云配准在数值上表现为信息矩阵接近奇异优化时沿弱约束方向的微小误差会被不断放大轨迹就会开始“飘”。另一个容易忽略的退化场景是开阔广场。地面确实能提供roll和pitch约束但空旷场地上没有足够的几何结构来约束yaw和水平位置激光里程计基本等于靠猜。还有地下停车场这种柱子间距相近、几何自相似的结构点云配准容易落入局部极小值回环检测如果没有视觉参与根本分不清“这是另一个柱子”还是“我又转回来了”。这些问题本质上是几何信息不足不是算法不够努力多加点云分辨率也没用。VIL-SLAM的思路就是既然LiDAR在几何退化时靠不住那就让视觉和IMU在几何约束缺失的方向上继续提供信息。1.2 纯视觉的短板尺度模糊、弱纹理、动态干扰视觉SLAM的问题跟LiDAR正好互补。单目视觉存在尺度不确定问题虽然双目能恢复尺度但双目基线有限远距离深度误差会快速放大暗环境、纯色墙面、玻璃幕墙这些场景又会直接干掉特征点快速运动带来的运动模糊会让帧间匹配彻底失效。更麻烦的是动态物体。路上走过一个行人、旁边开过一辆车特征点如果跟在这些物体上重投影残差就会把位姿朝错误方向拽。VIL-SLAM论文里专门做了一件事利用视觉和LiDAR的深度一致性来检测动态物体然后把动态物体上的LiDAR点从配准中剔除。这个设计很聪明因为纯视觉做动态物体检测需要额外跑语义分割网络而VIL-SLAM完全是靠传感器之间“互相对质”来判断动态元素让视觉帮LiDAR“擦掉”不该参与配准的点。这也是这篇论文里我最欣赏的交叉耦合设计之一。1.3 IMU为什么只能当“辅助”不能当“主力”IMU擅长高频运动预测和提供重力方向约束两帧图像之间的运动变化、短暂遮挡时的位姿外推都能靠IMU撑住。但IMU也有两个致命弱点一是双积分漂移加速度计零偏加上微小的振动噪声积分几秒钟后位置就不可信二是bias必须在线估计而估计bias又需要外部传感器提供绝对参考。所以在整个系统里IMU的角色是“黏合剂”和“短时保险丝”。它负责把视觉和LiDAR的帧间运动串起来在极端情况比如某几帧视觉特征全部丢失下维持状态不散架然后等视觉或者LiDAR重新恢复观测后再把误差拉回来。VIL-SLAM把IMU以预积分因子的形式放进了因子图这就是紧耦合的体现IMU不是单独算一个位姿输出而是直接约束两个关键帧之间的相对运动。1.4 这篇论文到底解决什么问题VIL-SLAM的定位很明确面向挑战环境下的多传感器融合SLAM。它要解决的是“单一传感器在各自退化条件下系统还能不能维持可靠定位”的问题。但注意它不是把三个里程计的结果做一个加权平均而是让三种传感器的原始测量共同约束同一个状态变量。这种“紧耦合”方式带来的优势是信息利用率高、退化时互相补盲代价是实现复杂度直线上升、对外参标定和时间同步极其敏感。论文正文里对这两个工程前提也有明确讨论我后面在第7节会展开讲。2. 系统框架与核心设计思路2.1 紧耦合与松耦合的本质区别很多人在面试里被问“紧耦合和松耦合的区别”我建议直接用VIL-SLAM当例子来回答。松耦合最常见的形式是视觉里程计自己出一个位姿激光里程计自己出一个位姿IMU自己积分出一段运动最后用一个滤波器或优化器把这些位姿结果融合起来。它的好处是实现简单坏处是每个传感器内部已经把误差压缩过一次融合时可用信息量少一个传感器退化时另一个传感器很难补上。紧耦合是在一个统一的优化框架里使用传感器原始测量。VIL-SLAM的因子图中视觉的约束对象是“三维路标点在相机平面的重投影误差”激光的约束对象是“点到局部地图平面的距离”IMU的约束对象是“两个关键帧之间的预积分运动”。三类残差共同决定位姿取值误差不会逐级累积退化时只要还有一类残差有信息状态就不会发散。也正是因为用了原始测量系统才能做“用LiDAR补视觉深度”这种跨传感器操作。2.2 因子图框架三种测量如何变成一张图因子图是理解VIL-SLAM的一把钥匙。先做一个生活化类比想象你用很多根弹簧把一堆小球连接在一起每个小球是一个状态变量某帧的位姿、速度、IMU bias每根弹簧是一次测量IMU预积分、视觉重投影、激光点面距离弹簧拉伸得越厉害对应的残差越大。优化的目标就是移动所有小球的位置让所有弹簧的总弹力最小系统达到平衡。这个平衡位置就是最可能的一组机器人轨迹。VIL-SLAM使用的就是GTSAM这类基于因子图的平滑优化库。每一帧关键帧会创建一个变量节点同时在它跟上一帧之间接上IMU因子视觉路标点对应的重投影测量和LiDAR的point-to-plane测量也被建模成因子节点。当系统运行时间变长因子图的规模会越来越大所以VIL-SLAM引入了滑动窗口的思想只保留最近一段时间的关键帧参与优化把更早的帧固定下来或边缘化掉这样既保持计算量可控又不会丢失历史约束。2.3 坐标系定义与状态向量多传感器融合的第一件事就是把所有传感器放在同一个坐标系里说话。VIL-SLAM里涉及四个坐标系世界系W由初始化时的重力方向确定、IMU系I、相机系C和LiDAR系L。每个状态的变量定义在世界系下相机、LiDAR相对IMU的外参在初始化阶段固定之后在优化中当作常数不更新。状态向量包括机器人当前在世界系下的旋转和平移也就是位姿 T_WI、速度、陀螺仪零偏 b_g、加速度计零偏 b_a。这些变量是所有IMU因子、视觉因子、LiDAR因子共同的优化目标。很多人初看因子图觉得复杂其实就是把所有测量统一成“观测方程 噪声模型 残差函数”三个要素然后丢给优化器。理解了这个框架你会发现VIL-SLAM跟VINS-Mono、LIO-SAM在结构上没有本质区别区别主要在因子类型和跨传感器约束上。2.4 一种容易被忽略的设计用LiDAR补视觉深度这篇论文里非常关键的一个设计是用LiDAR给视觉特征点补深度。对于双目视觉来讲视差可以恢复深度但远距离区域视差只有几个像素甚至亚像素深度误差会暴涨而且弱纹理区域根本匹配不到视差。而LiDAR点云能提供精确深度虽然点很稀疏但可以投影到图像上在邻域内插值。具体做法是把LiDAR点按外参投影到左目图像坐标系里对每个视觉特征点搜索周围的LiDAR投影点用它们的深度信息做插值估计。但LiDAR点在物体边缘处会出现深度断裂比如人站在墙前人的轮廓和墙之间的距离差可能有一米多。如果特征点正好落在这种深度不连续区域用插值得到的深度就是错的重投影残差会被污染。所以论文里专门对深度不连续特征做了判别通过对邻域深度值的离散程度做判断把这类特征从优化中剔除或降低权重。3. 前端测量与关键模块拆解3.1 LiDAR里程计从点到map的特征匹配LiDAR前端延续了LOAM那一套做法通过局部曲率提取边缘点和平面点当前帧的点在预测位姿的引导下跟局部特征图做配准求解位姿增量。这里有一个工程细节值得展开LiDAR点云在每一帧里的时间戳并不一致机械式雷达是逐点扫描的一帧里前几十毫秒扫到的点和后几十毫秒扫到的点对应的机器人位姿已经不同。如果不做去畸变处理直接拿整帧点云当一个刚体去配准高速运动时误差会大得离谱。VIL-SLAM里LiDAR帧的位姿先由IMU预积分和视觉前端给出一个先验然后利用这个先验对每个扫描点做运动补偿把一帧内的点都变换到帧结束时刻的位姿下再参与配准。这个设计和LIO-SAM的deskew思路是一致的。很多入门的朋友不理解“预测位姿质量”为什么重要我可以直接说先验越准去畸变效果越好LiDAR配准的收敛范围就越大反过来如果前面视觉和IMU全崩了LiDAR配准为了弥补运动畸变误差就需要更多迭代性能就会肉眼可见地下降。3.2 视觉前端与深度插值策略双目视觉部分使用KLT光流跟踪特征点同时对关键帧提取新的特征。每个特征点的3D坐标有两种来源一是双目视差三角化二是LiDAR深度插值。论文里的核心策略是优先使用LiDAR深度因为它在远距离和弱纹理区域更可靠当LiDAR深度不可用或处于深度不连续区域时再退回双视觉差。运行时的流程大致是拿当前帧的LiDAR点云投影到左目图像对每个被跟踪特征点做邻域搜索统计邻域内深度值的均值和离散度。如果离散度低于阈值说明该点处于平滑表面区域深度插值可信就直接生成3D路标点如果离散度高就把特征标记为深度不可靠仅保留视觉重投影残差或直接略过。这套机制听起来简单但真的把LiDAR视觉融合真正做到位了而不是简单地把两个里程计结果平均。3.3 动态物体剔除视觉如何帮LiDAR“擦眼睛”动态物体剔除是VIL-SLAM里我最想单独开一节讲的内容。原理不复杂如果某个视觉特征原本和它周围的LiDAR深度是吻合的但连续几帧里它的重投影残差和深度插值结果越来越不一致说明这个特征很可能落在一个独立运动的物体上。把这些特征的投影位置累加起来就能在图像平面上画出一片“动态区域掩膜”。接下来把这层掩膜投影到LiDAR点云上凡是落在这个区域里的LiDAR点都不参与point-to-plane配准。这样做的效果是行人和车辆从点云配准中消失LiDAR里程计不再被动态物体带偏。而且这套方法完全不需要语义分割网络也不需要训练数据纯粹依靠传感器的几何一致性就能发现问题对部署场景的泛化能力很强。我在实际工作中用类似思路处理过高架桥下的车流环境效果远比直接跑所有点做配准稳定唯一的代价是动态物体多时参与配准的点变少对静态结构的依赖变高。3.4 预处理链路与时间同步对齐融合系统的工程实现里预处理链路的复杂程度往往远超后端优化。传感器数据要先做时间插值把不同频率LiDAR常见10Hz、相机常见20-30Hz、IMU常见200Hz以上的测量对齐到同一时间基准然后做运动补偿和标定校正最后才进入各自的测量模型。VIL-SLAM论文里虽然没有铺开讲时间同步的代码细节但这类系统的实际经验是时间同步误差超过20-30毫秒紧耦合优化就很难收敛到高精度。IMU和视觉之间差几个毫秒都可以通过camera-imu时间偏移在线估计来校准LiDAR和相机之间时间差太多就只能靠硬件同步解决了。4. 状态估计与后端优化4.1 IMU预积分与运动模型IMU是系统里频率最高的传感器也承担着关键帧之间运动约束的核心功能。直接对IMU测量做数值积分来约束两个关键帧会在优化过程中产生一个麻烦每次优化更新了关键帧位姿积分结果就要重新计算一遍计算量严重浪费。预积分的做法是在两个关键帧之间先把IMU测得旋转、速度变化、位移变化等做一次积分得到一个与当前估计位姿无关的相对测量量然后把残差写成“相对测量”和“由两个关键帧状态推导出的相对量”之差。预积分残差的雅可比形式很好推导只是符号长度非常长面试时能把预积分公式推导流畅讲清楚的候选者通常会被加分。你如果现在还在啃公式建议对照VINS-Mono的代码一起看GTSAM里也内置了PreintegratedImuMeasurements类VIL-SLAM的后端就是基于这套东西搭建的。理解预积分的关键是用“相对量”的思路替代“绝对量”IMU只关心“我这个高频周期内到底运动了多少”至于起点在哪、终点在哪都是由优化中的两个关键帧状态描述的。4.2 三类残差因子的构造后端优化里同时有IMU因子、视觉因子和LiDAR因子我把每个因子的残差构造逻辑列出来视觉重投影因子假设第j个路标点在第i帧有观测z_ij残差就是“按当前相机位姿把3D点投影到图像平面的坐标”与“实际观测到的像素坐标”之差。优化时相机位姿和路标点坐标都会被调整来压低这个差值。LiDAR配准因子当前帧的某个特征点通常是平面点或边缘点在预测位姿变换到局部地图后去地图里找最近邻的平面拟合残差取点到平面的距离。它本质上是几何测量提供的是“当前帧相对局部地图位姿”的约束。IMU预积分因子上面已经讲了残差是预积分测量与两个相邻关键帧状态推导出的相对运动之差同时包含对bias的优化项。这三类残差放进一张因子图里通过非线性最小二乘迭代求解每次迭代都要重新线性化再解一个稀疏线性系统。实现时常用的优化库是GTSAM和CeresVIL-SLAM选择了GTSAM原因很简单因子图表达自然、自带增量平滑功能、支持滑动窗口和边缘化。4.3 初始化和边缘化的作用初始化是这类系统的隐形门槛。系统启动时不知道重力方向、不知道IMU零偏、不知道初始位姿如果一上来就做紧耦合优化很容易发散。VIL-SLAM的初始化过程大致是先让系统在启动阶段做短暂静置用加速度计估计重力矢量用视觉和LiDAR给出的帧间运动观察足够多帧后估计初始速度、陀螺零偏和加速度零偏再开始正式优化。很多工程问题都出现在初始化阶段比如静置时间不够导致的重力方向偏差会一路影响整个轨迹的姿态精度。边缘化则是控制计算量的关键机制。滑动窗口为了把变量数量限制在固定范围不能再让所有历史状态参与优化。处理方式是把被移出窗口的变量通过Schur补把它们的约束信息“折叠”到相邻变量上作为先验因子保留。这样历史信息不会直接丢失新窗口里又不用重复优化旧变量。用过VINS-Mono的人对边缘化一定不陌生它最大的坑是线性化点在优化中不断更新旧信息和新信息如果不一致容易导致系统不稳定实际工程中需要非常小心地设置合理化的先验权重。5. 回环检测与全局建图5.1 视觉词袋回环先找到“我来过这里”VIL-SLAM的回环检测以视觉为主。视觉特征描述子训练成词袋比如DBoW2当前关键帧的特征向量跟历史关键帧做检索找到外观最相似的若干候选帧。视觉回环最大的优势是召回率高在相同场景里就算视角变化很大描述子依然有一定鲁棒性。但缺点是会产生感知歧义比如停车场里所有车位看起来几乎一样或者两栋外观相近的建筑词袋检索很容易报出假回环。回环候选不能直接用论文的流程是把候选帧提交给LiDAR几何验证。视觉负责“觉得我来过这里”LiDAR负责“用几何证据确认我来过这里”两者责任分工明确。这种做法其实在现代多传感器SLAM系统里非常常见纯粹靠单模态触发回环都有各自盲区视觉几何验证的组合才可靠。5.2 LiDAR细化几何回环位姿的精细对齐拿到回环候选后LiDAR部分会把当前帧点云和候选帧附近的局部地图做一次ICP或NDT配准得到精对齐的相对位姿。若配准得分高则认为这是一个有效回环因子加入因子图若配准失败或得分过低就拒绝这个候选。这一步既验证了回环真伪又提供了一个比视觉词袋结果精确得多的回环约束保证全局优化后轨迹的闭环误差能被明显拉小。自相似环境中视觉可能给出多个相似候选LiDAR几何验证能迅速剔除大部分假阳性。实际测试中我用过纯视觉回环和加入激光验证的回环前者偶尔出现“把相似但不同的位置闭环”的情况后者几乎没有误回环稳定性高很多。5.3 全局一致性建图的收益后端优化持续输出全局一致的位姿LIDAR点云再根据优化后的位姿变换到世界坐标系累积成全局地图。这一步骤的价值不只是“好看”下游的路径规划、导航、避障都需要一致性好的地图。而纯激光建图在退化环境里会产生重影或者不对齐的墙面有了视觉和IMU提供的约束几何退化区域的点云也能被拉回到正确位置。做完全局优化后地图里重叠区域的误差会被重新分配整体地图的精度和可用性都会有明显提升。6. 实验评测与论文结果解读6.1 KITTI基准上的对比结论论文在KITTI数据集上做了一组很完整的消融实验对比了不同传感器组合下的定位精度。单个LiDAR在多数城市道路序列上表现不错但在部分几何结构较弱的区域比如开阔路段、大片的草地或路面区域会出现误差累积双目视觉LiDAR的组合能明显改善长走廊和开阔场景的问题再加IMU之后高速转弯和振动较大时的轨迹稳定性又会好一截。从结果趋势看多传感器融合带来的提升不是简单叠加而是在不同退化场景下互相补短板。6.2 自采数据退化场景和动态场景的表现论文还采集了自有的挑战性数据结果我印象最深的两个点一是视觉退化暗光、纹理缺失但激光几何仍存在时融合系统可以稳定运行纯视觉则会快速丢定位二是反过来激光退化长走廊、几何相似但视觉特征足够时系统也能通过视觉特征保持不偏航。动态场景下开启动态物体剔除后定位误差显著下降——如果动态点不加筛选地参与配准轨迹波动会非常明显。6.3 三个容易被忽略的工程结论第一时间同步和外参精度的影响甚至大于优化内部调参。第二紧耦合带来的鲁棒性提升主要是“退化恢复能力”就是某一传感器失效期间位姿漂移可控恢复观测后能快速拉回正确轨迹。第三滑窗长度、关键帧间隔、LiDAR配准残差的信息权重这些超参在真实传感器配置里的最优值跟仿真里差很多必须真机调试才能定下来。7. 工程落地避坑指南7.1 外参标定不准融合全白搭老生常谈但必须强调LiDAR和IMU的外参、相机和IMU的外参、LiDAR和相机的外参任何一个标定误差偏大紧耦合系统都会在不该发散的时候发散。这就像人两个眼睛的瞳距测错了看出去的世界都是虚的。常用的标定工具有Kalibr相机-IMU内参和外参、lidar_camera_calib这类LiDAR-相机标定工具、以及可以直接做LiDAR-IMU标定的开源方案。标定时的操作要点是让设备做充分的旋转激励尽量覆盖各个轴避免匀速旋转否则某些参数不可观。7.2 时间同步问题的检查顺序发现融合系统性能异常时我一般按这个顺序排查时间问题先确认每个传感器话题的时间戳是否来自同一时基再做延迟统计看各话题的平均延迟是否稳定然后用一个简单的静止实验检查多传感器残差是否在合理范围内。每次都有人忽略话题时间戳的来源比如直接用驱动默认的系统时间而不是硬件触发的精确时间这在视觉和LiDAR之间会引入随机延迟问题是间歇性出现的非常难排查。排查步骤常见症状检查方式时间戳时基不统一静止时融合轨迹仍漂移对比各话题时间戳与系统时间差传感器驱动延迟大高速运动时残差突然增大统计话题节流观察平均延迟外参未正确配置点云投影到图像有明显错位可视化点云叠加图像检查LiDAR去畸变失效运动时建图出现重影录制快速转动bag检查点云是否散乱7.3 从仿真验证到真机部署的路线建议不少人一上手就直接搭真机踩完硬件坑才发现算法理解还不够。我更推荐这条路线先用《视觉SLAM十四讲》和KITTI数据集把基础概念夯实然后用ROS2加Gazebo加上仿真LiDAR把整个流程跑通再用真机采集的bag去回放调试最后才上真机实时运行。仿真环境的好处是能自由生成退化场景比如一条长走廊模型就能验证系统在激光退化时的表现。等你把融合系统的数据流、优化频率、残差分布都看明白了再上真机问题定位会快得多。7.4 面试与深入学习时怎么高效用这篇论文SLAM面试里“多传感器融合”几乎是必考点。VIL-SLAM是很好的引子可以串起预积分推导、因子图构造、残差的雅可比、边缘化原理、退化检测、外参标定、时间同步这一整条知识链。被人问到“紧耦合和松耦合区别”时用这篇论文的因子图框架讲一遍比背十句定义更有说服力。学习路线建议是先看懂系统框图再亲手推一遍三类残差的表达式最后对照VINS-Mono和LIO-SAM的代码理解因子图库怎么用这样整套知识就是活的了。我在实际做融合系统时最大的体会是VIL-SLAM这类系统的精度天花板往往不是后端优化能力而是前面那些“不性感”的工程环节——标定是否精确、时间戳是否可靠、动态物体是否处理干净。论文里用一小段讲完的动态物体剔除放到真实场景里可能比换任何优化器都见效快。如果你正打算做多传感器融合先把这几个基本功打扎实再慢慢扣因子图的细节路径会顺畅得多。