视觉SLAM十四讲:全攻略 —— 逻辑脉络、学习路线与Ubuntu 18.04实践准备

John Doe Lv2

📚 视觉SLAM十四讲:全攻略 —— 逻辑脉络、学习路线与Ubuntu 20.04实践准备

🎯 写在前面

本文是《视觉SLAM十四讲》的深度导读。我们将彻底解析全书的逻辑结构,拆解“数学基础”与“SLAM技术”两大模块的内在联系,并通过完整的流程图绘制,帮你建立起SLAM系统的整体认知。同时,针对选择 Ubuntu 20.04 作为学习环境的初学者,提供第一天必须完成的环境准备与思维导图。

📑 目录

1. 背景

在机器人及自动驾驶领域,SLAM(Simultaneous Localization and Mapping,同时定位与地图构建) 技术被誉为“皇冠上的明珠”。然而,对于初学者而言,SLAM 的门槛往往不在于单一的知识点,而在于如何将 数学理论(李群、优化)工程实践(C++、Linux、OpenCV) 融会贯通。

高翔等人所著的《视觉SLAM十四讲》正是这样一本“神书”,它打破了理论与实践的壁垒。但是,面对书中庞大的知识体系,很多读者在翻开第一页时就迷失了方向。

今天,作为学习的第一天,我们不做繁琐的公式推导,而是站在高处,俯瞰全貌。我会带您串联全书的目录结构,理清每一讲在SLAM系统中的“生态位”,并基于 Ubuntu 20.04 给出最稳妥的起手式。

2. 全书逻辑架构图

《视觉SLAM十四讲》的结构非常清晰,就像是在组装一个智能机器人。全书分为两大核心篇章:数学基础篇(第1~6讲)SLAM技术篇(第7~14讲)

下面是我绘制的全书逻辑架构图,清晰地展示了每一讲在整个SLAM系统中的位置和作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
graph TD
subgraph "第一部分:数学基础篇"
A1["第1讲:前言"] --> A2["第2讲:初识SLAM"]
A2 --> A3["第3讲:三维空间刚体运动<br>旋转矩阵/四元数/Eigen"]
A3 --> A4["第4讲:李群与李代数<br>Sophus/求导模型"]
A4 --> A5["第5讲:相机与图像<br>针孔模型/OpenCV/点云"]
A5 --> A6["第6讲:非线性优化<br>状态估计/Ceres/g2o"]
end

subgraph "第二部分:SLAM技术篇"
B1["第7讲:视觉里程计1-特征点法<br>ORB/对极几何/PnP/ICP"] --> B2["第8讲:视觉里程计2-直接法<br>光流/直接法/稀疏稠密"]
B2 --> B3["第9讲:实践章-设计前端<br>VO框架搭建/数据结构"]
B3 --> B4["第10讲:后端1-BA优化<br>Bundle Adjustment/g2o求解"]
B4 --> B5["第11讲:后端2-位姿图<br>Pose Graph/gtsam"]
B5 --> B6["第12讲:回环检测<br>词袋模型/DBoW3/相似度计算"]
B6 --> B7["第13讲:建图<br>单目稠密重建/八叉树地图"]
B7 --> B8["第14讲:现在与未来<br>开源方案对比/深度学习结合"]
end

A6 --> B1
B8 --> A1

style A1 fill:#f9f,stroke:#333,stroke-width:2px
style A2 fill:#f9f,stroke:#333,stroke-width:2px
style A3 fill:#bbf,stroke:#333,stroke-width:2px
style A4 fill:#bbf,stroke:#333,stroke-width:2px
style A5 fill:#bbf,stroke:#333,stroke-width:2px
style A6 fill:#bbf,stroke:#333,stroke-width:2px
style B1 fill:#bfb,stroke:#333,stroke-width:2px
style B2 fill:#bfb,stroke:#333,stroke-width:2px
style B3 fill:#bfb,stroke:#333,stroke-width:2px
style B4 fill:#bfb,stroke:#333,stroke-width:2px
style B5 fill:#bfb,stroke:#333,stroke-width:2px
style B6 fill:#bfb,stroke:#333,stroke-width:2px
style B7 fill:#bfb,stroke:#333,stroke-width:2px
style B8 fill:#f96,stroke:#333,stroke-width:2px

