大家好,我是灵造哥。
你有没有好奇过:一台扫地机器人,从来没有这个房间的图纸,转了一圈之后,怎么就画出了一张规规矩矩的地图?
你有没有想过:送餐机器人端着几碗面在人堆里穿行,没有 GPS、没有轨道,它怎么知道自己到了哪张桌子前?
再或者——你的无人机在 GPS 信号不好的林子里飞着飞着,为什么不会迷路?
这两件事,背后都是同一个问题的不同变种——SLAM(Simultaneous Localization and Mapping,同时定位与建图)。
SLAM 是机器人学的「圣杯」问题之一。从 1980 年代 Smith、Self 和 Cheeseman 首次用统计学框架描述它(Smith & Cheeseman, 1986; Smith et al., 1990),到 2026 年的今天 3D Gaussian Splatting 开始重构整个 pipeline,这条路走了整整四十年。
这一篇,我们先把这个问题的全景地图铺开——后面几篇的每一刀,都会落在这张地图的某个坐标上。
SLAM 要回答的三个问题
一个机器人在未知环境中运动,它需要知道三件事:
- 1. 「我在哪?」——位姿估计(Localization)
- 2. 「周围长啥样?」——地图构建(Mapping)
- 3. 「我来过这吗?」——回环检测(Loop Closure)
这三个问题交织在一起,形成了一个经典的「先有鸡还是先有蛋」的循环:
- • 要想知道自己在哪,需要知道地图——但地图是未知的
- • 要想建地图,需要知道自己在哪——但位姿是未知的
SLAM 的回答是:同时估计。 一边猜位姿,一边建地图,互相支撑,迭代收敛。
用数学语言说,SLAM 要估计的是这个联合后验概率:
其中 x 是机器人位姿,m 是地图,z 是观测(激光/相机),u 是控制输入(里程计/IMU)。
四十年来的所有 SLAM 算法,本质上都是在问:这个联合分布怎么拆、怎么算、怎么近似?
系统骨架:一个标准 SLAM 的拼图
不管你用什么方法,一个完整的 SLAM 系统通常包含这几个模块:
传感器 → 前端(帧间匹配)→ 后端(优化) → 建图
↑
回环检测
前端(Front-end / Visual Odometry):
从连续传感器帧之间估计相对运动。这个模块的输出是一个个「相对位姿约束」。
- • 激光 SLAM 用 ICP(Iterative Closest Point)或其变体匹配两帧点云
- • 视觉 SLAM 用特征匹配(ORB、SuperPoint)或直接法(像素亮度误差)
后端(Back-end / Optimization):
把前端积累的约束和回环约束丢进一个大的优化问题里,统一调整所有位姿和路标点。
- • 图优化流派用 Bundle Adjustment(BA)或 Pose Graph Optimization
回环检测(Loop Closure):
当机器人绕了一圈回到之前的位置时,能不能认出来?这是消除累积漂移的关键。
- • 视觉 SLAM 常用 DBoW2(视觉词袋模型)
- • 激光 SLAM 常用 scan-to-map 匹配的相似度评分
建图(Mapping):
把估计的位姿和传感器观测融合成一张全局一致的地图。
- • 栅格地图(Grid Map):每个格子存占据概率
- • 点云地图(Point Cloud Map):三维空间中的点集
- • 隐式地图(NeRF / 3D Gaussian):神经网络或高斯球体表示
四个流派:一条主线
SLAM 的四十年可以粗暴地分成四条路线:
| | | | |
|---|
| 扩展卡尔曼滤波(EKF)流派 | | | | |
| 粒子滤波流派 | FastSLAM (2002), GMapping (2007) | | | |
| 图优化流派 | iSAM (2008), g2o (2011), ORB-SLAM (2015) | | Kaess, Strasdat, Mur-Artal | |
| 深度学习流派 | Droid-SLAM (2021), Gaussian Splatting SLAM (2024) | | | |
看起来是四个流派,其实有一条主线:
从「稀疏 + 几何」走向「密集 + 语义」,从「手工特征」走向「可微分表示」。
1990 年代的 EKF-SLAM 只能构建稀疏路标点——你看一张算法运行时的截图,就是几个稀疏的点加一条轨迹线,跟夜空中的星星一样稀疏。
2024 年的 Gaussian Splatting SLAM 能构建 dense 3D 高斯场——你看到的不再是点,而是能渲染出新视角视频的完整场景表示。
跨度之大,令人咋舌。
为什么要理解古典算法?
你可能要问:既然后现代 SLAM 已经这么强了,为什么还要学 ICP、GMapping、ESKF 这些「老古董」?
我的回答是:
- 1. 它们是原子操作。 ICP 的最近邻匹配 + SVD 解算,在后现代 SLAM 的可微分渲染框架里以同样的逻辑存在。GMapping 的 Rao-Blackwellization,和因子图中的条件独立性是同一套概率图思维。ESKF 的名义/误差状态分离,在 MSCKF 和 LIO-SAM 中直接继承。
- 2. 工业界仍然在用。 扫地机里跑的是 GMapping 的变体,组合导航里跑的是 ESKF,激光雷达的帧间匹配仍然是 GICP。最前沿不代表最实用。
- 3. 理解它们的工作原理,你才能理解现代系统为什么这样设计。 如果你不明白粒子滤波的退化问题,你就不会理解为什么 ORB-SLAM 要用局部 BA + 全局 BA 的分层策略。
所以这个系列的结构是:
- • 古典三剑客(ICP、GMapping、ESKF),每篇都配合可运行的 Python 代码讲解算法原理
- • 主流开源 SLAM 系统的横向对比(LOAM、ORB-SLAM3、VINS-Mono 等)
- • 后现代 SLAM 的前沿(NeRF-SLAM、3D Gaussian Splatting SLAM)
从地基到天花板,一条线走完。
关于代码示例
代码部分的目的是展示算法的最简骨架——去掉工程优化、边界处理、硬件适配,保留核心逻辑,对于理解核心的算法是没有问题的,实际的工程落地更多都是使用 C++ 实现和相关的算法库。后续代码也会整理出来。感兴趣的小伙伴欢迎后台留言。
准备好了吗?
下一篇,我们从 SLAM 前端最基础、最经典的操作开始——ICP 点云配准。
灵造哥出品|聚焦机器人 × 嵌入式
关注公众号:灵造哥