致敬高翔等所著《视觉SLAM十四讲:从理论到实践》(电子工业出版社,第一版 2017 年、第二版 2019 年)。本教程在保持原书"十四讲"框架的基础上,根据 2020 年以来人工智能(深度学习、神经渲染、3D 高斯泼溅、基础模型、大语言模型)的发展,重新撰写了一份面向当下的入门教程。

原书配套代码仓库(GitHub):


前言:为什么需要一本"AI 时代的十四讲"

高翔老师的《视觉SLAM十四讲》是中文世界最成功的 SLAM 入门书。它把"同时定位与建图"这件事拆成了十四讲,从数学基础(刚体运动、李群与李代数、非线性优化)一路讲到多视图几何、后端优化、回环检测、建图与工程实践。直到今天,这套"模块化、可解释、几何可验证"的框架依然是对的。

但 2020 年之后,SLAM 所在的整个视觉领域被 AI 重写了一遍:

所以这不是一本替代原书的新书,而是一本"续章":经典几何是骨架,AI 是肌肉。数学基础没有变,但实现方式、表示方法、工具链和评价标准都变了。

本教程的使用方法

每讲都按同一模板组织:

  1. 原书回顾——原书这一讲讲了什么,为什么它仍然重要;
  2. AI 时代的变与不变——这一块被 AI 改写了什么,哪些内核没有变;
  3. 核心方法与工具——现在业界实际在用什么;
  4. 动手实践——可复现的练习(尽量给命令,不做假数据、不跳过真实运行验证);
  5. 延伸阅读——论文与开源项目链接。

读者对象与前置知识

关于"讲义"来源的说明

GitHub 上高翔官方仓库提供的是原书配套源码(按章节分目录,如 ch2~`ch13`)与勘误表;书中各讲的视频讲解(B 站)配套的课件/PPT 可在视频评论区等渠道获取。本教程的十四讲结构对应原书第二版目录:

原书第二版 主题 本教程对应
第 1 讲 预备知识 第 1 讲
第 2 讲 初识 SLAM 第 2 讲
第 3 讲 三维空间刚体运动 第 3 讲
第 4 讲 李群与李代数 第 4 讲
第 5 讲 相机与图像 第 5 讲
第 6 讲 非线性优化 第 6 讲
第 7 讲 视觉里程计 1(特征点法) 第 7 讲
第 8 讲 视觉里程计 2(直接法) 第 8 讲
第 9 讲 后端 1(状态估计) 第 9 讲
第 10 讲 后端 2(位姿图) 第 10 讲
第 11 讲 回环检测 第 11 讲
第 12 讲 建图 第 12 讲
第 13 讲 实践:设计 SLAM 系统 第 13 讲
第 14 讲 SLAM:现在与未来 第 14 讲

第 1 讲 预备知识:AI 时代的工具箱

1.1 原书回顾

原书第一讲告诉你:本书需要 Linux、C++、CMake 和一点线性代数,然后带你在终端里写出第一个 Hello SLAM。这套基本功今天依然是"经典派"SLAM(ORB-SLAM3、VINS-Mono 等)的入场券。

1.2 变与不变

不变的:你需要一台能跑 Linux 的机器(或 WSL2/Docker),C++ 与 CMake 仍然统治经典 SLAM 代码,Eigen、Sophus、OpenCV、Ceres、g2o 这些库依然活跃。

变了的

1.3 AI 时代的工具清单

类别 工具 用途
语言/环境 Python 3.10+、C++17、conda、CMake 开发环境
深度学习 PyTorch(+ CUDA) 所有学习型 SLAM 的底座
经典视觉 OpenCV、Eigen、Sophus、Pangolin 图像处理、李代数、可视化
优化 Ceres、g2o、GTSAM 最小二乘、因子图、位姿图
李群(PyTorch 原生) PyPose 可微李群运算、状态估计
三维重建 COLMAP SfM / 稠密重建 / 相机标定
神经渲染 nerfstudio、gsplat NeRF / 3DGS 训练与渲染
定位管线 hloc 层次化视觉定位(学习型特征+几何验证)
机器人框架 ROS 2(如 Humble) 传感器数据、通信、部署
评测 evo ATE / RPE 轨迹评估

1.4 动手实践:10 分钟搭好环境

以下命令均使用国内镜像(按个人全局规则,依赖统一走国内镜像)。

# 1) 创建 conda 环境(清华镜像)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda create -n slam python=3.10 -y
conda activate slam

# 2) 安装 PyTorch(清华 PyPI 镜像;先装 CPU 版也可入门)
pip install torch torchvision --index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 3) 常用库
pip install opencv-python numpy scipy matplotlib pypose gtsam evo \
    --index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 4) 可选:nerfstudio / gsplat(后续建图讲用)
pip install gsplat nerfstudio --index-url https://pypi.tuna.tsinghua.edu.cn/simple

注意:--index-url--extra-index-url 不要混用 CUDA 源与清华源,避免冲突;PyTorch 官方 CUDA 轮子可从清华镜像的 pytorch-wheels 获取,具体以官方文档为准。

自查:在终端执行 python -c "import torch, cv2; print(torch.__version__, cv2.__version__)",能打印版本即环境就绪。


第 2 讲 初识 SLAM:从经典框架到学习型 SLAM

2.1 原书回顾

原书用小萝卜机器人的故事引入 SLAM(Simultaneous Localization and Mapping,同时定位与建图),并给出经典框架:

传感器数据 → 前端视觉里程计(VO) → 后端优化(Optimization) → 建图(Mapping)
                        ↓                    ↑
                   回环检测(Loop Closure) ──┘

