单一传感器做SLAM总有各自的短板。相机在暗处和纹理缺失区域不好使,激光雷达在长走廊和开阔场地精度差,IMU有漂移但短时间精度高。把这些传感器组合起来,让它们的优缺点互补,是SLAM走向实用的必然选择。多传感器融合SLAM已经是自动驾驶和高端机器人的标配。

融合的核心难点不是"把数据拼在一起",而是不同传感器的数据在时间、空间和精度上都对不齐。相机30fps,激光雷达10fps,IMU 200Hz,帧率不一样。相机有畸变,激光雷达有运动畸变,时间戳不完全同步。视觉的深度信息不准确,激光的反射率信息和视觉无关。怎么把这些异构数据融合到一起,是融合SLAM的核心问题。

视觉+IMU融合(VIO)

视觉惯性里程计(Visual-Inertial Odometry,VIO)是目前最成熟的多传感器融合方案。相机提供丰富的环境信息和全局一致性,IMU提供高频的运动估计和尺度信息。两者融合后,互补效果很好。

VIO有两种主流架构:滤波方案和图优化方案。MSCKF(Multi-State Constraint Kalman Filter)是滤波方案的代表,用扩展卡尔曼滤波融合视觉和IMU数据。VINS-Mono是图优化方案的代表,用滑动窗口优化最近N帧的视觉特征和IMU预积分约束。

# VIO的状态向量
# 包含位姿、速度、IMU偏置
state = {
    'pose': SE3(),          # 相机位姿
    'velocity': vec3(),     # 线速度
    'gyro_bias': vec3(),    # 陀螺仪偏置
    'accel_bias': vec3(),   # 加速度计偏置
}
# IMU预积分给出帧间约束
# 视觉特征给出观测约束

IMU预积分是VIO中的关键技术。它把两帧之间的所有IMU测量值积分成一个相对运动约束,避免了每次状态更新都要重新积分的问题。Forster等人在2015年提出的预积分理论让VIO的效率大幅提升,现在几乎所有VIO系统都用这个方案。

激光+IMU融合(LIO)

激光惯性里程计(Lidar-Inertial Odometry,LIO)在自动驾驶领域应用广泛。激光雷达提供精确的3D结构信息,IMU提供高频运动估计和去畸变能力。

LOAM系列是最早的LIO方案之一。它用IMU的高频数据做运动补偿(去除激光雷达扫描过程中的运动畸变),然后用特征点ICP做帧间匹配。IMU的作用是辅助性的,主要解决运动畸变问题。

LIO-SAM是更系统的融合方案。它用IMU预积分给出帧间约束,用激光配准给出观测约束,两者放在因子图中一起优化。这种紧耦合的方式比LOAM的松耦合更精确,特别是运动剧烈的场景下优势明显。

# LIO-SAM的因子图结构
graph = FactorGraph()
# IMU预积分因子
graph.add_imu_factor(prev_state, curr_state, imu_data)
# 激光配准因子
graph.add_lidar_factor(prev_scan, curr_scan, ndt_result)
# GPS因子(如果有的话)
if gps_available:
    graph.add_gps_factor(curr_state, gps_position)

FAST-LIO是另一种高效LIO方案。它用迭代卡尔曼滤波(IEKF)融合激光和IMU,不需要显式的点云配准步骤。IEKF直接用点到面残差更新状态,计算速度很快,在嵌入式设备上也能实时运行。

视觉+激光+IMU三融合

三种传感器一起用,是目前最全面的SLAM配置。R3LIVE和LIO-SAM+Camera是这个方向的代表工作。

三融合的优势在于覆盖了更多场景。激光雷达在开阔场地和长走廊不好使的时候,视觉可以提供补充。视觉在暗处和纹理缺失区域不好使的时候,激光雷达可以提供稳定的3D结构。IMU在任何情况下都能提供短时间的高精度运动估计,作为"兜底"。

实际实现中,三融合通常用因子图框架。每种传感器对应一种或多种因子,所有因子放在同一个优化问题中求解。因子图的好处是灵活性高,想加什么因子就加什么因子,不需要改整体架构。

