致敬高翔等所著《视觉SLAM十四讲:从理论到实践》(电子工业出版社,第一版 2017 年、第二版 2019 年)。本教程在保持原书"十四讲"框架的基础上,根据 2020 年以来人工智能(深度学习、神经渲染、3D 高斯泼溅、基础模型、大语言模型)的发展,重新撰写了一份面向当下的入门教程。
原书配套代码仓库(GitHub):
前言:为什么需要一本"AI 时代的十四讲"
高翔老师的《视觉SLAM十四讲》是中文世界最成功的 SLAM 入门书。它把"同时定位与建图"这件事拆成了十四讲,从数学基础(刚体运动、李群与李代数、非线性优化)一路讲到多视图几何、后端优化、回环检测、建图与工程实践。直到今天,这套"模块化、可解释、几何可验证"的框架依然是对的。
但 2020 年之后,SLAM 所在的整个视觉领域被 AI 重写了一遍:
- 特征与匹配被学出来了。ORB 这类手工特征,被 SuperPoint、DISK、LightGlue、LoFTR 等学习型特征与匹配器超越;
- 深度可以直接估计了。Depth Anything、Depth Pro 等模型在任意图像上给出稠密(甚至公制)深度,相当于给单目相机装上了"AI 深度传感器";
- 优化可以被学习。DROID-SLAM 把捆绑调整(BA)做成了可微网络层,用循环网络学出来的更新规则迭代位姿与深度;
- 地图的表示被重写了。从稀疏点云、稠密网格,到 NeRF 的隐式神经辐射场,再到 3D 高斯泼溅(3DGS)的实时显式表示;
- 地图有了语义与语言。SAM 分割万物、CLIP 提供开放词汇,大模型(LLM/VLM)让机器人能够"看懂并描述"它建出来的地图,地图从几何体变成了可对话的场景图;
- 回环检测用上了基础模型。NetVLAD 之后,AnyLoc 直接用 DINOv2 特征做跨环境、跨季节、跨视角的地点识别,无需重新训练。
所以这不是一本替代原书的新书,而是一本"续章":经典几何是骨架,AI 是肌肉。数学基础没有变,但实现方式、表示方法、工具链和评价标准都变了。
本教程的使用方法
每讲都按同一模板组织:
- 原书回顾——原书这一讲讲了什么,为什么它仍然重要;
- AI 时代的变与不变——这一块被 AI 改写了什么,哪些内核没有变;
- 核心方法与工具——现在业界实际在用什么;
- 动手实践——可复现的练习(尽量给命令,不做假数据、不跳过真实运行验证);
- 延伸阅读——论文与开源项目链接。
读者对象与前置知识
- 会用 Python 和 C++ 写基本程序;
- 学过线性代数、微积分、一点概率论;
- 没有 SLAM 基础也可以,但建议先泛读原书第二版第一、二讲建立直觉。
关于"讲义"来源的说明
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 这些库依然活跃。
变了的:
- Python 成为第一语言。绝大多数 AI SLAM 系统(DROID-SLAM、DPVO、SplaTAM、MonoGS、Photo-SLAM)都是 Python + PyTorch 写的;
- GPU 变得重要。神经网络的训练和推理依赖 CUDA;没有 NVIDIA GPU 也能学经典部分,但学习型部分会受限(也可用 CPU 跑小模型);
- 容器化成为常态。Docker 让"装环境"从几天变成几十分钟;
- 国内下载一律走镜像(conda/pip 清华源、HuggingFace hf-mirror、GitHub 加速代理、ROS apt 清华源等)。
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 的数学表述是两套方程:
- 运动方程:$x_k = f(x_{k-1}, u_k) + w_k$(状态 x 如何随控制 u 演化);
- 观测方程:$z_k = h(x_k, y_j) + v_k$(状态 x 与路标 y 如何产生观测 z);
- 后端要做的,是在噪声 w、v 存在时估计状态 x 与路标 y——也就是一个状态估计问题,最终落到最大后验(MAP)与最小二乘。
这套表述今天依然成立,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 三条主线
- 模块学习化(Learning Modules):用神经网络替换单个模块,几何后端不变。代表:SuperPoint+LightGlue 做前端、ORB-SLAM3 后端不动。
- 系统学习化(Learned Systems):把"前端+后端"作为一个整体训练。代表:DROID-SLAM(NeurIPS 2021)——用可微的稠密 BA 层做循环迭代更新,单目/双目/RGB-D 通用;DPVO(2022)——patch 级循环 VO。
- 表示革命(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 可视化。
核心结论:三维刚体运动可以用
- 旋转矩阵 $\mathbf{R} \in SO(3)$ 与平移 $\mathbf{t}$,合起来是变换矩阵 $\mathbf{T} \in SE(3)$;
- 旋转向量(轴角)$\theta\mathbf{n}$;
- 欧拉角(注意万向锁);
- 四元数 $\mathbf{q}$(紧凑、无奇异性、适合插值)。
四者可以互相转换,Eigen 提供了完整实现。
3.2 AI 时代的变与不变
不变的:刚体运动的数学定义没有变,SLAM 里依然到处是 $\mathbf{R}$、$\mathbf{t}$、$\mathbf{T}$。
变了的:
- 网络要输出旋转,这就带来了"旋转的参数化"问题。直接回归旋转矩阵不满足正交约束;回归四元数需要归一化且存在双覆盖;欧拉角不连续。实践中常见选择:
- 轴角/李代数向量(6 维 SE(3) 或 3 维 so(3)),配合可微指数映射;
- 六维连续旋转表示(Zhou et al., CVPR 2019);
- 四元数回归 + 归一化。
- 库从 C++ 扩展到 Python/PyTorch:PyTorch3D 的
transforms、PyPose、so3/se3系列包都提供了可微的旋转/位姿运算,可以直接参与反向传播。 - 等变与几何先验:SE(3)-等变网络(如把卷积换成可等变算子)让网络自带刚体运动的对称性,小数据也能学得更好——这是"几何 + 学习"的另一个结合点。
- 可视化:Pangolin 之外,Open3D、viser、nerfstudio 的 viewer 都能直接可视化轨迹与地图。
3.3 核心方法与工具
- PyTorch3D:
pytorch3d.transforms.rotation_6d_to_matrix、matrix_to_quaternion等,做可微旋转最常用; - PyPose:
pypose.SE3、pypose.Exp/Log、pypose.identity,接口贴近 Eigen/Sophus,但全部可微; - Eigen/Sophus:经典 C++ 路径仍然推荐,配合原书代码学习。
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,位姿更新都是在李代数上完成的。
变了的:
- "位姿头"成为神经网络的标准件:网络输出 3 维 so(3) 或 6 维 se(3) 向量,再接一个可微的指数映射层得到 $\mathbf{T}$,最后喂给几何损失(重投影、渲染误差)。iNeRF、NeRF/3DGS 的位姿优化、端到端 VO 都是这个套路;
- 李群运算进了自动微分:PyPose(2022)在 PyTorch 中原生实现了 $SE(3)$、$\mathfrak{se}(3)$ 的运算与左/右扰动,手推雅可比变得可选;
- 李代数用于相机外参、IMU 与体姿态的统一表示,在视觉-惯性系统(VIO)里依然如此(VINS-Mono、ORB-SLAM3 的 IMU 预积分都离不开它);
- 分布与不确定性:在李代数上定义高斯分布("集中高斯"),成为学习型状态估计输出不确定性的标准做法。
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 的最小单元。
延伸阅读:
- pypose 文档;
- DROID-SLAM 源码中的位姿更新部分(
droid/ba.py用可微 BA 层做 SE(3) 更新); - 原书第 4 讲练习(Sophus)建议保留,因为你要在 C++ 后端里手写扰动模型。
第 5 讲 相机与图像:从针孔模型到 AI 深度传感器
5.1 原书回顾
原书讲针孔相机模型、畸变(径向+切向)、双目与 RGB-D 相机模型、图像在计算机中的表示,以及 OpenCV 实践:读图、去畸变、双目视差与 RGB-D 点云。
相机模型(内参 $\mathbf{K}$、畸变参数)是"像素 ↔ 射线"的桥梁,任何几何 SLAM 都绕不开。
5.2 AI 时代的变与不变
不变的:针孔模型、畸变校正、双目/RGB-D 传感器依然存在;标定依然是工程第一步。
变了的:
- 单目相机也能给出"深度"了。2024 年以来零样本(zero-shot)单目深度估计大幅成熟:
- Depth Anything / Depth Anything V2(2024):用大规模无标注数据训练的通用深度模型;
- Metric3D、UniDepth(2024):预测带尺度的公制深度;
- Depth Pro(ICLR 2025):亚秒级、高分辨率、公制深度,边界锐利。 这相当于给普通单目相机装上了"AI 深度传感器",直接改变了稠密建图(第 12 讲)与 RGB-only SLAM 的玩法;
- 相机模型进入可微渲染。NeRF / 3DGS 里,"相机位姿 + 内参 + 像素采样"是一条完整的可微计算图,位姿本身成为被优化的变量(iNeRF 的思想),甚至内参/畸变也可微求解(如 3DGS 相关工作的自标定);
- 图像不再是"像素",而是特征表示。DINOv2 等自监督 ViT 特征成为通用的跨任务表示(回环检测用、语义建图用、深度估计也用),原书"图像 = 灰度/彩色数组"的视角需要扩展;
- 新传感器兴起:事件相机(异步、高动态范围,配合学习型光流/位姿)、全景相机 + 学习型匹配、LiDAR-相机-IMU 多传感器融合成为量产(自动驾驶、机器人)标配。
5.3 核心方法与工具
- 标定:OpenCV 棋盘格、Kalibr(多相机/IMU)、COLMAP(无标定 SfM 可自标定);
- 深度:Depth Anything V2、UniDepth、Depth Pro(HuggingFace 上有预训练权重);
- 可微相机:nerfstudio、gsplat、PyTorch3D 的
Cameras抽象。
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 每天都在跑),最小二乘框架本身没有过时。
变了的:
- 自动微分取代手推雅可比:PyTorch 的
autograd、Ceres 的 AutoDiff、g2o 的模板化雅可比,让"手推雅可比"从必需技能降级为理解技能; - 可微优化成为网络层:DROID-SLAM 把 BA 写成可微层(DBA),前向就是一次稠密 BA 迭代,反向把梯度传回特征网络——网络学会了"怎么更新位姿和深度",等价于学了一个 LM 更新器;
- 学习型优化器(Learning to Optimize):用循环网络(GRU/LSTM)预测每步更新量与置信度,替代手工设计的步长/阻尼。DROID-SLAM 的循环迭代是代表作;
- 去噪扩散模型做后处理:Marigold 等把扩散模型用于深度估计,利用生成先验补全弱纹理区域——本质是用"学习到的先验"约束优化;
- 概率视角深化:因子图 + 平滑与建图(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 再解一遍,体会自动微分与稀疏结构。
延伸阅读:
- DROID-SLAM 论文(Teed & Deng, NeurIPS 2021)与源码;
- 原书第 6 讲的三个实践(手写 GN、Ceres、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。
变了的:
- 特征提取被学出来了:
- SuperPoint(2018):自监督学习的角点+描述子,单张图出关键点与描述子;
- DISK(NeurIPS 2020):用策略梯度学习特征;
- ALIKE、XFeat:轻量、实时、适合嵌入式。
- 匹配器变成图网络/Transformer:
- SuperGlue(CVPR 2020):图神经网络做关键点匹配,给出可学习置信度;
- LightGlue(2023):SuperGlue 的加速版,更快更省显存;
- LoFTR(CVPR 2021):无检测器的稠密匹配(Transformer,擅长弱纹理);
- DKM:更高精度的稠密匹配。
- 定位管线 hloc:用学习型特征/匹配器 + 经典几何验证(RANSAC + PnP)做视觉定位,是目前最实用的"混合"范式;
- 端到端位姿回归:直接回归 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 时代的变与不变
不变的:"不用显式特征、直接在像素/块层面优化"的思想,以及光流是"像素级对应"的观点。
变了的:
- 光流被深度网络取代:RAFT(ECCV 2020)用循环更新 + 相关体(correlation volume)做稠密光流,成为后续大量系统的骨干;GMFlow 等进一步加速。原书的 LK 手工迭代退居教材地位;
- DROID-SLAM(NeurIPS 2021):直接法的"AI 完全体"——
- 用可训练的网络提取帧间特征并构建 4D 相关体;
- 用循环网络迭代预测"位姿 + 逆深度"的更新;
- 更新由可微的稠密 BA 层执行(DBA),等价于学习了一个 LM 迭代器;
- 单目视频上训练,可泛化到双目/RGB-D(官方开源,PyTorch 实现);
- DPVO(2022):把 DROID 的思想稀疏化——只跟踪 patch,用循环网络迭代,轻量且快,适合嵌入式/低算力;
- 光度假设 → 特征相似度假设:学习型方法不再依赖"同一世界点的像素亮度不变",而是在学出来的特征空间里做对应,天然更抗光照变化;
- 稠密化:学习型方法输出稠密深度图,直接桥接前端与稠密建图(第 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 与曲线拟合。
两个重要观点:
- 滤波(增量)与批量优化(滑窗/全局)是同一问题的两种视角;
- 现代 SLAM 后端主流是"非线性最小二乘 + 稀疏结构",而非 EKF。
9.2 AI 时代的变与不变
不变的:BA 依然是后端的核心;稀疏线性代数(Schur 消元等)依然决定性能;因子图(GTSAM)依然是标准工具箱。
变了的:
- 可微 BA 层(DBA):DROID-SLAM 把 BA 变成网络的一部分(稠密 BA 层),梯度可以穿过优化回到特征提取网络——"估计器本身被学习";
- 学习型不确定性:网络输出每帧/每点的协方差或权重,喂给优化器,等价于自适应加权最小二乘(例如动态场景下的不确定性感知 BA);
- 端到端状态估计器:直接把"多帧图像 → 位姿序列 + 深度"作为一个可微图训练(DROID-SLAM、DPVO 都是),滤波/优化被"学出来的迭代规则"取代;
- 学习先验约束优化:用扩散模型或学习深度作为先验项(如 NeRF-SLAM 用学习深度 + 几何融合),让后端从"纯几何"变成"几何 + 先验";
- 概率深度学习(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)没有变,全局一致的建图仍然靠它们。
变了的:
- 回环边的质量由学习型模块提供:回环候选来自学习型地点识别(第 11 讲),几何验证用学习型匹配(第 7 讲),边的协方差/置信度可以来自网络输出;
- 可微图优化:PyPose 提供基于 PyTorch 的位姿图优化(
pypose.optim),可以端到端训练;图神经网络(GNN)也被用于学习图优化的迭代规则; - 子图合并与层级高斯:大规模 3DGS 建图采用"层级/分块"策略(如 GigaSLAM,2025),把多个子图在全局坐标系下对齐,与经典"多地图 SLAM"(ORB-SLAM3 的 Atlas)思想同源但表示不同;
- 神经表示的全局对齐:NeRF/3DGS 地图之间的对齐(相对位姿估计 + 渲染损失)成为新问题(如 iNeRF 类方法),本质仍是位姿图 + 学习型观测模型;
- 动态场景:动态物体被分割(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)"是独立的研究领域。
变了的:
- 从词袋到 CNN 聚合描述子:NetVLAD(CVPR 2016)用 CNN 特征 + 可微 VLAD 聚合,弱监督训练,成为 VPR 的基准;
- 专用 VPR 模型持续刷新:Patch-NetVLAD、CosPlace(2022)、SALAD、EigenPlaces、MixVPR 等,在跨视角/跨季节任务上大幅超越词袋;
- 基础模型直接做地点识别:AnyLoc(2023)发现,用自监督预训练的 DINOv2 特征 + 无监督聚合(VLAD/GeM),无需任何 VPR 微调就能跨环境、跨季节、跨视角工作——这是"foundation model 取代专用训练"的典型例子;
- 语义与语言辅助:VLM 可以把地点描述成自然语言("有红色消防栓的拐角"),或与检索结果交叉验证;开放词汇场景图(第 12 讲)也可作为回环的语义先验;
- 几何验证升级:候选帧的位姿验证从 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 重写,出现了三大流派:
- 隐式神经表示(NeRF 类):
- iMAP(ICCV 2021):第一个实时神经隐式 SLAM;
- NICE-SLAM(CVPR 2022):分块隐式编码,可扩展;
- Co-SLAM(CVPR 2023)、Point-SLAM(ICCV 2023)、NeRF-SLAM(2022):进一步提升质量/速度;
- 优点:连续、可微分、可渲染新视角;缺点:难以直接做导航。
- 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)。
- 语义/开放词汇地图:
- 用 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 时代的设计决策
动手前先回答三个问题:
- 架构:经典、混合还是端到端?
- 经典(ORB-SLAM3):CPU 实时、可解释、工程成熟;
- 混合(推荐入门):学习型特征/深度/回环 + 经典几何后端,精度与工程性平衡;
- 端到端(DROID-SLAM 类):精度高但需要 GPU 与训练数据。
- 地图表示:几何还是神经?
- 导航/避障 → 八叉树、TSDF、3DGS 的几何层;
- 可视化/数字孪生 → NeRF / 3DGS 神经渲染;
- 机器人理解/交互 → 语义场景图。
- 数据与评测:在哪里训练、在哪里验收?
- 训练/测试集: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 未来的方向
- 基础模型全面渗透(Foundation Models Everywhere):DINOv2、SAM2、VLM 成为 SLAM 各组件的通用底座;出现"一句话描述环境、模型直接给出几何+语义地图"的端到端系统;
- 实时大场景 3DGS:层级/分块/流式高斯(如 GigaSLAM),配合设备端算力优化(TensorRT/ONNX/移动端),走向 AR/VR 与数字孪生;
- 动态与 4D:把动态物体、人、车纳入地图(4D 高斯、时序表示),服务自动驾驶与具身交互;
- 具身智能(Embodied AI):SLAM 成为机器人"感知-规划-行动"闭环的地基;语言指令 → 开放词汇地图 → 任务规划 → 导航执行,ConceptGraphs 已是雏形;
- 长期鲁棒与自适应:季节/光照/视角变化、退化环境(走廊、隧道)、传感器退化下的鲁棒性,仍是学习型与几何型共同挑战;
- 可信与隐私:可解释性、不确定性量化、地图数据的所有权与隐私(去标识化、本地化推理)。
14.4 给入门者的学习路线图
数学基础(线性代数/概率/优化)
→ 原书十四讲(经典 SLAM,务必先学)
→ PyTorch 深度学习基础
→ 学习型组件逐个替换(特征→深度→光流→回环)
→ 神经渲染(NeRF → 3DGS → 对应 SLAM 系统)
→ 语义与大模型(SAM/CLIP/VLM → 场景图)
→ 系统集成与真实环境部署
14.5 资源清单
经典必读:
- 高翔等《视觉SLAM十四讲:从理论到实践》第二版 + 官方代码仓库;
- 高翔 B 站配套视频(第一版,含课件资源在评论区)。
论文(按主题,均可从 arXiv 检索):
- 学习型特征/匹配:SuperPoint(2018)、SuperGlue(2020)、LoFTR(2021)、LightGlue(2023);
- 学习型 SLAM:DROID-SLAM(2021)、DPVO(2022);
- 深度估计:Depth Anything(2024)、Depth Anything V2(2024)、UniDepth(2024)、Depth Pro(2025);
- 回环:NetVLAD(2016)、AnyLoc(2023);
- 神经渲染:NeRF(2020)、3DGS(2023);
- 神经 SLAM:iMAP(2021)、NICE-SLAM(2022)、Co-SLAM(2023)、SplaTAM(2024)、MonoGS(2024)、Photo-SLAM(2024);
- 语义地图:ConceptGraphs(2023)、LangSplat(2024)。
工具: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
- DROID-SLAM:可微稠密 BA,单目/双目/RGB-D
- DPVO:轻量 patch 级 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 | 截断符号距离函数 / 八叉树地图,经典稠密表示 |
本文档为入门教程,内容基于公开论文、开源项目与官方文档整理;引用年份以论文/项目发布时间为准。安装命令请以对应官方文档的最新版本为准。