2. 学习路线图(修正版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
graph LR
subgraph "第一阶段:基础入门(第1-6讲)"
D1["第1-2讲<br>SLAM概述"] --> D2["第3讲<br>刚体运动/Eigen"]
D2 --> D3["第4讲<br>李代数/Sophus"]
D3 --> D4["第5讲<br>相机模型/OpenCV"]
D4 --> D5["第6讲<br>非线性优化/Ceres/g2o"]
end

subgraph "第二阶段:核心技术(第7-13讲)"
D5 --> E1["第7-8讲<br>前端VO<br>特征点法+直接法"]
E1 --> E2["第9讲<br>实践:设计前端"]
E2 --> E3["第10-11讲<br>后端优化<br>BA+位姿图"]
E3 --> E4["第12讲<br>回环检测"]
E4 --> E5["第13讲<br>建图"]
end

subgraph "第三阶段:进阶拓展"
E5 --> F1["第14讲<br>开源方案/未来"]
F1 --> F2["ORB-SLAM2/3<br>源码阅读"]
F2 --> F3["视觉惯性SLAM<br>VINS/ORB-SLAM3"]
end

【流程图解读】

  • 粉色部分(第1-2讲):SLAM的概述和入门,让你知道学什么、为什么学
  • 蓝色部分(第3-6讲):数学基础,打造SLAM的“兵器库”——包括刚体运动描述(第3讲)、优化求导工具(第4讲)、相机模型(第5讲)、非线性优化方法(第6讲)
  • 绿色部分(第7-13讲):SLAM核心技术,按照前端→后端→回环→建图的经典流程展开
  • 橙色部分(第14讲):展望未来,了解行业前沿

3. 经典视觉SLAM框架详解(附完整流程图)

经典视觉SLAM框架包含五个核心模块:传感器信息读取、前端视觉里程计、后端优化、回环检测、建图。下面这张完整的SLAM框架流程图,清晰地展示了各模块之间的关系和数据流向:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
graph TB
subgraph 传感器层
S1[相机<br>单目/双目/RGB-D] --> P[预处理<br>畸变校正/灰度化]
S2[IMU<br>惯性测量单元] --> P
end

subgraph 前端VO
P --> F1[特征提取<br>ORB/SIFT/FAST]
F1 --> F2[特征匹配<br>相邻帧关联]
F2 --> F3[运动估计<br>PnP/ICP/对极几何]
F3 --> F4[局部地图<br>构建与维护]
end

subgraph 后端优化
F4 --> B1[图优化框架<br>g2o/Ceres/GTSAM]
B2[回环约束] --> B1
B1 --> B3[全局位姿优化<br>Bundle Adjustment]
end

subgraph 回环检测
F2 --> L1[词袋模型<br>DBoW3字典]
L1 --> L2[相似度计算]
L2 --> L3[回环验证<br>几何一致性检查]
L3 --> B2
end

subgraph 建图
B3 --> M1[稀疏地图<br>路标点云]
B3 --> M2[稠密地图<br>深度估计/八叉树]
B3 --> M3[语义地图<br>目标识别+SLAM]
end

style S1 fill:#f9f,stroke:#333,stroke-width:2px
style S2 fill:#f9f,stroke:#333,stroke-width:2px
style F1 fill:#bbf,stroke:#333,stroke-width:2px
style F2 fill:#bbf,stroke:#333,stroke-width:2px
style F3 fill:#bbf,stroke:#333,stroke-width:2px
style B1 fill:#bfb,stroke:#333,stroke-width:2px
style L1 fill:#f96,stroke:#333,stroke-width:2px
style L2 fill:#f96,stroke:#333,stroke-width:2px
style M1 fill:#ffc,stroke:#333,stroke-width:2px
style M2 fill:#ffc,stroke:#333,stroke-width:2px

下面我们逐一拆解每个模块:

3.1 传感器信息读取

视觉SLAM的输入源主要包括:

  • 单目相机(Monocular):结构简单、成本低,但存在尺度不确定性,无法确定物体的真实大小
  • 双目相机(Stereo):通过基线估计深度,类似人眼,但计算量大,需要GPU/FPGA加速
  • 深度相机(RGB-D):通过ToF或结构光直接测量深度,室内效果好,但易受日光干扰
  • IMU(惯性测量单元):测量角速度和加速度,与视觉互补,提高鲁棒性

预处理步骤包括:图像畸变校正、灰度化、去噪、时间戳对齐等。

3.2 前端视觉里程计(VO)

VO的任务是估算相邻图像间相机的运动,以及建立局部地图。它包含以下子步骤:

  1. 特征提取:从图像中提取关键特征点(如ORB、SIFT、FAST)
  2. 特征匹配:在连续帧或多视角间进行特征匹配,获取相对运动信息
  3. 运动估计:利用匹配的特征点对,估计摄像头的相对位姿变化,常用方法包括PnP算法、EPnP、对极几何、ICP

VO只计算相邻时刻的运动,不关心历史信息,因此必然存在累积漂移——你会发现原本直的走廊变成了斜的,原本90°的直角变成了歪的。为消除漂移,我们需要回环检测和后端优化。

3.3 后端优化(Optimization)

后端接收前端估计的相机位姿和回环检测信息,通过非线性优化得到全局一致的轨迹和地图。主要工作包括:

  • 图优化:将位姿和地图点作为图的节点,通过优化算法(如最小二乘)最小化重投影误差
  • 关键帧选择与管理:为了提高计算效率,后端会选择关键帧进行优化,管理地图点的添加、删除
  • Bundle Adjustment(BA):同时优化相机位姿和地图点位置

后端处理的是带噪声的数据,目标是估计整个系统的状态及其不确定性——这被称为最大后验概率估计。

3.4 回环检测(Loop Closure)

回环检测的核心是判断机器人是否到达过先前的位置。它的作用:当检测到回环时,将信息提供给后端,后端把轨迹和地图调整到符合回环检测结果的样子,从而彻底消除累积漂移

实现方法:

  • 场景识别:通过图像描述子(如词袋模型Bag of Words、深度学习特征)识别当前帧是否与历史帧对应同一场景
  • 全局优化:一旦检测到闭环,通过全局图优化修正累计的定位误差

3.5 建图(Mapping)

根据估计的轨迹,建立与任务要求对应的地图。地图类型包括:

  • 度量地图:强调精确表示位置关系
    • 稀疏地图:由路标组成,计算量小,适合定位
    • 稠密地图:建模所有看到的东西,可用于导航,但存储量大
  • 拓扑地图:强调元素之间的关系(节点和边),不适用于复杂结构
  • 语义地图:将语义分割结果融入SLAM,构建带语义标签的地图

4. 相机模型与传感器(附分类对比图)

相机是视觉SLAM的“眼睛”。下面这张相机分类对比图,直观展示了不同类型相机的特点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
graph TD
subgraph 相机类型
A[视觉SLAM相机] --> B[单目相机 Monocular]
A --> C[双目相机 Stereo]
A --> D[深度相机 RGB-D]
A --> E[其他类型]
end

subgraph 单目特点
B --> B1[优点:结构简单/成本低]
B --> B2[缺点:尺度不确定性<br>无法确定真实深度]
B --> B3[原理:通过运动形成视差]
end

subgraph 双目特点
C --> C1[优点:可测深度/室内外通用]
C --> C2[缺点:计算量大/标定复杂]
C --> C3[原理:基线估计深度]
end

subgraph 深度相机特点
D --> D1[优点:直接测量深度/计算量小]
D --> D2[缺点:范围窄/易受日光干扰]
D --> D3[原理:ToF/结构光]
end

subgraph 其他类型
E --> E1[全景相机<br>360°视野]
E --> E2[事件相机<br>像素变化触发/响应快]
E --> E3[红外相机<br>夜视/多传感器融合]
end

style B fill:#f9f,stroke:#333,stroke-width:1px
style C fill:#bbf,stroke:#333,stroke-width:1px
style D fill:#bfb,stroke:#333,stroke-width:1px
style E fill:#f96,stroke:#333,stroke-width:1px

相机标定是必不可少的一步:

  • 内参标定:内参数矩阵,将相机坐标系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 基础环境配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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讲必备)