# 三融合因子图的典型结构
graph = FactorGraph()
graph.add_imu_factors(imu_preintegration)      # IMU因子
graph.add_visual_factors(feature_observations) # 视觉因子
graph.add_lidar_factors(scan_matching)         # 激光因子
graph.add_loop_closure_factors(loop_edges)     # 回环因子
graph.add_gps_factors(gps_measurements)        # GPS因子

时间同步和标定——工程上的硬仗

多传感器融合在理论上很美好,但在工程上有很多"脏活累活"要做。时间同步和外参标定是两个最大的工程挑战。

时间同步指的是不同传感器的数据要在同一个时间基准下对齐。IMU 200Hz的数据要插值到相机或激光雷达的时间戳上。如果时间对齐差了哪怕几毫秒,高速运动时位姿估计就会出错。硬件同步(用同一个时钟触发所有传感器)是最佳方案,但不是所有硬件都支持。软件同步(用时间戳对齐+插值)是退而求其次的做法。

外参标定指的是不同传感器之间的相对位姿要知道。相机和激光雷达的相对位置和朝向、IMU和相机的相对位置和朝向,这些外参如果不准,融合效果会大打折扣。离线标定(用标定板或标定场景)是常用方法,在线自标定(在SLAM运行过程中估计外参)也在一些系统中支持。

面试官问起时间同步和标定时,要能说出具体做法和注意事项,这是区分"会用"和"真正理解"的关键点。

面试追问环节

面试官:松耦合和紧耦合有什么区别?

松耦合是各传感器独立处理,最后把结果融合。比如视觉单独跑一个里程计,IMU单独跑一个积分器,最后用卡尔曼滤波把两个轨迹融合。紧耦合是把所有传感器的原始数据放到同一个优化问题中。比如VINS-Mono把视觉特征和IMU预积分放在一起优化。紧耦合精度更高,因为能充分利用传感器间的相关性。但实现复杂度也更高。

面试官:IMU预积分解决了什么问题?

传统的EKF方案中,每次状态更新都要用当前估计的状态重新积分IMU数据,计算量很大。IMU预积分把两帧之间的IMU数据积分成一个相对运动增量,这个增量和状态无关,只和IMU测量值有关。状态更新时不需要重新积分,只需要用更新后的偏置做一阶修正。这样计算量从O(N^2)降到O(1),N是IMU测量次数。

面试官:FAST-LIO为什么这么快?

FAST-LIO用迭代卡尔曼滤波而不是优化方法。IEKF的状态向量只包含当前帧的状态(位姿、速度、偏置),不需要维护历史帧。每次更新只需要一次矩阵求逆,矩阵大小是状态维度(约15维),计算量很小。而且FAST-LIO直接用ikd-tree做点到面搜索,不需要显式提取特征点,省去了特征提取的时间。

面试官:多传感器融合时怎么设权重?

每种传感器的权重由其噪声特性决定。IMU的噪声模型通常从数据手册或Allan方差分析中获取。视觉特征的噪声取决于特征检测的精度(通常1-2个像素)。激光配准的噪声取决于配准算法和场景结构。在因子图框架中,噪声用信息矩阵表示,信息矩阵越大权重越大。如果不确定具体数值,可以通过实验调参,看不同权重下轨迹精度的变化。

面试官:什么时候需要三融合,什么时候双融合就够了?

取决于场景。室内服务机器人用视觉+IMU(VIO)就够了,激光雷达太贵太大。自动驾驶必须用激光+IMU(LIO),因为高速公路等场景视觉不好使。如果要在室内外切换、全天候运行,三融合更可靠。成本也是一个考量——三融合的硬件成本和标定成本都更高,小项目不一定值得投入。


多传感器融合SLAM是当前SLAM技术的主流方向。视觉+IMU适合轻量级应用,激光+IMU适合自动驾驶和大型机器人,三融合是最全面的方案。选择哪种组合,要根据场景需求、硬件条件和预算来决定。

融合的关键不只是算法,还有工程——时间同步、外参标定、系统调试。一个好的融合SLAM系统,算法只占三分,工程要占七分。

上一篇:第260篇 重定位技术——机器人在已知地图中重新定位 

下一篇我们聊语义SLAM,看看怎么给地图加上"这是什么"的标签。

如果这篇文章对你有帮助,欢迎点赞支持一下,你的鼓励是我持续更新的动力!

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