经典 SLAM 的数学表述是两套方程:

这套表述今天依然成立,DROID-SLAM 的论文标题里依然写着 bundle adjustment。

2.2 AI 时代的全景图

AI 没有推翻上面的框架,而是把框架里的每个模块都换成了可学习的组件,并新增了一个"语义层":

模块 经典实现 AI 时代实现
特征提取 ORB / SIFT SuperPoint、DISK、XFeat
特征匹配 暴力匹配+比率检验 SuperGlue、LightGlue、LoFTR
深度来源 双目/RGB-D 传感器 传感器 + Depth Anything/Depth Pro 等学习型深度
前端位姿 PnP / ICP / 直接法 可微 BA(DROID-SLAM)、端到端 VO
后端优化 Ceres / g2o / GTSAM 可微优化层 + 经典因子图
回环检测 词袋 DBoW2 NetVLAD、AnyLoc(DINOv2 特征)
建图 点云 / 八叉树 / 网格 NeRF 隐式场、3D 高斯泼溅(3DGS)
语义 (原书基本没有) SAM + CLIP + VLM → 开放词汇场景图

2.3 三条主线

  1. 模块学习化(Learning Modules):用神经网络替换单个模块,几何后端不变。代表:SuperPoint+LightGlue 做前端、ORB-SLAM3 后端不动。
  2. 系统学习化(Learned Systems):把"前端+后端"作为一个整体训练。代表:DROID-SLAM(NeurIPS 2021)——用可微的稠密 BA 层做循环迭代更新,单目/双目/RGB-D 通用;DPVO(2022)——patch 级循环 VO。
  3. 表示革命(Representation Revolution):地图不再只是点/线/面,而是 NeRF(2020 年 ECCV 最佳论文)的隐式神经辐射场,或 3D Gaussian Splatting(SIGGRAPH 2023)的显式高斯集合。代表系统:SplaTAM、MonoGS、Photo-SLAM(均发表于 CVPR 2024)。

在这三条主线之上,还叠加了一条语义线:把 2D 基础模型(SAM 分割、CLIP 开放词汇)提升到 3D,构建可对话的场景图(如 ConceptGraphs,2023),让"建图"从几何走向理解。

2.4 动手实践:跑通两个代表性系统

# 经典派代表:ORB-SLAM3(C++,需要编译)
git clone --depth 1 https://github.com/UZ-SLAMLab/ORB_SLAM3.git   # 若网络慢可用 ghproxy 加速

# 学习派代表:DROID-SLAM(Python/PyTorch,官方权重在 release 中提供)
git clone --recursive https://github.com/princeton-vl/DROID-SLAM.git
cd DROID-SLAM
conda env create -f environment.yaml
conda activate droidenv
wget https://github.com/princeton-vl/DROID-SLAM/releases/download/1.0/droid.pth
python demo.py --imagedir=path/to/images --calib=path/to/calib.txt

跑通后对比:经典派在 CPU 上也能实时,学习派通常需要 GPU 但鲁棒性和轨迹精度更高(特别是在弱纹理、运动模糊场景)。

2.5 本讲小结

不变的是问题:状态估计、几何约束、全局一致性。变的是手段:表示从手工特征到学习特征,从稀疏几何到神经辐射场,从几何地图到语义场景图。后续各讲就是把这两句话展开。


第 3 讲 三维空间刚体运动:从 Eigen 到可微表示

3.1 原书回顾

原书这一讲建立整个 SLAM 的几何地基:点、向量与坐标系,旋转矩阵与欧氏变换,变换矩阵与齐次坐标,旋转向量、欧拉角与四元数,以及相似/仿射/射影变换。实践部分是 Eigen 与 Pangolin 可视化。

核心结论:三维刚体运动可以用

四者可以互相转换,Eigen 提供了完整实现。

3.2 AI 时代的变与不变

不变的:刚体运动的数学定义没有变,SLAM 里依然到处是 $\mathbf{R}$、$\mathbf{t}$、$\mathbf{T}$。

变了的

  1. 网络要输出旋转,这就带来了"旋转的参数化"问题。直接回归旋转矩阵不满足正交约束;回归四元数需要归一化且存在双覆盖;欧拉角不连续。实践中常见选择:
    • 轴角/李代数向量(6 维 SE(3) 或 3 维 so(3)),配合可微指数映射;
    • 六维连续旋转表示(Zhou et al., CVPR 2019);
    • 四元数回归 + 归一化。
  2. 库从 C++ 扩展到 Python/PyTorch:PyTorch3D 的 transforms、PyPose、so3/se3 系列包都提供了可微的旋转/位姿运算,可以直接参与反向传播。
  3. 等变与几何先验:SE(3)-等变网络(如把卷积换成可等变算子)让网络自带刚体运动的对称性,小数据也能学得更好——这是"几何 + 学习"的另一个结合点。
  4. 可视化:Pangolin 之外,Open3D、viser、nerfstudio 的 viewer 都能直接可视化轨迹与地图。

3.3 核心方法与工具

3.4 动手实践

# 用 PyPose 演示 SE(3) 变换(可微)
import torch, pypose as pp

# 轴角表示的旋转:绕 z 轴转 90 度
axis_angle = torch.tensor([[0.0, 0.0, 3.1415926 / 2.0]])
R = pp.so3(axis_angle).Exp().matrix()    # 可微旋转矩阵
T = pp.SE3([0.1, 0.2, 0.3, 0, 0, 0, 1]) # 平移 + 单位四元数
p = torch.tensor([[1.0, 0.0, 0.0]])
print((T @ p).t())                        # 变换后的点