1
2
3
4
5
6
# Eigen3 可以通过 apt 直接安装(推荐)
sudo apt-get install -y libeigen3-dev

# 验证安装
dpkg -l | grep eigen
# 头文件位置:/usr/include/eigen3/

6.3 安装Sophus(第4讲必备)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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讲必备)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装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讲必备)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装依赖
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 克隆《十四讲》配套代码

1
2
3
4
5
6
7
8
9
# 克隆第一版代码(推荐)
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讲示例)

1
2
3
4
5
6
7
8
cd ~/projects/slambook_code/slambook/ch2

# 编译libHelloSLAM
cmake .
make

# 运行测试
./helloSLAM

如果看到”Hello SLAM”输出,恭喜你,环境配置成功!

7. 总结与学习建议

7.1 学习路线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
graph LR
subgraph "第一阶段:基础入门(第1-6讲)"
D1["第1-2讲<br>SLAM概述"] --> D2["第3讲<br>刚体运动/Eigen"]
D2 --> D3["第4讲<br>李代数/Sophus"]
D3 --> D4["第5讲<br>相机模型/OpenCV"]
D4 --> D5["第6讲<br>非线性优化/Ceres/g2o"]
end

subgraph "第二阶段:核心技术(第7-13讲)"
D5 --> E1["第7-8讲<br>前端VO<br>特征点法+直接法"]
E1 --> E2["第9讲<br>实践:设计前端"]
E2 --> E3["第10-11讲<br>后端优化<br>BA+位姿图"]
E3 --> E4["第12讲<br>回环检测"]
E4 --> E5["第13讲<br>建图"]
end

