SLAM 建图与定位 — 领域全景入门
本文面向 SLAM 领域的初学者,系统介绍这个领域的发展历程、核心问题、技术分支、主流算法、应用场景和发展趋势。读完之后你会对整个 SLAM 领域有一个完整的认知框架。
一、SLAM 是什么?
1.1 定义
SLAM = Simultaneous Localization and Mapping(同时定位与建图)
白话:机器人到了一个陌生环境,一边走一边干两件事——搞清楚"我在哪"和"周围啥样"。这两件事互相依赖:要知道自己在哪需要参照物(地图),要建地图需要知道每次观测时自己站在哪里。SLAM 就是同时解决这个问题。
1.2 为什么重要
GPS 能解决室外定位,但以下场景 GPS 不可用或精度不足:
- 室内(商场、仓库、医院)——信号被墙遮挡
- 地下(车库、隧道、矿井)——完全无信号
- 城市峡谷(高楼间)——多径反射导致跳变
- 高精度要求(自动驾驶要求厘米级,GPS只有米级)
- AR/VR(需要毫米级跟踪手机/头显的6自由度位姿)
凡是这些场景,都需要 SLAM 或基于 SLAM 思想的技术。
1.3 SLAM 的历史脉络
| 年代 | 里程碑 | 意义 |
|---|---|---|
| 1986 | Smith, Self & Cheeseman 提出SLAM问题 | 首次形式化定义 |
| 1990s | 基于EKF的SLAM | 第一代解法(2D、小环境) |
| 2000s | FastSLAM(粒子滤波)、图优化SLAM | 规模化、精度提升 |
| 2007 | MonoSLAM | 首个实时单目SLAM |
| 2014 | LOAM、LSD-SLAM | 3D激光里程计、大规模直接法视觉 |
| 2015 | ORB-SLAM | 视觉SLAM的工程标杆 |
| 2016 | Cartographer | Google开源,工业级2D/3D SLAM |
| 2018 | VINS-Mono | 视觉惯性融合的标杆 |
| 2020 | LIO-SAM | 因子图框架的LiDAR-IMU融合 |
| 2022 | FAST-LIO2 | 极致高效的滤波式LiDAR-IMU融合 |
| 2023+ | Neural SLAM、3DGS-SLAM | 神经隐式表达、高斯泼溅建图 |
二、SLAM 解决的核心问题
2.1 状态估计
SLAM 的本质是一个状态估计问题。待估计的状态包括:
- 位姿(Pose):6自由度——3个平移(x,y,z) + 3个旋转(roll,pitch,yaw)
- 速度:线速度和角速度(融合IMU时需要)
- 传感器偏置:IMU的零偏随时间漂移,需要在线估计
- 地图:环境的某种表示(点云/特征点/栅格/隐式场)
2.2 定位 vs 建图 vs SLAM
| 任务 | 输入 | 输出 | 场景 |
|---|---|---|---|
| 纯定位 | 传感器数据 + 已有地图 | 当前位姿 | 地图已建好,日常使用 |
| 纯建图 | 传感器数据 + 已知轨迹 | 环境地图 | 有外部定位源(如动捕) |
| SLAM | 传感器数据(无先验) | 位姿 + 地图 | 首次到达陌生环境 |
实际工程中的典型流程:第一次到场景跑 SLAM 建图 → 保存地图 → 之后每次只做定位(更快更稳定)。
2.3 定位的两层含义
- 里程计(Odometry):相对定位,估计相邻时刻的运动增量。快速但会累积漂移。
- 全局定位(Global Localization):在已有地图中确定绝对位置。解决"绑架问题"(突然被放到未知位置)。
三、传感器体系
3.1 外部感知传感器
| 传感器 | 输出 | 频率 | 精度 | 优势 | 劣势 |
|---|---|---|---|---|---|
| 单目相机 | 2D图像 | 30-60Hz | 像素级 | 便宜、信息丰富(纹理颜色) | 无深度、怕光照变化、无绝对尺度 |
| 双目相机 | 图像+视差深度 | 30Hz | 近距cm级 | 有深度、被动感知 | 基线限制测量范围、计算量大 |
| RGBD相机 | 图像+深度图 | 30Hz | mm级(近距) | 直接获得深度 | 室外/远距失效、易受阳光干扰 |
| 机械式LiDAR | 3D点云 | 10-20Hz | cm级 | 精度高、不受光照影响、测距远 | 贵、有运动畸变、无颜色 |
| 固态LiDAR | 3D点云(非重复扫描) | 10Hz | cm级 | 便宜(相对机械)、无旋转部件可靠 | 视角小、点云分布不规则 |
| 2D LiDAR | 平面扫描线 | 10-40Hz | mm级 | 便宜可靠 | 只有2D信息 |
| 事件相机 | 像素级亮度变化事件 | μs级 | 像素级 | 超高动态范围、无运动模糊 | 数据处理方式完全不同 |
3.2 内部感知传感器
| 传感器 | 输出 | 频率 | 作用 |
|---|---|---|---|
| IMU(惯性测量单元) | 角速度+线加速度 | 200-1000Hz | 高频运动预测、辅助去畸变、提供重力方向 |
| 轮式里程计 | 线速度/角速度 | 50-200Hz | 地面机器人的平面运动约束 |
| 气压计 | 海拔高度 | 10-50Hz | 无人机高度约束 |
| 磁力计 | 航向角 | 50-100Hz | 绝对航向参考(但容易受干扰) |
3.3 外部参考传感器
| 传感器 | 精度 | 作用 |
|---|---|---|
| GPS/GNSS | 2-5m (单点), 1-2cm (RTK) | 提供全局绝对位置,消除累积漂移 |
| UWB | 10-30cm | 室内绝对定位 |
| 动作捕捉 | mm级 | 提供ground truth,用于评估算法精度 |
3.4 常见传感器组合
| 平台 | 传感器组合 | 代表方案 |
|---|---|---|
| 自动驾驶汽车 | 多线LiDAR + IMU + GPS + 相机 | Autoware, Apollo |
| 室内服务机器人 | 2D/3D LiDAR + IMU | Cartographer, FAST-LIO2 |
| 无人机 | 单目/双目相机 + IMU | VINS-Mono, PX4 |
| AR眼镜/手机 | 单目/鱼眼相机 + IMU | ARKit, ARCore |
| 手持扫描仪 | LiDAR + IMU + 相机 | FAST-LIVO, R2LIVE |
| 扫地机器人 | 2D LiDAR + 轮式里程计 | GMapping, Cartographer |
| 四足机器人 | LiDAR + IMU + 腿部里程计 | VILENS, Cerberus |
四、SLAM 系统的模块划分
一个完整的 SLAM 系统一般包含以下模块:
4.1 数据预处理
不同传感器的预处理工作:
LiDAR:
- 运动补偿(去畸变):一帧扫描期间机器人在动,需要校正
- 降采样:减少数据量同时保留几何信息
- 去除无效点:过近/过远/噪声点
相机:
- 畸变校正:鱼眼/广角镜头的畸变矫正
- 特征提取:角点、边缘、描述子
- 直方图均衡化:应对光照变化
IMU:
- 坐标系对齐:统一到body坐标系
- 零偏补偿:减去估计的bias
- 时间同步:与其他传感器时间对齐
4.2 前端里程计
前端解决的是"相邻两帧之间我运动了多少",即短时相对运动估计。
视觉前端的两大流派:
| 方法 | 代表 | 原理 | 优缺点 |
|---|---|---|---|
| 特征点法 | ORB-SLAM | 提取特征点→描述子匹配→对极几何 | 精度高、鲁棒;计算量较大 |
| 直接法/光流法 | DSO, VINS | 直接用像素灰度或光流做匹配 | 快、适合纹理弱区域;对光照敏感 |
LiDAR前端:
| 方法 | 代表 | 原理 |
|---|---|---|
| ICP | 经典方法 | 最近邻点匹配+最小化距离 |
| 点到面ICP | FAST-LIO2 | 利用局部平面约束,收敛更快 |
| GICP | — | 概率模型统一框架 |
| NDT | Autoware | 正态分布体素匹配 |
| 特征配准 | LOAM, LIO-SAM | 提取edge/planar特征后配准 |
IMU里程计:
- 对角速度积分得到旋转变化
- 对加速度二重积分得到位移
- 单独使用会快速漂移(秒级),必须和其他传感器融合
4.3 后端优化
后端解决的是"综合所有历史信息,最优的完整轨迹是什么"。
两大流派:
| 方法 | 原理 | 优点 | 缺点 | 代表 |
|---|---|---|---|---|
| 滤波 | 递推更新当前状态,边缘化历史 | 快、实时性好 | 无法修正历史、线性化误差累积 | FAST-LIO2(ESKF), MSCKF |
| 图优化 | 所有位姿作为变量联合优化 | 精度高、支持回环修正 | 计算量随规模增长 | LIO-SAM, ORB-SLAM, VINS |
图优化的直觉理解:把每个位姿想象成一个可以移动的节点,传感器观测是节点之间的弹簧(约束)。优化就是找所有节点的位置使得弹簧总能量最小。回环检测相当于在远处两个节点之间加了一根新弹簧,拉动整条轨迹修正。
主流优化库:
- GTSAM:因子图框架,增量优化(ISAM2),LIO-SAM使用
- g2o:通用图优化,ORB-SLAM使用
- Ceres Solver:通用非线性最小二乘,VINS-Mono使用
4.4 回环检测
当机器人重新回到之前去过的地方时,识别出"我来过这里",提供一个全局约束消除累积漂移。
方法分类:
| 类型 | 方法 | 原理 |
|---|---|---|
| 基于外观 | DBoW2 (视觉词袋) | 将图像编码为词袋向量做相似度匹配 |
| 基于结构 | ScanContext | 将3D点云编码为2D极坐标描述子 |
| 基于位置 | 距离搜索 | 历史轨迹中找距离近但时间远的帧 |
| 基于学习 | NetVLAD, PointNetVLAD | 深度学习提取全局描述子 |
回环验证:候选帧检出后,通常需要几何验证(ICP配准或PnP求解),确认是真回环而非误匹配(假阳性)。
4.5 地图表示
| 地图类型 | 表示方式 | 优势 | 用途 |
|---|---|---|---|
| 稀疏特征地图 | 3D特征点集合 | 轻量、适合定位 | 视觉重定位 |
| 稠密点云地图 | 大量3D点 | 细节丰富 | 三维重建、检测 |
| 体素地图 | 3D网格占据概率 | 结构化、适合规划 | OctoMap |
| 2D栅格地图 | 鸟瞰图黑白格 | 直观、适合2D导航 | 扫地机器人、AGV |
| TSDF | 截断符号距离场 | 适合融合多帧深度 | KinectFusion |
| 网格Mesh | 三角面片表面 | 可渲染 | AR、仿真 |
| NeRF/3DGS | 神经辐射场/高斯泼溅 | 照片级真实感渲染 | 数字孪生、VR |
| 语义地图 | 带类别标注的地图 | 理解环境含义 | 智能交互 |
五、SLAM 技术分支详解
5.1 视觉 SLAM(Visual SLAM)
用相机作为主传感器的 SLAM。
特征点法代表 — ORB-SLAM 系列:
- 提取 ORB 特征点 → 描述子匹配 → 对极几何求位姿
- 三线程并行:跟踪(Tracking) / 局部建图(LocalMapping) / 回环(LoopClosing)
- ORB-SLAM3 支持单目/双目/RGBD/鱼眼 + IMU
直接法代表 — DSO(Direct Sparse Odometry):
- 不提取特征,直接用像素灰度值做匹配(光度误差最小化)
- 优点:纹理弱的区域也能工作;缺点:对光照变化敏感
视觉惯性代表 — VINS-Mono/Fusion:
- 相机 + IMU 紧耦合
- 滑动窗口优化(Ceres)
- 鲁棒初始化(恢复尺度和重力方向)
- 是 VIO(Visual-Inertial Odometry)的标杆
5.2 激光 SLAM(LiDAR SLAM)
用 LiDAR 作为主传感器的 SLAM。
2D 激光 SLAM:
- GMapping:粒子滤波 + 栅格地图
- Hector SLAM:扫描匹配,无需里程计
- Cartographer:submap + branch-and-bound 回环
- 用途:扫地机器人、AGV、室内服务机器人
3D 激光 SLAM:
- LOAM(2014):开创 edge/planar 特征提取 + 两频率优化
- LeGO-LOAM(2018):轻量级改进,加入地面分割
- LIO-SAM(2020):因子图 + IMU预积分 + 回环 + GPS
- FAST-LIO2(2022):ikd-Tree + iterated ESKF,极致效率
- KISS-ICP(2023):极简点到点ICP,开箱即用
3D LiDAR SLAM 的演化路径:
LOAM(2014) → LeGO-LOAM(2018) → LIO-SAM(2020) [图优化路线] | └──→ FAST-LIO(2021) → FAST-LIO2(2022) [滤波路线] | └──→ FASTER-LIO(iVox) [更快数据结构]5.3 多传感器融合 SLAM
融合多种传感器以互补优缺点:
| 融合方式 | 优势 | 代表 |
|---|---|---|
| LiDAR + IMU | LiDAR提供精确空间约束,IMU提供高频预测和去畸变 | FAST-LIO2, LIO-SAM |
| Camera + IMU | 相机提供丰富纹理信息,IMU提供尺度和旋转 | VINS-Mono, ORB-SLAM3 |
| LiDAR + Camera + IMU | 最全面的环境感知 | R2LIVE, FAST-LIVO2 |
| LiDAR + GPS | GPS消除全局漂移 | LIO-SAM (GPS因子) |
融合方式分类:
- 松耦合:各传感器独立出结果再融合。模块化但信息利用不充分。
- 紧耦合:原始测量级融合,共享状态联合优化。精度高但实现复杂。
- 现代高精度系统基本都是紧耦合。
5.4 语义 SLAM
在几何 SLAM 的基础上加入语义理解:
- 识别物体类别(这是椅子、那是门)
- 剔除动态物体(行人、车辆不应出现在地图中)
- 构建物体级地图(不只是点云,而是"哪里有什么")
- 辅助回环检测(看到同一个路标比几何匹配更可靠)
代表工作:Kimera、DS-SLAM、DynaSLAM
5.5 深度学习与 SLAM
深度学习正在渗透 SLAM 的各个模块:
| 模块 | 传统方法 | 深度学习方法 |
|---|---|---|
| 特征提取 | ORB, SIFT | SuperPoint, R2D2 |
| 特征匹配 | BF/FLANN暴力匹配 | SuperGlue, LoFTR |
| 深度估计 | 双目视差/结构光 | MonoDepth, DPT |
| 位姿估计 | PnP/ICP | PoseNet(精度还不够) |
| 回环检测 | DBoW2 | NetVLAD, CosPlace |
| 建图 | 点云/Mesh | NeRF, 3D Gaussian Splatting |
| 动态物体 | 几何一致性检测 | 语义分割+运动估计 |
目前趋势:传统几何方法仍是主干(精度和可解释性更好),深度学习作为强力模块嵌入(特别是在特征/回环/建图方面)。
六、应用场景详解
6.1 自动驾驶
- 高精地图构建:用采集车(LiDAR+IMU+GPS)建立厘米级道路地图
- 实时定位:行驶中在高精地图中做点云配准定位
- 挑战:大规模(城市级)、动态环境(车流人流)、全天候
6.2 室内服务机器人
- 场景:仓库AGV、配送机器人、清洁机器人
- 典型方案:2D LiDAR + Cartographer 建栅格图 → AMCL 粒子滤波定位
- 挑战:动态环境(人流)、长期运行(地图老化)
6.3 无人机
- 场景:室内巡检、航拍建图、自主飞行
- 典型方案:相机+IMU (VIO),计算资源和重量受限
- 挑战:快速运动(IMU必须)、视觉退化(仰视天花板无纹理)
6.4 AR/VR/MR
- 需求:手机/头显在空间中的6-DoF实时跟踪
- 代表:Apple ARKit、Google ARCore、Meta Quest SLAM
- 特点:必须极低延迟(<20ms)、消费级硬件
6.5 三维重建与数字孪生
- 场景:建筑BIM、文物扫描、工厂数字孪生
- 方案:LiDAR建图 + 纹理贴图 或 NeRF/3DGS高质量重建
- 趋势:从点云地图 → 照片级真实感渲染
6.6 矿井/隧道巡检
- 特点:完全无GPS、环境重复性高(退化严重)
- 方案:LiDAR+IMU紧耦合 + 多模态退化检测
- 挑战:粉尘干扰LiDAR、狭长结构退化
七、SLAM 的核心难题
7.1 累积漂移
前端每帧估计都有小误差,时间越长越偏。像闭眼走路,每步偏一点点,走一百步就偏很远。
应对:
- 回环检测 + 图优化(检测到回到旧地方,一次性修正整条轨迹)
- GPS/UWB等绝对位置源(定期"校准")
- 更高精度的前端(减小单步误差)
7.2 动态环境
行人、车辆等运动物体会污染地图、干扰配准。
应对:
- 基于一致性的动态点检测(多帧不一致→动态)
- 语义分割识别动态类别(人、车直接剔除)
- 鲁棒核函数降权异常观测
7.3 退化场景
某些环境缺乏足够约束:
| 退化类型 | 现象 | 影响的传感器 |
|---|---|---|
| 长走廊/隧道 | 前进方向无约束 | LiDAR |
| 空旷场地 | 测不到东西 | LiDAR |
| 纯白墙 | 无纹理特征 | 相机 |
| 黑暗环境 | 看不见 | 相机 |
| 重复结构 | 无法区分位置 | 所有 |
应对:多传感器融合互补(LiDAR走廊退化时IMU补偿,相机无纹理时LiDAR补偿)、退化检测与告警。
7.4 计算效率
嵌入式平台算力有限,但SLAM需要实时。
应对:
- 高效数据结构(ikd-Tree, iVox)
- 滤波代替全量优化
- 降采样减少数据量
- GPU加速/专用芯片
7.5 大规模与长时间
地图越来越大怎么办?跑几个小时地图变化了怎么办?
应对:
- 地图分块管理(子地图加载/卸载)
- 关键帧稀疏化(不保留所有帧)
- 长期地图更新(检测变化区域并更新)
7.6 鲁棒性
实际环境千变万化:雨雪雾、强光逆光、传感器故障、剧烈运动…
应对:
- 多传感器冗余
- 异常检测与降级策略
- 鲁棒统计方法(M-estimator、RANSAC)
八、SLAM 与相关领域的关系
- 计算机视觉:视觉SLAM大量依赖CV技术(特征、光流、深度估计)
- 状态估计/控制论:卡尔曼滤波、图优化的理论基础
- 机器人学:SLAM是自主导航的基础模块
- 数值优化:非线性最小二乘、流形优化
- 深度学习:越来越多模块被学习方法增强
九、发展趋势
9.1 与深度学习的融合
- 端到端 SLAM(从图像直接出位姿,但目前精度不足)
- 学习增强的传统 SLAM(学习做特征/匹配/回环,几何仍用传统方法)
- 神经隐式建图(NeRF/3DGS 替代点云地图)
9.2 多机协作 SLAM
- 多个机器人同时建图,共享和融合各自的地图
- 挑战:通信带宽有限、相对位姿估计、地图合并
9.3 语义化与场景理解
- 不只是几何地图,还要理解"这是什么、有什么意义"
- 物体级SLAM:地图中的元素是"桌子""门"而非一堆点
- 为机器人决策提供更高层次信息
9.4 长期自主运行
- 环境会变化(施工、季节、家具搬动),地图要能更新
- 长期运行的稳定性(内存泄漏、数值精度、地图膨胀)
- 终身学习:从经验中改进自身
9.5 新型传感器
- 4D毫米波雷达:穿透雾雨雪,成本低
- 事件相机:超高动态范围,微秒级时间分辨率
- 固态LiDAR阵列:多个小型固态LiDAR拼接全视角
十、学习路线建议
阶段一:建立感性认识(1-2周)
- 跑通一个开源 SLAM demo(推荐 FAST-LIO2,代码最精简)
- 用 rviz 看点云地图生成的过程
- 跑不同数据集感受不同环境的效果
- 不需要看代码,先知道"这东西能干嘛"
阶段二:补数学基础(2-4周)
- 坐标系变换与齐次坐标
- 旋转表示(旋转矩阵、四元数、轴角)
- 最小二乘与非线性优化基础
- 概率论基础(高斯分布、贝叶斯)
- 推荐:高翔《视觉SLAM十四讲》前8章
阶段三:精读一个系统(4-8周)
- 选一个系统看源码(推荐FAST-LIO2:代码量最小、结构最清晰)
- 对照论文理解每个模块
- 修改参数看效果变化
阶段四:对比不同方案(4周)
- 对比滤波vs图优化(FAST-LIO2 vs LIO-SAM)
- 对比视觉vs激光(VINS-Mono vs FAST-LIO2)
- 理解各自的取舍和适用场景
阶段五:工程实践(持续)
- 换自己的传感器跑
- 处理实际问题(标定、时间同步、异常数据)
- 根据场景需求改算法(加回环、加GPS、处理退化)
推荐资源
| 类型 | 资源 | 适合阶段 |
|---|---|---|
| 入门书 | 高翔《视觉SLAM十四讲》 | 阶段二 |
| 进阶书 | Barfoot《State Estimation for Robotics》 | 阶段三 |
| 视频 | Cyrill Stachniss SLAM课程 (YouTube) | 阶段二 |
| 代码 | FAST-LIO2 / LIO-SAM / VINS-Mono | 阶段三 |
| 论文 | 各算法的原始论文 | 阶段三-四 |
| 社区 | 知乎SLAM话题、泡泡机器人、古月居 | 全程 |
十一、常见误解澄清
“SLAM就是建图”
不是。SLAM 的重点是定位(“我在哪”),建图是实现定位的手段。很多应用中地图建完后主要用定位功能。
“有了GPS就不需要SLAM”
GPS室内不可用、城市中精度差、频率低(10Hz)。即使室外有GPS,也通常和SLAM融合使用(GPS修正漂移,SLAM提供高频高精度)。
“LiDAR SLAM比视觉SLAM好”
各有所长。LiDAR精度高不怕光照但贵;视觉便宜信息丰富但怕光照和无纹理。实际趋势是融合使用。
“深度学习会取代传统SLAM”
短期内不会。端到端学习方法精度和泛化能力不足。当前趋势是传统几何方法为主干,深度学习增强特定模块(特征提取、回环检测、建图)。
“SLAM问题已经解决了”
实验室demo层面基本解决,但工程落地仍有大量挑战:动态环境鲁棒性、极端天气、长期运行稳定性、大规模地图管理、计算效率等。这也是为什么SLAM算法工程师仍然大量需求。
延伸阅读
- 入门:高翔《视觉SLAM十四讲》
- 综述论文:Cadena C, et al. “Past, Present, and Future of Simultaneous Localization and Mapping.” IEEE T-RO, 2016.
- 视觉SLAM综述:Kazerouni I, et al. “A Survey of State-of-the-Art on Visual SLAM.” Expert Systems with Applications, 2022.
- LiDAR SLAM综述:Zhang J, et al. “A Survey on LiDAR-based SLAM.” Robotics and Autonomous Systems, 2023.
- 本系列后续:第1-12篇逐步深入各个具体算法和源码实现