自查:手算验证:绕 z 轴转 90°,点 (1,0,0) 应到约 (0,1,0) 再平移 (0.1,0.2,0.3)。

提示:这一讲的原书练习(Eigen 几何模块)建议完整做一遍——AI 时代你仍会经常在 C++ 里面对 Sophus::SE3d


第 4 讲 李群与李代数:从手推雅可比到可微优化

4.1 原书回顾

原书引入群的概念,给出旋转群 $SO(3)$ 与欧氏变换群 $SE(3)$ 对应的李代数 $\mathfrak{so}(3)$、$\mathfrak{se}(3)$,指数/对数映射,BCH 近似,以及两种求导方式:李代数求导与左扰动模型。实践是 Sophus 与轨迹误差评估。

为什么需要李代数:旋转矩阵上做加法会破坏正交性,而李代数(3 维向量)是"旋转的加法",可以在上面做优化和求导,最后用指数映射回到李群。

4.2 AI 时代的变与不变

不变的:扰动模型与 BCH 公式是位姿优化的地基——无论是 Ceres/g2o 里的经典 BA,还是 DROID-SLAM 的可微 BA,位姿更新都是在李代数上完成的。

变了的

  1. "位姿头"成为神经网络的标准件:网络输出 3 维 so(3) 或 6 维 se(3) 向量,再接一个可微的指数映射层得到 $\mathbf{T}$,最后喂给几何损失(重投影、渲染误差)。iNeRF、NeRF/3DGS 的位姿优化、端到端 VO 都是这个套路;
  2. 李群运算进了自动微分:PyPose(2022)在 PyTorch 中原生实现了 $SE(3)$、$\mathfrak{se}(3)$ 的运算与左/右扰动,手推雅可比变得可选;
  3. 李代数用于相机外参、IMU 与体姿态的统一表示,在视觉-惯性系统(VIO)里依然如此(VINS-Mono、ORB-SLAM3 的 IMU 预积分都离不开它);
  4. 分布与不确定性:在李代数上定义高斯分布("集中高斯"),成为学习型状态估计输出不确定性的标准做法。

4.3 动手实践

# PyPose:SE(3) 的指数映射与左扰动(可微)
import torch, pypose as pp

xi = torch.tensor([[0.05, -0.02, 0.1, 0.1, 0.0, 0.0]])   # se(3):平移速度 + 轴角
T = pp.se3(xi).Exp()                                     # 指数映射 → SE(3)
print(T)

# 左扰动:在 T 左边乘一个小扰动
delta = pp.se3([0.01, 0, 0, 0, 0, 0.01]).Exp()           # 左扰动变换
T_new = delta * T
print(T_new)

实际代码以 PyPose 官方文档为准;重点是理解"李代数向量 → 指数映射 → 位姿 → 对代价函数求导"这条链路,它就是可微 BA 的最小单元。

延伸阅读


第 5 讲 相机与图像:从针孔模型到 AI 深度传感器

5.1 原书回顾

原书讲针孔相机模型、畸变(径向+切向)、双目与 RGB-D 相机模型、图像在计算机中的表示,以及 OpenCV 实践:读图、去畸变、双目视差与 RGB-D 点云。

相机模型(内参 $\mathbf{K}$、畸变参数)是"像素 ↔ 射线"的桥梁,任何几何 SLAM 都绕不开。

5.2 AI 时代的变与不变

不变的:针孔模型、畸变校正、双目/RGB-D 传感器依然存在;标定依然是工程第一步。

变了的

  1. 单目相机也能给出"深度"了。2024 年以来零样本(zero-shot)单目深度估计大幅成熟:
    • Depth Anything / Depth Anything V2(2024):用大规模无标注数据训练的通用深度模型;
    • Metric3D、UniDepth(2024):预测带尺度的公制深度;
    • Depth Pro(ICLR 2025):亚秒级、高分辨率、公制深度,边界锐利。 这相当于给普通单目相机装上了"AI 深度传感器",直接改变了稠密建图(第 12 讲)与 RGB-only SLAM 的玩法;
  2. 相机模型进入可微渲染。NeRF / 3DGS 里,"相机位姿 + 内参 + 像素采样"是一条完整的可微计算图,位姿本身成为被优化的变量(iNeRF 的思想),甚至内参/畸变也可微求解(如 3DGS 相关工作的自标定);
  3. 图像不再是"像素",而是特征表示。DINOv2 等自监督 ViT 特征成为通用的跨任务表示(回环检测用、语义建图用、深度估计也用),原书"图像 = 灰度/彩色数组"的视角需要扩展;
  4. 新传感器兴起:事件相机(异步、高动态范围,配合学习型光流/位姿)、全景相机 + 学习型匹配、LiDAR-相机-IMU 多传感器融合成为量产(自动驾驶、机器人)标配。

5.3 核心方法与工具

5.4 动手实践

# 用 Depth Anything V2 估计单目深度(国内镜像获取权重)
git clone https://github.com/DepthAnything/Depth-Anything-V2.git   # 慢则用 ghproxy 加速
cd Depth-Anything-V2
pip install -r requirements.txt \
    --index-url https://pypi.tuna.tsinghua.edu.cn/simple
HUGGINGFACE_HUB_ENDPOINT=https://hf-mirror.com python run.py \
    --encoder vitl --img-path images/ --outdir depth_output/

在你自己拍的照片/视频帧上跑一次,观察:远处物体深度是否平滑、边缘是否锐利、尺度是否合理(Depth Pro 是公制,可直接读出米)。

提醒:学习型深度不是万能的(对运动模糊、镜面、动态物体仍会出错),工程上常与几何校验(左右目一致性、时间一致性)结合。


