2. SLAM基础

SLAM(Simultaneous Localization and Mapping)系统的本质,是在未知环境中同时估计机器人自身轨迹与周围环境地图。要构建这样一个估计系统,首先必须建立严谨的数学描述框架:传感器如何产生数据、数据如何在不同坐标系间转换、位姿如何参数化、观测方程如何建模、噪声如何量化。本章作为整个课程的地基,将系统梳理这些核心概念,并重点说明它们如何在因子图框架下被统一表达。

SLAM 数学基础框架 传感器模型 相机 / LiDAR / IMU 内参标定 · 畸变模型 外参(传感器→机体) 坐标系变换 世界系 / 机体系 / 相机系 欧氏变换 SE(3) 齐次坐标 · 链式变换 位姿表示 旋转矩阵 SO(3) 四元数 · 欧拉角 李群 / 李代数 观测模型 重投影 / 深度观测 噪声建模 高斯分布假设 因子图统一表达 变量节点:位姿 x₁…xₙ、路标点 l₁…lₘ 因子节点:运动因子、观测因子、先验因子 非线性优化求解 高斯-牛顿 / LM 算法 残差最小化 · 信息矩阵 · 边缘化 输出:轨迹估计 + 地图估计 最大后验估计(MAP) 传感器数据 → 坐标变换 → 位姿参数化 → 观测建模 → 因子图 → 优化求解

上图展示了本章内容的整体逻辑关系:传感器模型提供原始测量数据,坐标系变换将数据统一到参考框架,位姿表示提供状态量的数学参数化,观测模型建立测量与状态之间的函数关系,最终所有要素汇聚到因子图框架中,通过非线性优化求解。下面逐一展开。

2.1 传感器模型与测量原理

核心原理:SLAM系统依赖多种传感器获取环境信息。不同传感器的物理原理不同,其数学模型也截然不同。视觉相机通过透视投影将三维空间点映射到二维像素平面;LiDAR通过激光测距直接获取三维点云;IMU则测量角速度和加速度。每种传感器都需要建立精确的数学模型,才能将原始测量数据转化为可用于状态估计的信息。

以针孔相机模型为例,其投影过程可描述为:

Z * [u, v, 1]ᵀ = K * [R|t] * [X, Y, Z, 1]ᵀ

其中 K 为内参矩阵(焦距 fx, fy 和主点 cx, cy),[R|t] 为外参(相机在世界坐标系中的位姿),(X, Y, Z) 为空间点在世界系下的坐标,(u, v) 为像素坐标。实际相机还存在镜头畸变,通常用径向畸变(k1, k2, k3)和切向畸变(p1, p2)来建模。

传感器标定流程:

  1. 内参标定:使用棋盘格或圆点标定板,采集多角度图像,通过张正友标定法求解内参和畸变系数。
  2. 外参标定:确定传感器坐标系与机体坐标系(或IMU坐标系)之间的固定变换 T_sensor_body。
  3. 时间同步:多传感器之间需要时间戳对齐,通常采用硬件同步或软件插值方法。
传感器类型测量量数学模型典型噪声
单目相机像素坐标 (u,v)透视投影 + 畸变像素噪声 σ≈1-2px
双目/深度相机深度 Z三角测量 / ToF深度噪声随距离增大
LiDAR三维点 (x,y,z)激光测距 + 扫描距离噪声 σ≈2-5cm
IMU加速度 a、角速度 ω牛顿力学 + 陀螺仪白噪声 + 随机游走
经验提醒:在因子图框架中,传感器模型直接决定了观测因子的数学形式。例如视觉重投影误差是像素坐标差,而LiDAR的ICP误差是三维点距离。建模时必须明确传感器的测量空间,不能混淆。

2.2 坐标系变换与刚体运动

核心原理:SLAM中涉及多个坐标系:世界坐标系(W,固定参考)、机体坐标系(B,随机器人运动)、相机坐标系(C)、IMU坐标系(I)等。坐标系之间的变换属于刚体变换,包含旋转和平移两部分。在三维空间中,刚体变换可用齐次变换矩阵 T ∈ SE(3) 表示:

T = [ R  t ]
    [ 0  1 ]

其中 R ∈ SO(3) 为旋转矩阵,t ∈ R³ 为平移向量。齐次坐标使得变换可以写成矩阵乘法形式,便于链式复合:T_WC = T_WB · T_BC,表示从相机系到世界系的变换。

坐标系变换的操作流程:

  • 明确参考系:每个测量数据必须标注其所在坐标系,例如点云在LiDAR系下,图像在相机系下。
  • 统一到机体系:通过外参 T_sensor_body 将所有传感器数据变换到机体坐标系。
  • 变换到世界系:利用当前位姿估计 T_WB 将机体系数据变换到世界系。
  • 注意变换方向:T_AB 表示从B系到A系的变换,复合时注意下标顺序。
常见误区:初学者容易混淆变换方向。例如 T_WC = T_WB · T_BC 中,T_BC 将点从C系变换到B系,T_WB 再从B系变换到W系。如果写成 T_WC = T_BC · T_WB 则完全错误。建议在代码中统一使用“T_目标系_源系”的命名规范。

2.3 位姿表示:旋转矩阵、四元数与李群李代数

核心原理:位姿表示是SLAM中最核心的数学问题之一。三维旋转有多种表示方式,各有优劣:

表示方式维度优点缺点
旋转矩阵 R9直观、易于复合冗余、需满足正交约束
欧拉角3直观、无冗余万向锁、插值困难
四元数 q4无奇异、紧凑、易插值双覆盖(q 和 -q 等价)
李代数 so(3)3无约束、适合优化需指数/对数映射

