4、SLAM中的因子图建模:运动因子、观测因子、先验因子、闭环因子,以及如何将SLAM问题转化为因子图

SLAM(同步定位与地图构建)问题的本质,是在未知环境中,根据传感器观测数据,同时估计机器人自身轨迹(位姿序列)和环境特征(路标点)的过程。传统上,SLAM被建模为扩展卡尔曼滤波(EKF)或粒子滤波(PF)问题,但这些方法在非线性、非高斯噪声和大规模场景下存在线性化误差大、计算复杂度高、难以处理多源信息融合等局限。因子图(Factor Graph)作为一种概率图模型,将SLAM问题转化为一个图优化问题,通过最大化后验概率(MAP)来求解最优状态估计。本章将深入剖析因子图的四大核心因子——运动因子、观测因子、先验因子、闭环因子,并系统阐述如何将SLAM问题完整地转化为因子图模型。

SLAM因子图建模核心框架 X₁ X₂ X₃ X₄ L₁ L₂ L₃ 先验因子 运动因子 运动因子 运动因子 观测因子 观测因子 观测因子 闭环因子 图例 变量节点(位姿/路标) 因子节点(约束) 图:SLAM因子图模型——变量节点与因子节点的连接关系

因子图是一种二分图,由两类节点组成:变量节点(表示待估计的状态量,如机器人位姿、路标位置)和因子节点(表示变量之间的概率约束关系)。在SLAM中,每个因子对应一个测量方程或先验信息,其数学形式为 f_i(X_i) ∝ exp(-½‖e_i(X_i)‖²_Σ),其中 e_i 为残差,Σ 为噪声协方差矩阵。整个SLAM问题的MAP估计等价于求解所有因子乘积的最大值,即 X* = argmax Π f_i(X_i)。取负对数后,该问题转化为最小二乘优化:X* = argmin Σ ‖e_i(X_i)‖²_Σ。这一转化是因子图SLAM的核心思想,它将概率推理问题转化为数值优化问题,使得我们可以利用成熟的非线性最小二乘求解器(如G2O、GTSAM、Ceres)高效求解。

4.1 运动因子:描述位姿间的时间连续性

核心原理:运动因子(Motion Factor)建模机器人相邻时刻位姿之间的相对运动约束,来源于里程计(轮式编码器)、IMU预积分或视觉/激光帧间匹配。其数学形式为:f_motion(X_k, X_{k+1}) ∝ exp(-½‖T_{k+1} ⊖ T_k - ΔT_k‖²_Σ_motion),其中 T_k 为SE(3)位姿,ΔT_k 为运动测量增量,⊖ 表示SE(3)上的相对变换。运动因子将时间上相邻的位姿节点连接起来,形成一条“链式”结构,是因子图SLAM中最基本的约束。

判断方法与操作流程:在实际建模中,运动因子的构建需要遵循以下步骤:

  1. 数据预处理:对里程计或IMU原始数据进行时间戳对齐和坐标系转换,消除尺度漂移和零偏。
  2. 相对运动计算:计算相邻时刻的位姿增量 ΔT_k = T_k^{-1} · T_{k+1},并估计其协方差矩阵 Σ_motion(通常由传感器噪声模型给出)。
  3. 因子添加:在因子图中添加运动因子节点,连接 X_k 和 X_{k+1},残差定义为 e = Log(T_{k+1} ⊖ T_k ⊖ ΔT_k),其中 Log 为SE(3)到李代数 se(3) 的映射。
  4. 鲁棒核函数:为应对里程计打滑或IMU漂移等异常,通常为运动因子添加Huber核或Cauchy核,降低外点影响。

实战场景:以轮式机器人搭载2D激光雷达为例,假设机器人以0.5m/s速度行驶,里程计频率为10Hz。在走廊场景中,里程计测量噪声较小(标准差约0.02m),但在转弯处由于轮子打滑,噪声增大至0.1m。此时,若仅依赖运动因子,轨迹会逐渐漂移。正确的做法是:在转弯处增大运动因子的协方差(即降低权重),同时依赖后续的观测因子和闭环因子来修正漂移。这一策略在GTSAM中可通过动态调整噪声模型实现。

常见误区:初学者常将运动因子视为“可靠”的约束,忽略其噪声协方差的估计。实际上,运动因子的协方差直接影响优化结果的权重分配——协方差过小会导致轨迹被“锁死”在里程计轨迹上,无法被观测因子修正;协方差过大则会使轨迹过于自由,优化不稳定。建议通过传感器标定和 Allan 方差分析获取合理的噪声参数。

4.2 观测因子:连接位姿与路标