第 6 讲 非线性优化:从高斯牛顿到学习型优化器

6.1 原书回顾

原书从状态估计问题出发:批量状态估计 = 最大后验估计 = 最小二乘。然后讲一阶/二阶梯度法、高斯牛顿法(GN)、列文伯格-马夸尔特方法(LM),并给出三次曲线拟合实践:手写 GN、Ceres、g2o 各一遍。

核心思想:把残差 $e(x)$ 平方和 $\frac{1}{2}|e(x)|^2$ 在 $x$ 处展开,用雅可比近似海森矩阵,迭代求解:

$$x \leftarrow x + \Delta x, \qquad (J^T J + \lambda I)\Delta x = -J^T e$$

6.2 AI 时代的变与不变

不变的:GN/LM 依然是几何优化的主力(Ceres、g2o、GTSAM 每天都在跑),最小二乘框架本身没有过时。

变了的

  1. 自动微分取代手推雅可比:PyTorch 的 autograd、Ceres 的 AutoDiff、g2o 的模板化雅可比,让"手推雅可比"从必需技能降级为理解技能;
  2. 可微优化成为网络层:DROID-SLAM 把 BA 写成可微层(DBA),前向就是一次稠密 BA 迭代,反向把梯度传回特征网络——网络学会了"怎么更新位姿和深度",等价于学了一个 LM 更新器;
  3. 学习型优化器(Learning to Optimize):用循环网络(GRU/LSTM)预测每步更新量与置信度,替代手工设计的步长/阻尼。DROID-SLAM 的循环迭代是代表作;
  4. 去噪扩散模型做后处理:Marigold 等把扩散模型用于深度估计,利用生成先验补全弱纹理区域——本质是用"学习到的先验"约束优化;
  5. 概率视角深化:因子图 + 平滑与建图(SAM,Smoothing and Mapping)仍然是 SLAM 后端的标准工具箱(GTSAM 是经典实现),学习型模块负责提供因子与不确定性,GTSAM 负责推理。

6.3 动手实践

# 用 PyTorch 手写高斯牛顿解曲线拟合(对应原书 6.3.1)
import torch

t = torch.linspace(0, 1, 100)
true = torch.exp(-2.0 * t) * torch.sin(5.0 * t)
y = true + 0.05 * torch.randn_like(true)

# 模型:y = a*exp(-b*t)*sin(c*t + d)
params = torch.tensor([1.0, 1.0, 5.0, 0.0], requires_grad=True)
for _ in range(50):
    a, b, c, d = params
    pred = a * torch.exp(-b * t) * torch.sin(c * t + d)
    e = pred - y
    J = torch.autograd.functional.jacobian(
        lambda p: p[0] * torch.exp(-p[1] * t) * torch.sin(p[2] * t + p[3]),
        params,
    )
    H = J.t() @ J + 1e-6 * torch.eye(4)      # 加阻尼近似 LM
    g = J.t() @ e
    step = torch.linalg.solve(H, -g)
    with torch.no_grad():
        params += step
    print(f"iter={_}, loss={e.square().mean().item():.5f}")

然后对比:同一问题用 Ceres(C++)或 g2o 再解一遍,体会自动微分与稀疏结构。

延伸阅读


第 7 讲 视觉里程计 1:特征点法的 AI 升级

7.1 原书回顾

原书这一讲是全书最"工程"的一讲:ORB 特征的提取与匹配;2D-2D 对极几何(本质矩阵、单应矩阵);三角测量;3D-2D 的 PnP(DLT、P3P、最小化重投影误差);3D-3D 的 ICP(SVD 与非线形优化);以及 RANSAC 与外点处理。

这些是"特征点法 VO"的完整拼图,今天的 ORB-SLAM3 前身就是这套流程。

7.2 AI 时代的变与不变

不变的:多视图几何公式一条没变——对极约束 $\mathbf{E}$ 分解、三角化、PnP、ICP、BA 仍是学习型 SLAM 的"几何层"。DROID-SLAM 名字里的 BA 就是 bundle adjustment。

变了的

  1. 特征提取被学出来了
    • SuperPoint(2018):自监督学习的角点+描述子,单张图出关键点与描述子;
    • DISK(NeurIPS 2020):用策略梯度学习特征;
    • ALIKE、XFeat:轻量、实时、适合嵌入式。
  2. 匹配器变成图网络/Transformer
    • SuperGlue(CVPR 2020):图神经网络做关键点匹配,给出可学习置信度;
    • LightGlue(2023):SuperGlue 的加速版,更快更省显存;
    • LoFTR(CVPR 2021):无检测器的稠密匹配(Transformer,擅长弱纹理);
    • DKM:更高精度的稠密匹配。
  3. 定位管线 hloc:用学习型特征/匹配器 + 经典几何验证(RANSAC + PnP)做视觉定位,是目前最实用的"混合"范式;
  4. 端到端位姿回归:直接回归 6-DoF 位姿(如 PoseNet 系),精度仍不如几何法,但"深度学习输出初始值 + 几何精化"非常常见(NeRF/3DGS 定位也用)。

7.3 关键对比表

环节 经典(原书) 学习型
检测器 ORB / FAST SuperPoint / DISK / ALIKE
描述子 ORB 二进制 SuperPoint / DINOv2 特征
匹配 Hamming 距离 + 比率检验 SuperGlue / LightGlue / LoFTR
位姿求解 8 点法 / PnP + RANSAC 同样用 PnP + RANSAC(几何层不变)
端到端替代 —— 位姿回归网络、可微 BA

7.4 动手实践:用 LightGlue 替换 ORB

