📚 视觉SLAM十四讲:全攻略 ------ 逻辑脉络、学习路线与Ubuntu 20.04实践准备
🎯 写在前面
本文是《视觉SLAM十四讲》的深度导读。我们将彻底解析全书的逻辑结构,拆解"数学基础"与"SLAM技术"两大模块的内在联系,并通过完整的流程图绘制 ,帮你建立起SLAM系统的整体认知。同时,针对选择 Ubuntu 20.04 作为学习环境的初学者,提供第一天必须完成的环境准备与思维导图。
📑 目录
- [1. 背景](#1. 背景)
- [2. 全书逻辑架构图](#2. 全书逻辑架构图)
- [3. 经典视觉SLAM框架详解(附完整流程图)](#3. 经典视觉SLAM框架详解(附完整流程图))
- [3.1 传感器信息读取](#3.1 传感器信息读取)
- [3.2 前端视觉里程计(VO)](#3.2 前端视觉里程计(VO))
- [3.3 后端优化(Optimization)](#3.3 后端优化(Optimization))
- [3.4 回环检测(Loop Closure)](#3.4 回环检测(Loop Closure))
- [3.5 建图(Mapping)](#3.5 建图(Mapping))
- [4. 相机模型与传感器(附分类对比图)](#4. 相机模型与传感器(附分类对比图))
- [5. 数学基础与工程实践的映射关系](#5. 数学基础与工程实践的映射关系)
- [6. Ubuntu 20.04 环境搭建全流程](#6. Ubuntu 20.04 环境搭建全流程)
- [7. 总结与学习建议](#7. 总结与学习建议)
1. 背景
在机器人及自动驾驶领域,SLAM(Simultaneous Localization and Mapping,同时定位与地图构建) 技术被誉为"皇冠上的明珠"。然而,对于初学者而言,SLAM 的门槛往往不在于单一的知识点,而在于如何将 数学理论(李群、优化) 与 工程实践(C++、Linux、OpenCV) 融会贯通。
高翔等人所著的《视觉SLAM十四讲》正是这样一本"神书",它打破了理论与实践的壁垒。但是,面对书中庞大的知识体系,很多读者在翻开第一页时就迷失了方向。
今天,作为学习的第一天,我们不做繁琐的公式推导,而是站在高处,俯瞰全貌 。我会带您串联全书的目录结构,理清每一讲在SLAM系统中的"生态位",并基于 Ubuntu 20.04 给出最稳妥的起手式。
2. 全书逻辑架构图
《视觉SLAM十四讲》的结构非常清晰,就像是在组装一个智能机器人 。全书分为两大核心篇章:数学基础篇(第1~6讲) 和 SLAM技术篇(第7~14讲)。
下面是我绘制的全书逻辑架构图,清晰地展示了每一讲在整个SLAM系统中的位置和作用:
第二部分:SLAM技术篇
第一部分:数学基础篇
第1讲:前言
第2讲:初识SLAM
第3讲:三维空间刚体运动
旋转矩阵/四元数/Eigen
第4讲:李群与李代数
Sophus/求导模型
第5讲:相机与图像
针孔模型/OpenCV/点云
第6讲:非线性优化
状态估计/Ceres/g2o
第7讲:视觉里程计1-特征点法
ORB/对极几何/PnP/ICP
第8讲:视觉里程计2-直接法
光流/直接法/稀疏稠密
第9讲:实践章-设计前端
VO框架搭建/数据结构
第10讲:后端1-BA优化
Bundle Adjustment/g2o求解
第11讲:后端2-位姿图
Pose Graph/gtsam
第12讲:回环检测
词袋模型/DBoW3/相似度计算
第13讲:建图
单目稠密重建/八叉树地图
第14讲:现在与未来
开源方案对比/深度学习结合
2. 学习路线图(修正版)
第三阶段:进阶拓展
第二阶段:核心技术(第7-13讲)
第一阶段:基础入门(第1-6讲)
第1-2讲
SLAM概述
第3讲
刚体运动/Eigen
第4讲
李代数/Sophus
第5讲
相机模型/OpenCV
第6讲
非线性优化/Ceres/g2o
第7-8讲
前端VO
特征点法+直接法
第9讲
实践:设计前端
第10-11讲
后端优化
BA+位姿图
第12讲
回环检测
第13讲
建图
第14讲
开源方案/未来
ORB-SLAM2/3
源码阅读
视觉惯性SLAM
VINS/ORB-SLAM3
【流程图解读】:
- 粉色部分(第1-2讲):SLAM的概述和入门,让你知道学什么、为什么学
- 蓝色部分(第3-6讲):数学基础,打造SLAM的"兵器库"------包括刚体运动描述(第3讲)、优化求导工具(第4讲)、相机模型(第5讲)、非线性优化方法(第6讲)
- 绿色部分(第7-13讲) :SLAM核心技术,按照前端→后端→回环→建图的经典流程展开
- 橙色部分(第14讲):展望未来,了解行业前沿
3. 经典视觉SLAM框架详解(附完整流程图)
经典视觉SLAM框架包含五个核心模块:传感器信息读取、前端视觉里程计、后端优化、回环检测、建图。下面这张完整的SLAM框架流程图,清晰地展示了各模块之间的关系和数据流向:
建图
回环检测
后端优化
前端VO
传感器层
相机
单目/双目/RGB-D
预处理
畸变校正/灰度化
IMU
惯性测量单元
特征提取
ORB/SIFT/FAST
特征匹配
相邻帧关联
运动估计
PnP/ICP/对极几何
局部地图
构建与维护
图优化框架
g2o/Ceres/GTSAM
回环约束
全局位姿优化
Bundle Adjustment
词袋模型
DBoW3字典
相似度计算
回环验证
几何一致性检查
稀疏地图
路标点云
稠密地图
深度估计/八叉树
语义地图
目标识别+SLAM
下面我们逐一拆解每个模块:
3.1 传感器信息读取
视觉SLAM的输入源主要包括:
- 单目相机(Monocular) :结构简单、成本低,但存在尺度不确定性,无法确定物体的真实大小
- 双目相机(Stereo):通过基线估计深度,类似人眼,但计算量大,需要GPU/FPGA加速
- 深度相机(RGB-D):通过ToF或结构光直接测量深度,室内效果好,但易受日光干扰
- IMU(惯性测量单元):测量角速度和加速度,与视觉互补,提高鲁棒性
预处理步骤包括:图像畸变校正、灰度化、去噪、时间戳对齐等。
3.2 前端视觉里程计(VO)
VO的任务是估算相邻图像间相机的运动 ,以及建立局部地图。它包含以下子步骤:
- 特征提取:从图像中提取关键特征点(如ORB、SIFT、FAST)
- 特征匹配:在连续帧或多视角间进行特征匹配,获取相对运动信息
- 运动估计 :利用匹配的特征点对,估计摄像头的相对位姿变化,常用方法包括PnP算法、EPnP、对极几何、ICP等
VO只计算相邻时刻的运动,不关心历史信息,因此必然存在累积漂移------你会发现原本直的走廊变成了斜的,原本90°的直角变成了歪的。为消除漂移,我们需要回环检测和后端优化。
3.3 后端优化(Optimization)
后端接收前端估计的相机位姿和回环检测信息,通过非线性优化得到全局一致的轨迹和地图。主要工作包括:
- 图优化:将位姿和地图点作为图的节点,通过优化算法(如最小二乘)最小化重投影误差
- 关键帧选择与管理:为了提高计算效率,后端会选择关键帧进行优化,管理地图点的添加、删除
- Bundle Adjustment(BA):同时优化相机位姿和地图点位置
后端处理的是带噪声的数据,目标是估计整个系统的状态及其不确定性------这被称为最大后验概率估计。
3.4 回环检测(Loop Closure)
回环检测的核心是判断机器人是否到达过先前的位置 。它的作用:当检测到回环时,将信息提供给后端,后端把轨迹和地图调整到符合回环检测结果的样子,从而彻底消除累积漂移。
实现方法:
- 场景识别 :通过图像描述子(如词袋模型Bag of Words、深度学习特征)识别当前帧是否与历史帧对应同一场景
- 全局优化:一旦检测到闭环,通过全局图优化修正累计的定位误差
3.5 建图(Mapping)
根据估计的轨迹,建立与任务要求对应的地图。地图类型包括:
- 度量地图 :强调精确表示位置关系
- 稀疏地图:由路标组成,计算量小,适合定位
- 稠密地图:建模所有看到的东西,可用于导航,但存储量大
- 拓扑地图:强调元素之间的关系(节点和边),不适用于复杂结构
- 语义地图:将语义分割结果融入SLAM,构建带语义标签的地图
4. 相机模型与传感器(附分类对比图)
相机是视觉SLAM的"眼睛"。下面这张相机分类对比图,直观展示了不同类型相机的特点:
其他类型
深度相机特点
双目特点
单目特点
相机类型
视觉SLAM相机
单目相机 Monocular
双目相机 Stereo
深度相机 RGB-D
其他类型
优点:结构简单/成本低
缺点:尺度不确定性
无法确定真实深度
原理:通过运动形成视差
优点:可测深度/室内外通用
缺点:计算量大/标定复杂
原理:基线估计深度
优点:直接测量深度/计算量小
缺点:范围窄/易受日光干扰
原理:ToF/结构光
全景相机
360°视野
事件相机
像素变化触发/响应快
红外相机
夜视/多传感器融合
相机标定是必不可少的一步:
- 内参标定:内参数矩阵,将相机坐标系3D点映射到2D成像平面
- 外参标定:外参数矩阵,将相机坐标系映射到世界坐标系
- 常用方法:张正友标定法、OpenCV、kalibr
5. 数学基础与工程实践的映射关系
很多读者觉得SLAM的数学难,是因为不知道这些数学工具在代码中到底怎么用。下面这张映射图,清晰地展示了每一讲数学知识对应的工程实践:
| 数学基础(书中章节) | 对应的工程库/工具 | 在SLAM中的作用 |
|---|---|---|
| 第3讲:三维空间刚体运动 | Eigen(几何模块) | 表示相机位姿(旋转矩阵、四元数、变换矩阵) |
| 第4讲:李群与李代数 | Sophus | 对旋转进行求导,用于优化问题 |
| 第5讲:相机与图像 | OpenCV | 相机模型实现、图像处理、特征提取 |
| 第6讲:非线性优化 | Ceres、g2o、GTSAM | 后端优化框架,最小化重投影误差 |
| 第12讲:回环检测 | DBoW3 | 词袋模型实现,计算图像相似度 |
| 第13讲:建图 | PCL(点云库)、OctoMap | 点云处理、八叉树地图构建 |
学习建议:不要孤立地学数学,而要带着"这个数学工具在代码里怎么写"的问题去学。例如,学完第3讲的四元数,立刻去Eigen里写几行代码,看看四元数如何初始化、如何旋转一个向量。
6. Ubuntu 20.04 环境搭建全流程
为什么选择Ubuntu 20.04?虽然现在Ubuntu 20.04/22.04已发布,但对于《视觉SLAM十四讲》(第一版及第二版的部分依赖)而言,Ubuntu 20.04是兼容性最广、遇到"坑"最少的选择 。许多旧版本库(如OpenCV 3、Ceres 1.13.0)在18.04上可通过apt或简单编译完美安装,而在更高版本上往往需要处理复杂的依赖冲突。
下面是第一天必须完成的环境初始化:
6.1 基础环境配置
bash
# 1. 更新系统包
sudo apt-get update
sudo apt-get upgrade -y
# 2. 安装基础编译工具
sudo apt-get install -y build-essential cmake git pkg-config
# 3. 安装常用工具
sudo apt-get install -y vim htop net-tools terminator
# 4. 创建工作目录(整洁的环境是好习惯)
mkdir -p ~/projects/slambook_code
cd ~/projects/slambook_code
# 5. 验证安装
gcc --version
cmake --version
git --version
6.2 安装Eigen3(第3讲必备)
bash
# Eigen3 可以通过 apt 直接安装(推荐)
sudo apt-get install -y libeigen3-dev
# 验证安装
dpkg -l | grep eigen
# 头文件位置:/usr/include/eigen3/
6.3 安装Sophus(第4讲必备)
bash
# Sophus 需要从源码编译
cd ~/projects/slambook_code
git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff # 切换到稳定版本
# 创建构建目录
mkdir build && cd build
cmake ..
make -j4
sudo make install
# 验证安装
ls /usr/local/include/sophus/
6.4 安装OpenCV(第5讲必备)
bash
# 安装OpenCV依赖
sudo apt-get install -y libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
# 下载OpenCV 3.4.16(推荐版本)
cd ~/projects/slambook_code
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.16.zip
unzip opencv.zip
cd opencv-3.4.16
# 编译安装
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
# 验证安装
pkg-config --modversion opencv
6.5 安装Ceres Solver(第6讲必备)
bash
# 安装依赖
sudo apt-get install -y liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev
# 下载Ceres 1.14.0
cd ~/projects/slambook_code
wget -O ceres-solver.zip https://github.com/ceres-solver/ceres-solver/archive/1.14.0.zip
unzip ceres-solver.zip
cd ceres-solver-1.14.0
# 编译安装
mkdir build && cd build
cmake ..
make -j4
sudo make install
# 验证安装
ls /usr/local/lib/libceres.so
6.6 克隆《十四讲》配套代码
bash
# 克隆第一版代码(推荐)
cd ~/projects/slambook_code
git clone https://github.com/gaoxiang12/slambook.git
# 或者克隆第二版代码
git clone https://github.com/gaoxiang12/slambook2.git
# 查看目录结构
ls slambook/
6.7 测试第一个程序(第2讲示例)
bash
cd ~/projects/slambook_code/slambook/ch2
# 编译libHelloSLAM
cmake .
make
# 运行测试
./helloSLAM
如果看到"Hello SLAM"输出,恭喜你,环境配置成功!
7. 总结与学习建议
7.1 学习路线图
第三阶段:进阶拓展
第二阶段:核心技术(第7-13讲)
第一阶段:基础入门(第1-6讲)
第1-2讲
SLAM概述
第3讲
刚体运动/Eigen
第4讲
李代数/Sophus
第5讲
相机模型/OpenCV
第6讲
非线性优化/Ceres/g2o
第7-8讲
前端VO
特征点法+直接法
第9讲
实践:设计前端
第10-11讲
后端优化
BA+位姿图
第12讲
回环检测
第13讲
建图
第14讲
开源方案/未来
ORB-SLAM2/3
源码阅读
视觉惯性SLAM
VINS/ORB-SLAM3
7.2 学习建议
- 理论与实践交替进行:每学完一讲的数学理论,立刻运行配套代码,看代码如何实现理论
- 亲手调试代码:不要只运行成功就完事,试着改参数、加注释、看报错,这是最好的学习方式
- 建立知识图谱:学完一章后,画出这一章在SLAM框架中的位置和作用
- 善用工具:使用Excalidraw、ProcessOn等工具绘制流程图,加深理解
- 多问为什么:比如"为什么旋转矩阵不能用加法?""为什么需要李代数?"
7.3 第一天总结
今天我们完成了《视觉SLAM十四讲》的逻辑脉络梳理 和环境搭建 。您不需要记住所有细节,但请务必记住这张 "大脑中的SLAM地图":
**传感器(相机/IMU)**读取数据 → 前端VO 估计相邻帧运动 → 后端优化 全局调整轨迹 → 回环检测 消除累积漂移 → 建图生成可用地图
而所有这些模块,都建立在第3-6讲的数学基础之上。
下一步计划 :
从明天(第二天)开始,我们将正式进入【第2讲与第3讲:初识SLAM与三维空间数学】的实战解析。我们会手把手教你写第一段SLAM代码,并彻底弄懂旋转矩阵和Eigen库的使用。
如果您准备好了,请评论区留言"开工",我们明天见!
📚 参考文献
1\] ProcessOn. 自主导航流程图\[EB/OL\]. 2026-02-05. \[2\] Prototype___. 视觉SLAM学习路线\[EB/OL\]. CSDN博客, 2023-01-01. \[3\] zfjbit. SLAM学习:视觉SLAM框架\[EB/OL\]. CSDN博客, 2019-07-11. \[4\] 视觉SLAM学习路线\[EB/OL\]. CSDN文库. \[5\] 高翔, 张涛, 等. 视觉SLAM十四讲:从理论到实践\[M\]. 电子工业出版社, 2017. \[6\] 程小六. 视觉惯性SLAM:理论与源码解析\[M\]. 电子工业出版社, 2022. \[7\] Stereolabs. VSLAM - Mapping Tutorial\[EB/OL\]. **版权声明**:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。