核心原理:观测因子(Observation Factor)建模机器人位姿对路标点的观测约束,来源于相机(视觉特征点)、激光雷达(几何特征)或声呐等传感器。其通用形式为:f_obs(X_k, L_j) ∝ exp(-½‖h(X_k, L_j) - z_{kj}‖²_Σ_obs),其中 h 为观测模型(如针孔相机投影模型、激光束测距模型),z_{kj} 为实际观测值。观测因子是连接位姿节点和路标节点的“桥梁”,是SLAM中信息量最丰富的约束。

操作流程:构建观测因子的关键步骤包括:

  • 特征提取与匹配:从传感器数据中提取可重复观测的特征(如ORB特征点、平面特征),并在不同帧之间进行数据关联。
  • 观测模型定义:根据传感器物理原理定义观测函数 h。例如,视觉观测模型为 u = K·(R·L + t),其中 K 为内参矩阵,R,t 为相机位姿。
  • 协方差设定:根据特征提取精度和传感器噪声设定 Σ_obs。通常像素噪声为1-2像素,激光测距噪声为0.01-0.05m。
  • 外点剔除:通过卡方检验或RANSAC剔除错误匹配,避免错误观测因子污染优化结果。
传感器类型观测模型 h(X,L)典型噪声适用场景
单目相机透视投影:u = K·(R·L+t)1-2像素室内/室外视觉SLAM
双目相机三角化深度 + 投影0.5-1像素深度估计更稳定
2D激光雷达极坐标:ρ = ‖L - t‖, θ = atan20.01-0.03m结构化环境
3D激光雷达点云配准残差0.02-0.05m室外大场景

经验提醒:在视觉SLAM中,观测因子的数据关联是最大的难点。当场景中存在重复纹理或动态物体时,错误的特征匹配会产生“虚假观测因子”,严重扭曲优化结果。建议在添加观测因子前,使用互匹配(cross-check)和比率测试(ratio test)筛选特征点,并定期进行滑动窗口内的局部Bundle Adjustment以验证一致性。

4.3 先验因子:提供全局参考基准

核心原理:先验因子(Prior Factor)为变量节点提供参考,解决SLAM问题的不可观性。由于因子图优化只依赖相对约束,整个轨迹可以整体平移或旋转而不改变残差,因此需要至少一个先验因子来固定全局坐标系。其形式为:f_prior(X_0) ∝ exp(-½‖X_0 - X_prior‖²_Σ_prior),通常添加在第一个位姿节点上,也可为路标提供先验(如GPS测量)。

操作流程:先验因子的设置需注意以下要点:

  1. 固定第一个位姿:将 X_0 的先验协方差设为极小值(如 1e-9),相当于固定世界坐标系原点。
  2. GPS/磁力计融合:当有GPS信号时,可在对应位姿节点上添加先验因子,约束其位置,抑制长时间漂移。
  3. 路标先验:若已知某些路标的坐标(如信标),可为其添加先验因子,加速优化收敛。

案例拆解:在室外无人机SLAM中,GPS信号在树荫下会短暂丢失。此时,若仅依赖运动因子和观测因子,轨迹会在GPS丢失期间漂移。解决方案是:在GPS信号正常时,以较低频率(如1Hz)添加GPS先验因子,协方差设为5m;当GPS丢失时,自动移除这些先验因子,依靠视觉/惯性观测因子维持短时精度。这一策略在GTSAM中可通过动态因子图(iSAM2)实现,无需重新构建整个图。

常见误区:先验因子并非越多越好。过多的先验约束(尤其是协方差设置不合理时)会“拉偏”优化结果,使轨迹偏离真实值。例如,若GPS先验的协方差设为1m,而实际GPS误差为5m,则优化结果会被GPS“带偏”。建议根据传感器精度动态调整先验协方差,并在优化后检查残差分布以验证先验的合理性。

4.4 闭环因子:消除累积漂移

核心原理:闭环因子(Loop Closure Factor)是SLAM中最重要的全局约束,它建模机器人回到曾经访问过的位置时产生的位姿-位姿约束。当检测到闭环时,在因子图中添加连接当前位姿 X_k 和历史位姿 X_m 的因子:f_loop(X_k, X_m) ∝ exp(-½‖X_k ⊖ X_m - ΔT_loop‖²_Σ_loop),其中 ΔT_loop 通过闭环检测算法(如视觉词袋、ICP配准)计算。闭环因子将“链式”结构变为“图”结构,使误差能够全局传播,从而消除累积漂移。