# kornia 内置 SuperPoint + LightGlue,几行代码完成匹配
pip install kornia --index-url https://pypi.tuna.tsinghua.edu.cn/simple
import cv2, torch, kornia as K
from kornia.feature import LoFTR

img0 = K.io.load_image("0.png", K.io.ImageLoadType.RGB32)[None] / 255.0
img1 = K.io.load_image("1.png", K.io.ImageLoadType.RGB32)[None] / 255.0

matcher = LoFTR(pretrained="indoor_new")   # 或用 SuperPoint+LightGlue
with torch.inference_mode():
    out = matcher({"image0": img0, "image1": img1})
print("matches:", out["keypoints0"].shape)

然后在你自己拍的连续帧上,用 RANSAC 求本质矩阵,再与 ORB 版结果对比匹配数与内点率。


第 8 讲 视觉里程计 2:从直接法与光流到可微 BA

8.1 原书回顾

原书先讲光流(LK 光流,亮度不变假设),再讲直接法:不提取特征,直接优化光度误差,包括单层与多层(金字塔)直接法,并总结直接法的优缺点(快、可用弱纹理,但怕光照变化、怕运动大)。

8.2 AI 时代的变与不变

不变的:"不用显式特征、直接在像素/块层面优化"的思想,以及光流是"像素级对应"的观点。

变了的

  1. 光流被深度网络取代:RAFT(ECCV 2020)用循环更新 + 相关体(correlation volume)做稠密光流,成为后续大量系统的骨干;GMFlow 等进一步加速。原书的 LK 手工迭代退居教材地位;
  2. DROID-SLAM(NeurIPS 2021):直接法的"AI 完全体"——
    • 用可训练的网络提取帧间特征并构建 4D 相关体;
    • 用循环网络迭代预测"位姿 + 逆深度"的更新;
    • 更新由可微的稠密 BA 层执行(DBA),等价于学习了一个 LM 迭代器;
    • 单目视频上训练,可泛化到双目/RGB-D(官方开源,PyTorch 实现);
  3. DPVO(2022):把 DROID 的思想稀疏化——只跟踪 patch,用循环网络迭代,轻量且快,适合嵌入式/低算力;
  4. 光度假设 → 特征相似度假设:学习型方法不再依赖"同一世界点的像素亮度不变",而是在学出来的特征空间里做对应,天然更抗光照变化;
  5. 稠密化:学习型方法输出稠密深度图,直接桥接前端与稠密建图(第 12 讲)。

8.3 动手实践

# DROID-SLAM 官方 demo(权重 droid.pth 从 GitHub Release 下载)
cd DROID-SLAM
conda activate droidenv
python demo.py --imagedir /path/to/sequence --calib /path/to/calib.txt

观察输出:它能输出每帧位姿 + 稠密深度图;再用官方评估脚本在 EuRoC / TUM 上算 ATE,与 ORB-SLAM3 对比。注意:单目结果没有绝对尺度,这是单目几何的固有属性(除非用学习型公制深度约束)。


第 9 讲 后端 1:从 EKF 到可微状态估计

9.1 原书回顾

原书把后端建模成概率问题:状态估计 = 贝叶斯推断;线性高斯系统用卡尔曼滤波(KF),非线性系统用扩展卡尔曼滤波(EKF)或非线性最小二乘(批量 MAP)。实践是 Ceres/g2o 的 BA 与曲线拟合。

两个重要观点:

9.2 AI 时代的变与不变

不变的:BA 依然是后端的核心;稀疏线性代数(Schur 消元等)依然决定性能;因子图(GTSAM)依然是标准工具箱。

变了的

  1. 可微 BA 层(DBA):DROID-SLAM 把 BA 变成网络的一部分(稠密 BA 层),梯度可以穿过优化回到特征提取网络——"估计器本身被学习";
  2. 学习型不确定性:网络输出每帧/每点的协方差或权重,喂给优化器,等价于自适应加权最小二乘(例如动态场景下的不确定性感知 BA);
  3. 端到端状态估计器:直接把"多帧图像 → 位姿序列 + 深度"作为一个可微图训练(DROID-SLAM、DPVO 都是),滤波/优化被"学出来的迭代规则"取代;
  4. 学习先验约束优化:用扩散模型或学习深度作为先验项(如 NeRF-SLAM 用学习深度 + 几何融合),让后端从"纯几何"变成"几何 + 先验";
  5. 概率深度学习(Probabilistic Deep Learning):在李代数上输出分布、用变分/贝叶斯方法处理不确定性,是当前研究热点。

9.3 动手实践

# 因子图最小例子(GTSAM)——仍是工业界后端主流
pip install gtsam --index-url https://pypi.tuna.tsinghua.edu.cn/simple
import gtsam

graph = gtsam.NonlinearFactorGraph()
prior = gtsam.PriorFactorPose2(gtsam.symbol('x', 0), gtsam.Pose2(0, 0, 0),
                                gtsam.noiseModel.Diagonal.Sigmas([0.1, 0.1, 0.1]))
graph.add(prior)
graph.add(gtsam.BetweenFactorPose2(gtsam.symbol('x', 0), gtsam.symbol('x', 1),
                                   gtsam.Pose2(1, 0, 0),
                                   gtsam.noiseModel.Diagonal.Sigmas([0.1, 0.1, 0.1])))
init = gtsam.Values(); init.insert(gtsam.symbol('x', 0), gtsam.Pose2(0, 0, 0))
init.insert(gtsam.symbol('x', 1), gtsam.Pose2(0.9, 0.1, 0.0))
result = gtsam.LevenbergMarquardtOptimizer(graph, init).optimize()
print(result)