李群与李代数的关键作用:在非线性优化中,旋转矩阵 R 受正交约束 RᵀR=I 且 det(R)=1,这使得直接对 R 求导非常困难。李群 SO(3) 的李代数 so(3) 是一个三维向量空间,通过指数映射 exp(φ^) 与 SO(3) 建立联系。这样,优化时可以在无约束的李代数空间中进行增量更新:

R_new = R · exp(δφ^)

其中 δφ ∈ R³ 是微小旋转增量。这种参数化方式避免了约束优化问题,是GTSAM、Ceres等优化库的标准做法。

四元数与旋转矩阵的转换:

  • 四元数 q = (w, x, y, z),满足 w²+x²+y²+z²=1
  • 旋转矩阵 R 可由四元数通过 Rodrigues 公式转换
  • 四元数乘法对应旋转复合:q₁ ⊗ q₂ 表示先旋转 q₂ 再旋转 q₁
  • 注意四元数的双覆盖性:q 和 -q 表示同一旋转,在优化中需保持符号一致性
工程实践建议:在因子图框架中,建议使用四元数作为位姿的存储格式(紧凑、无奇异),但在优化时切换到李代数参数化(无约束、便于求导)。GTSAM中默认使用李代数参数化,内部自动处理指数映射。

2.4 观测模型与噪声建模

核心原理:观测模型描述“状态量 → 测量值”的函数关系。在视觉SLAM中,最常用的是重投影模型:给定路标点在世界系下的坐标 P_w 和相机位姿 T_WC,预测像素坐标:

z_pred = proj(T_WC · P_w)

其中 proj 包含内参投影和畸变校正。实际测量值 z_obs 与预测值之间的差异即为重投影误差:

e = z_obs - z_pred

噪声建模:SLAM通常假设测量噪声服从零均值高斯分布:

z_obs = h(x) + ε,  ε ~ N(0, Σ)

其中 Σ 为测量协方差矩阵。在因子图中,每个观测因子对应一个残差项,其权重由信息矩阵 Ω = Σ⁻¹ 决定。协方差矩阵的准确估计对优化结果影响显著:

  • 视觉重投影:通常假设像素噪声各向同性,Σ = σ²I,σ 取 1-2 像素。
  • LiDAR 配准:噪声与距离相关,需根据传感器手册或经验标定。
  • IMU 预积分:噪声包含白噪声和随机游走两部分,需通过 Allan 方差分析确定。
风险提示:协方差矩阵设置过小(过度信任测量)会导致优化结果震荡;设置过大(过度信任预测)会导致信息利用不足。建议通过实际数据统计残差分布来校准噪声参数,而不是随意设定。

2.5 案例拆解:单目相机观测模型在因子图中的实现

场景背景:假设我们有一个单目相机在室内环境中运动,需要估计相机轨迹和稀疏路标点。相机内参已标定:fx=500, fy=500, cx=320, cy=240,无畸变。我们使用GTSAM构建因子图。

关键参数与初始条件:

  • 相机分辨率:640×480
  • 初始位姿:T_WC₀ = I(原点)
  • 路标点:已知3个特征点的世界坐标
  • 测量噪声:σ = 1.5 像素

因子图构建步骤:

  1. 定义变量节点:位姿节点 Pose3(李代数参数化),路标点节点 Point3。
  2. 添加先验因子:对初始位姿添加先验,约束其接近原点。
  3. 添加观测因子:对每个特征点观测,创建 GenericProjectionFactor,传入相机内参和测量像素坐标。
  4. 设置噪声模型:使用 Diagonal::Sigmas 设置为 [1.5, 1.5](像素坐标两个方向)。
  5. 优化求解:使用 Levenberg-Marquardt 优化器迭代求解。

结果对比:

优化项初始估计优化后真实值
位姿 x (m)0.050.0120.01
位姿 y (m)-0.03-0.008-0.01
路标点1 (m)(1.2, 0.8, 3.0)(1.05, 0.72, 2.95)(1.0, 0.7, 3.0)
平均重投影误差 (px)8.31.2—

复盘经验:优化后重投影误差从8.3像素降至1.2像素,接近理论噪声水平。但需要注意:单目视觉存在尺度不确定性,如果没有其他传感器(如IMU)或已知尺度信息,路标点的尺度无法唯一确定。在实际系统中,通常需要初始化或融合IMU来恢复尺度。

工程要点:在因子图中,观测因子的信息矩阵直接影响优化结果。建议在调试时先固定噪声参数,观察残差分布;如果残差均值不为零,说明模型存在偏差(如外参标定不准),需要先修正模型而非调整噪声。

2.6 常见误区与总结

常见误区梳理:

  • 混淆坐标系:未明确数据所在坐标系,导致变换错误。解决:在代码中为每个变量标注坐标系,使用类型安全的库(如GTSAM的Pose3自带坐标系语义)。
  • 四元数未归一化:优化过程中四元数可能偏离单位范数,导致旋转表示无效。解决:在优化步骤间重新归一化,或使用李代数参数化。
  • 噪声模型过于简化:假设所有测量噪声相同,忽略了传感器特性差异。解决:根据传感器类型和测量距离分别设置协方差。
  • 忽略外参不确定性:外参标定误差会系统性影响所有观测。解决:在标定时充分采集数据,必要时将外参也作为优化变量。
  • 过度信任初始值:非线性优化对初始值敏感,差的初始值可能收敛到局部极小值。解决:使用运动模型或IMU预积分提供较好的初始估计。