操作流程:闭环因子的添加需要严格的验证流程:

  • 候选检测:使用外观描述子(如DBoW2词袋)或几何匹配(如Scan Context)快速检索历史关键帧,生成闭环候选。
  • 几何验证:对候选帧进行特征匹配或点云配准,计算相对位姿 ΔT_loop,并评估配准得分。
  • 一致性检查:通过时间一致性(连续多帧验证)和空间一致性(闭环位姿与当前估计的差异小于阈值)过滤误检。
  • 因子添加与优化:确认闭环后,添加闭环因子并触发全局优化(或iSAM2增量更新)。
闭环检测方法原理优点缺点
视觉词袋(DBoW2)局部特征聚类为视觉词汇召回率高,实时性好对光照变化敏感
Scan Context点云投影为鸟瞰图描述子对视角变化鲁棒计算量较大
ICP配准迭代最近点求解相对位姿精度高需要良好的初始值

实战案例:在一个100m×80m的室内仓库环境中,机器人绕行一圈后回到起点。由于里程计漂移,估计轨迹的终点与起点偏差达3.2m。通过激光点云Scan Context检测到闭环,ICP配准得到 ΔT_loop 的平移分量为(2.8m, 1.5m, 0.2m)。添加闭环因子后,执行全局优化(使用GTSAM的Levenberg-Marquardt求解器),轨迹终点与起点的偏差降至0.15m。值得注意的是,闭环因子的协方差设为0.05m,过小会导致局部变形,过大则修正不足。经过多次试验,0.1m的协方差在精度和鲁棒性之间取得了最佳平衡。

风险提示:错误的闭环检测(假阳性)会引入错误的约束,导致整个地图“撕裂”。因此,闭环因子的添加必须经过严格的验证。建议在添加闭环因子前,先进行“闭环候选的局部优化”——仅优化闭环附近的位姿子图,若优化后残差显著增大,则拒绝该闭环。这一策略能有效避免假阳性闭环对全局地图的破坏。

4.5 从SLAM问题到因子图的完整转化流程

核心原理:将SLAM问题转化为因子图,本质上是将“状态估计”问题重新表述为“图优化”问题。这一转化过程遵循“变量-因子-优化”的三步范式,其核心在于明确哪些量是待估计的变量,哪些量是提供约束的测量。

操作流程:完整的转化流程如下:

  1. 定义变量节点:将机器人位姿序列 X = {X_0, X_1, ..., X_N} 和路标集合 L = {L_1, L_2, ..., L_M} 作为变量节点。位姿节点通常以固定频率(如10Hz)或关键帧方式选取,路标节点为地图中的特征点。
  2. 添加先验因子:在 X_0 上添加先验因子,固定世界坐标系。若存在GPS或信标,在对应节点上添加额外先验。
  3. 添加运动因子:对每个相邻位姿对 (X_k, X_{k+1}),根据里程计/IMU测量添加运动因子。
  4. 添加观测因子:对每个位姿 X_k 观测到的路标 L_j,根据传感器测量添加观测因子。
  5. 添加闭环因子:当检测到闭环时,在 X_k 和 X_m 之间添加闭环因子。
  6. 构建目标函数:将所有因子的负对数求和,得到非线性最小二乘目标函数 F(X) = Σ‖e_i‖²_Σ。
  7. 求解优化:使用Gauss-Newton、Levenberg-Marquardt或Dogleg方法迭代求解,得到最优状态估计。

案例拆解:以ORB-SLAM3为例,其因子图包含:① 先验因子(IMU初始化后的重力方向);② 运动因子(IMU预积分);③ 观测因子(视觉特征点重投影);④ 闭环因子(词袋检测+几何验证)。在EuRoC数据集MH_05上,该系统的轨迹精度达到RMSE 0.08m,而纯视觉里程计(无闭环)的RMSE为0.35m。这一对比充分说明了因子图建模中各类因子协同作用的重要性。

总结复盘:因子图建模的核心优势在于其模块化和可扩展性。新增传感器(如GPS、轮速计)只需添加新的因子类型,无需改变整体框架;新增约束(如闭环)只需在图中添加边,即可触发全局优化。这种灵活性使得因子图成为现代SLAM系统的主流建模工具。在实际工程中,建议使用GTSAM或g2o等成熟库,它们提供了丰富的因子类型和高效的增量求解器(如iSAM2),能够满足实时性要求。

常见误区:初学者容易将所有测量都建模为因子,导致因子图规模过大、优化效率低下。实际上,应通过关键帧提取、特征点筛选、滑动窗口等策略控制因子图规模。例如,在视觉SLAM中,每帧图像可能提取500个特征点,但只需保留其中信息量最大的100个用于因子图构建。此外,因子图的稀疏性至关重要——稠密的因子图会导致求解器效率急剧下降,因此应尽量保持因子图的稀疏结构。