练习:理解"先验因子 + 相对运动因子 → 最优位姿"就是 SLAM 后端的核心模式;然后把 DROID-SLAM 的 DBA 层当作"学习型因子/更新器"对比理解。


第 10 讲 后端 2:位姿图与全局一致性

10.1 原书回顾

原书第 10 讲(第二版)讲位姿图(Pose Graph):把关键帧位姿作为节点、相对运动与回环作为边,用 g2o 优化,代码示例是 sphere.g2o 数据集与 pose_graph_g2o_SE3。核心是:局部 VO 累积误差 → 回环提供全局约束 → 图优化摊平漂移。

10.2 AI 时代的变与不变

不变的:位姿图/因子图的数学与工具(g2o、GTSAM)没有变,全局一致的建图仍然靠它们。

变了的

  1. 回环边的质量由学习型模块提供:回环候选来自学习型地点识别(第 11 讲),几何验证用学习型匹配(第 7 讲),边的协方差/置信度可以来自网络输出;
  2. 可微图优化:PyPose 提供基于 PyTorch 的位姿图优化(pypose.optim),可以端到端训练;图神经网络(GNN)也被用于学习图优化的迭代规则;
  3. 子图合并与层级高斯:大规模 3DGS 建图采用"层级/分块"策略(如 GigaSLAM,2025),把多个子图在全局坐标系下对齐,与经典"多地图 SLAM"(ORB-SLAM3 的 Atlas)思想同源但表示不同;
  4. 神经表示的全局对齐:NeRF/3DGS 地图之间的对齐(相对位姿估计 + 渲染损失)成为新问题(如 iNeRF 类方法),本质仍是位姿图 + 学习型观测模型;
  5. 动态场景:动态物体被分割(SAM 等)后在优化中降权或剔除,避免污染全局一致性。

10.3 动手实践

# 用 PyPose 的位姿图优化接口解原书的 sphere.g2o 数据(或小规模合成图)
python - <<'PY'
import torch, pypose as pp
# 见 https://pypose.org 的 pose graph optimization 教程
PY

也可直接编译原书第二版 ch10/pose_graph_g2o_SE3.cpp,观察位姿图优化前后轨迹的平滑度。然后把"回环边的来源"从手工输入换成 AnyLoc/NetVLAD 的检索结果,做一次"学习型回环 + 经典图优化"的混合实验。


第 11 讲 回环检测:从词袋到基础模型

11.1 原书回顾

原书讲回环检测的意义(消除累积漂移、保证全局一致),以及词袋模型(BoW):提取特征 → 聚类成"视觉单词" → TF-IDF 加权 → 用向量相似度找候选回环,并用准确率/召回率评价。实践是 DBoW2 与 loop_closure.cpp

11.2 AI 时代的变与不变

不变的:"检索候选 + 几何验证"的两段式流程不变;准确率-召回率仍是核心指标;"地点识别(Visual Place Recognition, VPR)"是独立的研究领域。

变了的

  1. 从词袋到 CNN 聚合描述子:NetVLAD(CVPR 2016)用 CNN 特征 + 可微 VLAD 聚合,弱监督训练,成为 VPR 的基准;
  2. 专用 VPR 模型持续刷新:Patch-NetVLAD、CosPlace(2022)、SALAD、EigenPlaces、MixVPR 等,在跨视角/跨季节任务上大幅超越词袋;
  3. 基础模型直接做地点识别:AnyLoc(2023)发现,用自监督预训练的 DINOv2 特征 + 无监督聚合(VLAD/GeM),无需任何 VPR 微调就能跨环境、跨季节、跨视角工作——这是"foundation model 取代专用训练"的典型例子;
  4. 语义与语言辅助:VLM 可以把地点描述成自然语言("有红色消防栓的拐角"),或与检索结果交叉验证;开放词汇场景图(第 12 讲)也可作为回环的语义先验;
  5. 几何验证升级:候选帧的位姿验证从 ORB+RANSAC 变成学习型匹配(SuperPoint+LightGlue)+ RANSAC,精度与内点率更高。

11.3 动手实践

# AnyLoc 官方仓库(Python,DINOv2 特征 + VLAD)
git clone https://github.com/AnyLoc/AnyLoc.git
cd AnyLoc
pip install -r requirements.txt
# 用自己的两段视频(同一区域、不同季节/视角)做回环检索
python extract_features.py --dataset_root $DATA --save_dir $OUT
python test_anyloc.py --dataset_root $DATA --save_dir $OUT

具体命令以 AnyLoc 官方 README 为准。对比体验:经典 DBoW2 在视角/光照变化大时召回率骤降,AnyLoc 类方法明显更稳;把检索到的候选丢给 PnP+RANSAC 做几何验证,就是完整的 AI 时代回环检测。


第 12 讲 建图:从点云到神经表示与语义地图

12.1 原书回顾

原书讲稀疏与稠密建图、单目稠密重建(极线搜索与块匹配)、RGB-D 稠密建图、八叉树地图(OctoMap)与点云/网格。核心思想:地图要有"可用性"(导航、避障、展示)。

12.2 AI 时代的变与不变

不变的:地图要服务下游任务;稠密建图仍然要解决"像素 → 3D 点/体素"的对应与融合问题。

