一、SLAM概述:从零开始理解这件事
大家好,我是你们这门课的主讲。在机器人或自动驾驶领域摸爬滚打了十来年,今天咱们来聊聊SLAM——这个听起来有点唬人、但说白了就是「让机器自己认路」的技术。
我刚开始接触SLAM时,也觉得它很神秘。一个机器人扔到陌生环境里,没有GPS,没有地图,它怎么知道自己在哪?怎么知道周围有什么?嗯,这就是SLAM要解决的核心问题。
1.1 什么是SLAM?
SLAM的全称是Simultaneous Localization and Mapping,中文叫「同时定位与地图构建」。你想想看,一个机器人进入一个未知环境,它需要做两件事:
- 定位:知道自己当前在哪儿
- 建图:知道周围环境长什么样
但这两件事是互相依赖的——要定位就得有地图,要建图就得知道位置。这就像「先有鸡还是先有蛋」的问题。SLAM就是把这个循环解开的算法框架。
核心思想:通过传感器数据(比如相机、激光雷达),一边估计自身运动,一边构建环境地图。两者交替优化,最终收敛。
我在项目中遇到过不少同学,一上来就纠结「SLAM到底算定位还是算建图」。其实没必要分那么清,你只要记住:SLAM是一个状态估计问题。它要同时估计机器人的轨迹和地图中所有特征点的位置。
1.2 视觉SLAM的发展历程
视觉SLAM的发展,说白了就是一部「从简单到复杂、从实验室到落地」的历史。我把它分成几个阶段:
| 阶段 | 时间 | 代表性工作 | 特点 |
|---|---|---|---|
| 萌芽期 | 1986-2004 | Smith、Cheeseman的EKF-SLAM | 基于扩展卡尔曼滤波,计算量小但线性化误差大 |
| 发展期 | 2004-2010 | FastSLAM、GraphSLAM | 粒子滤波和图优化开始登场 |
| 爆发期 | 2010-2015 | PTAM、ORB-SLAM、LSD-SLAM | 特征点法和直接法百花齐放 |
| 成熟期 | 2015-至今 | ORB-SLAM2/3、VINS、DSO | 系统稳定、开源、可商用 |
我记得2012年刚入行时,大家还在争论「特征点法好还是直接法好」。现在回头看,其实没有绝对的好坏——特征点法稳定、直接法稠密,关键看应用场景。
个人建议:如果你刚开始学SLAM,从ORB-SLAM2入手是最稳妥的。代码规范、文档齐全、社区活跃。我当年就是啃ORB-SLAM的源码入的门。
1.3 SLAM系统的典型框架
一个完整的视觉SLAM系统,通常包含四个模块。我画了一张图帮你理解它们的关系:
这张图展示了SLAM系统的数据流。我一个个说:
前端:视觉里程计
前端负责处理相邻帧之间的运动。说白了,就是根据两帧图像的特征点匹配,算出相机动了多少。我习惯把前端比作「短时记忆」——它只关心相邻帧的关系,不管全局。
前端常用的方法有两种:
- 特征点法:提取ORB、SIFT等特征,匹配后解算位姿。稳定,但稀疏。
- 直接法:直接利用像素灰度信息,不提取特征。稠密,但对光照敏感。
避坑指南:我曾经在一个项目中只用特征点法,结果遇到纹理缺失的墙面直接崩了。后来加了直接法做补充,才稳住。所以实际工程中,混合使用往往更靠谱。
后端:图优化
后端负责全局优化。前端估计的轨迹会有累积误差——你想想看,每帧都有一点小误差,走100米后可能偏了10米。后端就是通过光束法平差(Bundle Adjustment,BA)把这些误差分摊到每一帧上。
图优化的核心思想是:把相机位姿和地图点都看作节点,把观测约束看作边,然后最小化所有边的误差。我常用的优化库是g2o和Ceres,后面课程会手把手带大家写。
回环检测
回环检测是SLAM系统的「救命稻草」。当机器人回到之前去过的地方时,回环检测能识别出这个「闭环」,然后告诉后端:「嘿,这里之前来过,把误差拉回来!」
没有回环检测的SLAM,轨迹会越飘越远。我见过一个极端案例——一个AGV在仓库里跑了3圈,没有回环检测,最后定位误差超过了2米,直接撞了货架。
建图
建图是最终输出。根据应用场景不同,地图形式也不同:
- 稀疏地图:只保存特征点,用于定位。ORB-SLAM就是这种。
- 稠密地图:保存所有像素,用于导航和避障。需要GPU加速。
- 语义地图:给地图中的物体打标签,比如「这是桌子」「那是门」。
1.4 课程整体规划与学习路径
这门课一共30章,我按照「从原理到实战」的思路来设计。你不需要一次性学完,但建议按顺序来:
| 阶段 | 章节 | 核心内容 |
|---|---|---|
| 基础篇 | 1-5章 | SLAM概述、三维空间刚体运动、相机模型、非线性优化 |
| 核心篇 | 6-15章 | 特征提取与匹配、PnP求解、ICP、光流法、直接法 |
| 进阶篇 | 16-25章 | 回环检测(词袋模型)、图优化(g2o/Ceres)、BA详解 |
| 实战篇 | 26-30章 | ORB-SLAM2源码解析、VINS-Mono实战、自研SLAM系统 |
我个人建议的学习路径是:
- 先跑通一个开源SLAM(比如ORB-SLAM2),感受一下整体流程。
- 再啃数学基础(李群李代数、非线性优化),这部分不能跳过。
- 最后动手写代码,从零实现一个简化版SLAM。
学习技巧:我当年学SLAM时,每看完一篇论文,就自己画一遍算法流程图。画着画着,很多模糊的地方就清晰了。你也试试看。
好了,第一章就到这里。记住一句话:SLAM不难,难的是坚持。后面每一章我都会带着大家手撕代码、踩坑填坑。咱们第二章见。
公众号:蓝海资料掘金营,微信deep3321