SLAM 与融合定位:方法、架构与工程实现
本页聚焦定位主算法链路,从地图构建与定位(SLAM)到多源融合的工程实现。
1. SLAM 问题定义
SLAM(Simultaneous Localization and Mapping)同时解决定位(我在哪?)和建图(环境是什么样?)两个相互依赖的问题。
状态空间:
贝叶斯框架:
其中 \(\mathbf{m}\) 为地图,\(\mathbf{z}\) 为观测,\(\mathbf{u}\) 为控制输入(IMU)。
2. 激光 SLAM
2.1 点云配准原理
激光 SLAM 的核心是点云配准——寻找两帧点云之间的变换矩阵 \(T\),使重叠区域的点尽量重合。
ICP(Iterative Closest Point):
迭代步骤: 1. 为源点云 \(Q\) 中每个点找最近邻 \(P\) 中的点 2. 最小化点对距离求解变换 \(T\) 3. 应用变换,重复直到收敛
NDT(Normal Distribution Transform):
将目标点云划分为体素格,每个格内建立高斯分布;用最大化目标点在分布中的概率来估计变换:
NDT 对点云噪声更鲁棒,在自动驾驶定位中广泛使用。
2.2 主流激光 SLAM 系统
| 系统 | 特点 | 典型应用 |
|---|---|---|
| LOAM | 边特征+面特征,实时性好 | 早期 L4 系统 |
| LeGO-LOAM | 轻量化 LOAM,地面分割 | 低功耗平台 |
| LIO-SAM | 紧耦合 LiDAR-IMU,因子图后端 | 城区复杂场景 |
| HDL Graph SLAM | 图优化,多闭环检测 | 建图 |
3. 视觉 SLAM
3.1 特征法视觉 SLAM(ORB-SLAM 系列)
流程:
图像帧
│
├─ 1. 提取 ORB 特征点(角点 + 二进制描述子)
├─ 2. 特征匹配(Hamming 距离)
├─ 3. 估计相机运动(PnP 求解 + RANSAC)
├─ 4. 三角化新路标点
├─ 5. 局部 BA(Bundle Adjustment)优化
└─ 6. 回环检测(DBoW2)+ 全局优化
优缺点:
| 优点 | 缺点 |
|---|---|
| 特征稳定,对光照变化有一定鲁棒性 | 纹理缺乏场景退化(白墙、夜间) |
| 绝对尺度可由立体视觉或 RGBD 获取 | 单目存在尺度不确定性 |
| 回环检测成熟 | 实时性受限于特征数量 |
3.2 直接法视觉 SLAM(DSO)
直接最小化光度误差(Photometric Error):
无需特征提取,对纹理弱场景更好,但对曝光变化和运动模糊敏感。
4. 视觉-惯性紧耦合(VIO)
4.1 IMU 预积分理论
IMU 输出角速度 \(\omega\) 和加速度 \(a\),积分得到姿态和速度:
预积分可以将 IMU 量重复利用,避免在优化迭代中重复积分。
4.2 主流 VIO 系统
| 系统 | 方法 | 特点 |
|---|---|---|
| MSCKF | 多状态约束 EKF | 计算高效,适合实时 |
| VINS-Mono | 优化 + 滑动窗口 | 精度高,开源活跃 |
| ORB-SLAM3 | 特征法 + IMU 紧耦合 | 多传感器支持全 |
| OKVIS | 非线性优化,紧耦合 | 精度高,开源 |
5. 因子图融合架构
5.1 因子图基础
因子图将融合定位表述为最大后验(MAP)估计问题:
图中包含:
- 变量节点:待估计状态(位姿、速度、偏差)
- 因子节点:对变量施加约束的量测(IMU、GPS、LiDAR 匹配)
常用框架:
| 框架 | 语言 | 特点 |
|---|---|---|
| GTSAM | C++/Python | 功能完整,学术界主流 |
| g2o | C++ | 图优化,性能高 |
| Ceres | C++ | 通用非线性最小二乘 |
5.2 自动驾驶典型融合因子
因子图节点与因子示意:
x_0 ──IMU预积分因子── x_1 ──IMU预积分因子── x_2
│ │ │
GNSS先验因子 LiDAR匹配因子 回环检测因子
│
地图先验约束
5.3 边缘化(Marginalization)
为保持实时性,滑动窗口内的旧状态通过边缘化移除,保留其约束对后续状态的影响(Prior Factor)。
6. GNSS/IMU 紧耦合
6.1 误差状态卡尔曼滤波器(ESKF)
状态向量:位置、速度、姿态、IMU 偏差(加速度计零偏 \(b_a\)、陀螺仪零偏 \(b_g\))。
预测步(IMU 积分):
更新步(GNSS 量测):
7. 关键工程问题
7.1 时间同步
多传感器时间戳对齐是融合精度的基础约束:
| 传感器 | 典型同步方式 | 精度要求 |
|---|---|---|
| 相机 | 硬件触发(FSYNC)+ 时戳记录 | < 1 ms |
| LiDAR | PPS 信号 + NMEA 句子同步 | < 0.1 ms |
| IMU | 硬件中断时戳 | < 0.1 ms |
| GNSS | PPS 秒脉冲标定 | < 1 μs |
时间同步偏差 > 10 ms 会显著影响 VIO 和激光-视觉联合定位精度。
7.2 外参标定
需要标定的外参关系:
相机 ↔ LiDAR(旋转 + 平移,6-DOF)
LiDAR ↔ IMU(旋转 + 平移 + 时间偏移)
相机 ↔ 相机(多相机联合标定)
IMU ↔ 车体坐标系
标定方式:
出厂标定:棋盘格 + 靶标,工厂环境高精度
在线标定:利用运动约束自动校正外参漂移
地标校验:使用固定地标周期性验证标定质量
7.3 场景退化检测
某些场景下传感器无法提供有效约束:
| 退化场景 | 原因 | 处理方式 |
|---|---|---|
| 长隧道 | GNSS 失效,视觉纹理单一 | 提高 IMU 权重,LiDAR 主导 |
| 暴风雪 | LiDAR 大量噪声点 | 点云滤波,降低 LiDAR 权重 |
| 玻璃幕墙 | LiDAR 穿透,视觉反射 | 点云噪声过滤,依赖地图先验 |
| 十字路口开阔区域 | 激光点云特征稀少 | 依赖 GNSS + 地图匹配 |
8. 定位输出接口建议
localization_output:
header:
timestamp: 1234567890.123
frame_id: "map"
pose:
position: {x, y, z} # UTM 坐标系或地图坐标系
orientation: {qw, qx, qy, qz}
velocity:
linear: {vx, vy, vz}
angular: {wx, wy, wz}
covariance: [6x6 矩阵] # 位置+姿态协方差
confidence: 0.95 # 0-1,综合置信度
mode:
status: "NORMAL" # NORMAL/DEGRADED/RELOCATING/FAILED
active_sensors: ["gnss", "lidar", "camera"]
map_match_score: 0.87 # 地图匹配质量分数
9. 回环检测
回环检测识别车辆是否到达之前访问过的位置,用于消除长程漂移:
| 方法 | 原理 | 适用 |
|---|---|---|
| DBoW2 | 视觉词袋,图像相似度检索 | 视觉 SLAM |
| Scan Context | 激光点云极坐标描述符 | 激光 SLAM |
| NetVLAD | 深度学习场景描述符 | 视觉,光照鲁棒 |
| Intensity ScanContext | 点云反射强度信息加入 | 提升区分性 |
回环检测后需要通过 RANSAC + PnP 验证几何一致性,避免误检测导致定位突变。