变了的:地图表示被 AI 重写,出现了三大流派:

  1. 隐式神经表示(NeRF 类)
    • iMAP(ICCV 2021):第一个实时神经隐式 SLAM;
    • NICE-SLAM(CVPR 2022):分块隐式编码,可扩展;
    • Co-SLAM(CVPR 2023)、Point-SLAM(ICCV 2023)、NeRF-SLAM(2022):进一步提升质量/速度;
    • 优点:连续、可微分、可渲染新视角;缺点:难以直接做导航。
  2. 3D 高斯泼溅(3DGS 类)——当前最热
    • 3DGS 本身(SIGGRAPH 2023):用一堆可微的 3D 高斯(位置、协方差、颜色、不透明度)表示场景,实时渲染;
    • SplaTAM(CVPR 2024):RGB-D 实时高斯 SLAM,跟踪+建图一体化;
    • MonoGS / Gaussian Splatting SLAM(CVPR 2024):单目也能跑;
    • Photo-SLAM(CVPR 2024):单目/双目/RGB-D 通用的"照片级真实"SLAM;
    • 优点:显式(可修改、可做几何查询)、渲染快、质量高;缺点:内存占用大、大规模场景仍在研究(层级/分块高斯,如 GigaSLAM)。
  3. 语义/开放词汇地图
    • 用 SAM 做类无关分割,把 CLIP / DINOv2 / VLM 特征提升到 3D;
    • ConceptGraphs(2023):在 SLAM 地图上构建开放词汇 3D 场景图(对象为节点、关系为边),支持语言查询与任务规划;
    • LangSplat(CVPR 2024)、Gaussian Grouping、Feature 3DGS:把语言特征直接绑到高斯上,实现"指哪儿问哪儿";
    • 应用:机器人"找到蓝色的马克杯"、"把咖啡放在桌子的左边"。

另外,学习型单目深度(第 5 讲) 让"单目稠密建图"从难啃的极线搜索变成"深度估计 + 融合",NeRF-SLAM 就是"学习深度 + 神经融合"的产物。

12.3 动手实践

# 用 nerfstudio 训练 3DGS(先用 COLMAP 跑通 SfM 得到位姿)
conda create -n nerfstudio python=3.10 -y && conda activate nerfstudio
pip install nerfstudio --index-url https://pypi.tuna.tsinghua.edu.cn/simple
ns-train splatfacto --data /path/to/your/images

# 或直接跑 Photo-SLAM(GitHub 有官方仓库与 docker)

建议实验:用手机围绕一个房间拍 50~100 张照片,COLMAP 出位姿,然后:① 训练 3DGS 渲染新视角;② 对比 nerfstudio 里 NeRF 与 Splatfacto(3DGS)的训练时间与渲染质量。


第 13 讲 实践:设计一个 AI 时代的 SLAM 系统

13.1 原书回顾

原书第 13 讲(第二版)带读者从零设计一个 SLAM 系统:模块划分(前端/后端/回环/建图)、线程与通信、参数配置、数据集回放与评测(ATE/RPE)。核心工程观:先搭骨架跑通,再逐模块精化

13.2 AI 时代的设计决策

动手前先回答三个问题:

  1. 架构:经典、混合还是端到端?
    • 经典(ORB-SLAM3):CPU 实时、可解释、工程成熟;
    • 混合(推荐入门):学习型特征/深度/回环 + 经典几何后端,精度与工程性平衡;
    • 端到端(DROID-SLAM 类):精度高但需要 GPU 与训练数据。
  2. 地图表示:几何还是神经?
    • 导航/避障 → 八叉树、TSDF、3DGS 的几何层;
    • 可视化/数字孪生 → NeRF / 3DGS 神经渲染;
    • 机器人理解/交互 → 语义场景图。
  3. 数据与评测:在哪里训练、在哪里验收?
    • 训练/测试集:TartanAir(合成,适合学习型 VO)、ScanNet、Replica(室内 RGB-D)、TUM RGB-D、EuRoC MAV(视觉-惯性)、KITTI(自动驾驶);
    • 指标:ATE(绝对轨迹误差)、RPE(相对位姿误差),用 evo 工具统一评测;
    • 真实环境验收(按全局规则):必须真机/真数据跑通才算完成,不能只靠离线测试。

13.3 推荐的最小完整项目

用 RGB-D 摄像头(或 TUM 公开数据)搭一个"AI 时代迷你 SLAM":

输入 RGB-D 序列
  → 学习型特征/稠密深度(SuperPoint + Depth Anything 等)
  → 前端:PnP / ICP(几何层)
  → 后端:GTSAM 位姿图(经典)
  → 回环:NetVLAD / AnyLoc 检索 + RANSAC 验证
  → 建图:3DGS(nerfstudio/gsplat)或 TSDF(Open3D)
  → 评测:evo 对比轨迹,可视化渲染结果

每完成一个模块就用真实数据跑通并记录:特征提取耗时、匹配内点率、位姿误差、渲染 PSNR。整个过程不超过两周,就能形成"经典几何 + AI 组件 + 神经地图"的完整认知。


第 14 讲 AI 时代 SLAM 的现在与未来

14.1 原书回顾

原书最后一讲介绍当时的主流开源方案(ORB-SLAM 系列、LSD-SLAM、SVO、DSO、RTAB-Map、VINS-Mono 等)并展望:传感器小型化、与深度学习结合、多传感器融合、大场景在线建图。

14.2 现在的格局(2025 年前后)

经典派仍在进化:ORB-SLAM3(IEEE TRO 2021)支持单目/双目/RGB-D/视觉-惯性与多地图 Atlas,依然是工程基线;DSO、VINS-Fusion 等继续用于量产(无人机、车载)。

学习派已经上桌:DROID-SLAM、DPVO 在多个基准上刷新精度;学习型特征(SuperPoint/LightGlue)、学习型深度(Depth Anything V2 / Depth Pro)、学习型回环(AnyLoc)已经是工程实践中可选项。

