一、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系统典型框架 传感器数据(相机) 前端:视觉里程计(VO) 特征提取 · 匹配 · 运动估计 后端:图优化(BA) 全局优化 · 消除累积误差 回环检测 识别已访问区域 建图:地图构建

这张图展示了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系统

我个人建议的学习路径是:

  1. 先跑通一个开源SLAM(比如ORB-SLAM2),感受一下整体流程。
  2. 再啃数学基础(李群李代数、非线性优化),这部分不能跳过。
  3. 最后动手写代码,从零实现一个简化版SLAM。

学习技巧:我当年学SLAM时,每看完一篇论文,就自己画一遍算法流程图。画着画着,很多模糊的地方就清晰了。你也试试看。

好了,第一章就到这里。记住一句话:SLAM不难,难的是坚持。后面每一章我都会带着大家手撕代码、踩坑填坑。咱们第二章见。


公众号:蓝海资料掘金营,微信deep3321