subgraph "第三阶段:进阶拓展"
E5 --> F1["第14讲<br>开源方案/未来"]
F1 --> F2["ORB-SLAM2/3<br>源码阅读"]
F2 --> F3["视觉惯性SLAM<br>VINS/ORB-SLAM3"]
end

7.2 学习建议

  1. 理论与实践交替进行:每学完一讲的数学理论,立刻运行配套代码,看代码如何实现理论
  2. 亲手调试代码:不要只运行成功就完事,试着改参数、加注释、看报错,这是最好的学习方式
  3. 建立知识图谱:学完一章后,画出这一章在SLAM框架中的位置和作用
  4. 善用工具:使用Excalidraw、ProcessOn等工具绘制流程图,加深理解
  5. 多问为什么:比如“为什么旋转矩阵不能用加法?”“为什么需要李代数?”

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 版权协议,转载请附上原文出处链接和本声明。

  • 标题: 视觉SLAM十四讲:全攻略 —— 逻辑脉络、学习路线与Ubuntu 18.04实践准备
  • 作者: John Doe
  • 创建于 : 2026-06-10 15:38:01
  • 更新于 : 2026-06-10 15:38:01
  • 链接: https://liu-big-github-io.vercel.app/2026/06/10/视觉SLAM十四讲:全攻略-——-逻辑脉络、学习路线与Ubuntu-18-04实践准备/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论