表示派改变玩法:NeRF/3DGS 让"建图"从几何到照片级真实;SplaTAM、MonoGS、Photo-SLAM 等把 SLAM 与实时渲染打通;语义与开放词汇地图让机器人能"理解"环境。

14.3 未来的方向

  1. 基础模型全面渗透(Foundation Models Everywhere):DINOv2、SAM2、VLM 成为 SLAM 各组件的通用底座;出现"一句话描述环境、模型直接给出几何+语义地图"的端到端系统;
  2. 实时大场景 3DGS:层级/分块/流式高斯(如 GigaSLAM),配合设备端算力优化(TensorRT/ONNX/移动端),走向 AR/VR 与数字孪生;
  3. 动态与 4D:把动态物体、人、车纳入地图(4D 高斯、时序表示),服务自动驾驶与具身交互;
  4. 具身智能(Embodied AI):SLAM 成为机器人"感知-规划-行动"闭环的地基;语言指令 → 开放词汇地图 → 任务规划 → 导航执行,ConceptGraphs 已是雏形;
  5. 长期鲁棒与自适应:季节/光照/视角变化、退化环境(走廊、隧道)、传感器退化下的鲁棒性,仍是学习型与几何型共同挑战;
  6. 可信与隐私:可解释性、不确定性量化、地图数据的所有权与隐私(去标识化、本地化推理)。

14.4 给入门者的学习路线图

数学基础(线性代数/概率/优化)
  → 原书十四讲(经典 SLAM,务必先学)
  → PyTorch 深度学习基础
  → 学习型组件逐个替换(特征→深度→光流→回环)
  → 神经渲染(NeRF → 3DGS → 对应 SLAM 系统)
  → 语义与大模型(SAM/CLIP/VLM → 场景图)
  → 系统集成与真实环境部署

14.5 资源清单

经典必读

论文(按主题,均可从 arXiv 检索):

工具:PyTorch、OpenCV、COLMAP、g2o/Ceres/GTSAM、PyPose、nerfstudio、gsplat、hloc、evo、ROS 2。

会议:CVPR / ICCV / ECCV / NeurIPS / ICRA / IROS / 3DV / RSS。


结语

《视觉SLAM十四讲》教会了我们一套"会算账"的几何框架;AI 时代的新工具让这套框架更鲁棒、更稠密、更有语义。学 SLAM 最忌讳两件事:只学经典而不碰 AI,或只跑 AI 模型而不懂几何。把两者拼起来,你就能造出真正能用的系统。

最后,按工程准则提醒:所有涉及真实运行的功能,请在真实环境(真机、真实传感器数据)中验证后再宣称完成;命令行测试只是辅助。


附录 A 环境搭建速查(国内镜像)

统一原则:所有依赖下载走国内镜像源。

# 1. conda(清华源)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

# 2. pip(清华源,全局生效)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 3. PyTorch 安装:优先用清华镜像的 pytorch-wheels
#    (不要与官方 --index-url 混用,详见 PyTorch 官方文档)

# 4. HuggingFace 模型权重(hf-mirror)
$env:HUGGINGFACE_HUB_ENDPOINT="https://hf-mirror.com"

# 5. GitHub 仓库克隆加速(ghproxy 等国内代理,按需使用)
#    git clone https://ghproxy.com/https://github.com/xxx/yyy.git

# 6. ROS 2(apt 清华源)
#    修改 /etc/apt/sources.list.d/ros2.sources,将 packages.ros.org 替换为
#    https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/

# 7. Docker 镜像加速
#    在 Docker Desktop 设置里配置 registry-mirrors 为国内加速地址(如阿里云/中科大)

附录 B 数据集与基准

数据集 特点 典型用途
TUM RGB-D 室内手持 RGB-D,含动态序列 稠密 SLAM、RGB-D 评测
EuRoC MAV 微型飞行器双目+IMU 视觉惯性 SLAM
KITTI 车载双目/LiDAR/GNSS 自动驾驶 SLAM、深度
TartanAir 大规模合成(飞行器) 学习型 VO/SLAM 训练与评测
ScanNet 室内 RGB-D 带语义标注 语义建图、神经重建
Replica 高精度室内网格 神经 SLAM 评测(NeRF/3DGS)
ScanNet++ 更大规模室内多模态 神经重建、大场景

评测指标:ATE(Absolute Trajectory Error,绝对轨迹误差)、RPE(Relative Pose Error,相对位姿误差),推荐用 evo 一键评测与绘图。

附录 C 开源项目清单

经典 SLAM

学习型 SLAM / VO

特征与匹配

深度估计

回环 / 地点识别

神经渲染 / 神经 SLAM

语义 / 场景图

后端 / 工具

附录 D 术语速查

术语 说明
SLAM 同时定位与建图(Simultaneous Localization and Mapping)
VO 视觉里程计(Visual Odometry),前端相对位姿估计
BA 捆绑调整(Bundle Adjustment),联合优化位姿与地图点
DBA 可微捆绑调整(Differentiable Bundle Adjustment),DROID-SLAM 的稠密 BA 层
NeRF 神经辐射场(Neural Radiance Fields),隐式场景表示
3DGS 3D 高斯泼溅(3D Gaussian Splatting),显式场景表示
VPR 视觉地点识别(Visual Place Recognition),回环检测的学名
ATE / RPE 绝对轨迹误差 / 相对位姿误差
VLM / LLM 视觉语言模型 / 大语言模型
SAM Segment Anything,类无关分割模型
TSDF / OctoMap 截断符号距离函数 / 八叉树地图,经典稠密表示

本文档为入门教程,内容基于公开论文、开源项目与官方文档整理;引用年份以论文/项目发布时间为准。安装命令请以对应官方文档的最新版本为准。