摘要:本文面向刚接触视觉 SLAM 或准备阅读 ORB-SLAM3 代码的学习者,系统梳理了视觉 SLAM 的基本原理、算法演进、主要模块与学习路线。内容涵盖 SLAM 要解决的核心问题、单目/双目/RGB-D 深度来源的差异、特征点法与直接法的优化目标、前端/后端/回环/建图的协作方式,以及从 PTAM 到 ORB-SLAM3 的关键演进。文章还介绍了 ORB-SLAM3 的 Tracking、Local Mapping、Loop Closing 三大模块,解释了引入 IMU 的原因与预积分思路,并给出观察公开数据集演示和安排学习路线的具体建议。
1. SLAM 解决什么问题?
视觉 SLAM 要同时估计相机的运动和环境的结构。ORB-SLAM3 把 ORB 特征、视觉惯性估计、回环校正和多地图管理放在同一个系统里。理解它,先要理清“观测从哪里来、误差如何优化、地图如何复用”这三个问题。
本文面向刚接触视觉 SLAM,或准备阅读 ORB-SLAM3 代码的学习者。内容包括基本原理、算法演进、主要模块、公开数据集的观察方法和学习路线;安装步骤与完整数学推导需要另行展开。
SLAM 的全称是Simultaneous Localization and Mapping,通常译为“同时定位与建图”。
- 定位:估计传感器或机器人在参考坐标系中的位置和姿态,回答“我在哪里、朝向哪里”。
- 建图:根据观测建立环境表示,回答“周围有哪些结构、它们在哪里”。
这两个问题相互依赖。要把新看到的物体放进地图,需要知道相机的位置;要利用地图确定位置,又需要可靠的环境结构。它们有些像“鸡生蛋、蛋生鸡”,因此通常需要联合估计,随着新观测不断修正。
以相机在房间里移动为例:系统在不同图像中找到同一个墙角,由这些对应关系估计相机运动,再恢复墙角的三维位置。后续再次看到这个墙角时,已有地图又能帮助定位。
SLAM 是导航的重要组成部分。完成避障、路径规划和运动控制,还需要相应模块。用于定位的稀疏地图,也不自动等于适合机器人通行判断的障碍物地图。
按主要传感器,可以讨论视觉 SLAM、激光 SLAM 及它们与其他传感器的融合方案。视觉图像含有颜色、纹理和物体外观,便于进一步引入语义识别;是否更便宜、更适合某个任务,则要结合实际硬件和场景判断。
2. 单目、双目和 RGB-D:深度从哪里来?
| 输入形式 | 深度信息的来源 | 需要先理解的边界 |
|---|---|---|
| 单目 | 相机移动后,从多个视角的对应关系进行三角化 | 纯视觉、无额外尺度约束时,恢复的结构和运动存在整体尺度歧义 |
| 双目 | 两个经过标定的相机提供不同视角,利用视差估计深度 | 尺度依赖已知基线;匹配质量、标定误差和物体距离都会影响深度估计 |
| RGB-D | 彩色图像配合深度图,为有效像素提供距离信息 | 深度图须与图像正确关联;无效深度、量程和传感器误差需要处理 |
“单目没有绝对尺度”并不意味着“单目不能估计深度”。同一组图像,可能对应一个小场景中的短距离运动,也可能对应一个按比例放大的场景和运动;仅靠这些图像无法确定真实的米制大小。
对于校正后的理想双目相机,可以用Z = f × b / d理解深度:Z是深度,f是以像素为单位的焦距,b是基线长度,d是视差。视差越小,相同的视差误差通常越容易带来较大的深度误差。ORB-SLAM2 将双目和 RGB-D 的深度观测纳入特征与优化框架。ORB-SLAM2 原论文
RGB-D 描述的是“颜色+深度”的数据形式,不能据此认定所有深度相机都使用相同的测距机制。
3. 特征点法与直接法:优化的是什么?
视觉估计的一条重要区别,是如何利用图像信息。
| 方法 | 主要使用的信息 | 典型误差与例子 |
|---|---|---|
| 特征点法 | 提取关键点和描述子,建立图像之间或图像与地图之间的对应 | 通常优化重投影误差;ORB-SLAM 系列是代表 |
| 直接法 | 使用选定像素或图像区域的亮度信息建立约束 | 通常优化光度误差;DSO、LSD-SLAM 是代表 |
| 半直接法 | 在不同阶段结合直接图像对齐与特征几何约束 | SVO 是典型例子,不能简单归为纯直接法。SVO 原论文 |
重投影误差比较“地图点按当前位姿投影到图像的位置”与“实际观测到的关键点位置”。光度误差比较对应位置的像素亮度,常需要考虑曝光变化和相机的光度模型。
“直接法”也不等于“稠密建图”。DSO 是直接、稀疏的视觉里程计;LSD-SLAM 使用半稠密表示。方法如何建立图像约束,与地图保留多少点,是两个不同维度。DSO 官方项目说明、LSD-SLAM 官方项目说明
特征点法在一定程度上能适应外观变化,但模糊、弱纹理、强烈光照变化和大量动态物体仍可能破坏匹配。直接法也需要满足相应的图像对齐和光度条件。比较方法时,应明确输入和场景,避免把某类算法写成对这些问题免疫。
4. 前端、后端、回环和建图如何配合?
可以先用下面的职责表理解一个典型视觉 SLAM 系统。
| 部分 | 主要职责 | 可以带着什么问题学习 |
|---|---|---|
| 前端/视觉里程计 | 从图像及局部地图估计当前运动,建立对应关系 | 哪些观测支持这次位姿估计? |
| 后端优化 | 结合观测约束,调整位姿、地图点等变量 | 优化哪些变量,固定哪些变量,误差如何定义? |
| 回环检测与校正 | 识别曾经到过的区域,验证约束并修正累计漂移 | 是视觉相似,还是已经通过几何验证? |
| 地图管理 | 创建、筛选和维护环境表示,支持后续定位 | 哪些信息值得长期保留? |
实际代码中,这些职责可能相互交叉,并不总是一一对应四个线程。比如跟踪阶段也会优化当前位姿,局部建图阶段则会进行局部优化。
VO 与 SLAM 有什么区别?
视觉里程计(Visual Odometry,VO)主要关心从视觉观测估计运动,通常着重短期或局部的一致性;完整 SLAM 系统还要考虑持续地图管理、地图复用和更大范围的一致性。
“VO 加回环就是 SLAM”可以帮助初步理解一些常见系统,但不能作为所有算法的严格定义。ORB-SLAM 的设计同时包含重定位、局部地图复用和回环等能力。ORB-SLAM 原论文
5. 从 PTAM 到 ORB-SLAM3:每一步解决了什么?
下面按代表性论文的发表时间梳理,而不是把所有工作理解成单线升级关系。
| 工作 | 时间 | 主要值得学习的贡献 |
|---|---|---|
| PTAM | 2007 | 将跟踪与关键帧建图分开并行处理,面向小型 AR 场景。原论文 |
| ORB-SLAM | 2015 | 在单目系统中使用 ORB 特征,结合跟踪、局部建图、重定位与回环。原论文 |
| ORB-SLAM2 | 2017 | 支持单目、双目和 RGB-D,结合局部优化、回环校正与全局 BA。原论文 |
| ORB-SLAM-VI | 2017 | 融合单目视觉与 IMU,研究尺度、重力、速度和偏置初始化以及地图复用。原论文 |
| ORBSLAM-Atlas | 2019 | 管理多个子地图,通过位置识别和地图合并提高系统连续工作的能力。原论文 |
| ORB-SLAM3 | 2020 年预印本,2021 年期刊论文 | 综合视觉、视觉惯性和多地图能力,并支持针孔与鱼眼相机模型。原论文 |
PTAM 与 ORB 分别是什么?
PTAM 的作者是 Georg Klein 和 David Murray。它使用点特征、关键帧和几何优化,跟踪过程中包含图像块匹配。基于关键帧是一种帧与地图的组织方式,不能据此判断算法属于直接法,也不能说 PTAM 不提取特征。
ORB 则是一种局部特征方法,全称是Oriented FAST and Rotated BRIEF。它在 FAST 检测和 BRIEF 描述的基础上加入方向处理,并使用图像金字塔处理多个尺度。二进制描述子便于快速匹配,这是 ORB-SLAM 选择它的重要背景。OpenCV ORB 官方文档
这些设计有助于应对一定程度的旋转和尺度变化,但不意味着能对任意视角变化、模糊或遮挡保持完全不变。
6. 读懂 ORB-SLAM3 的三个主要模块
6.1 Tracking:估计当前帧状态
跟踪模块处理输入帧,提取 ORB 特征,利用已有信息形成位姿初值,再与局部地图建立对应并优化。跟踪失败时,系统尝试重定位;当前帧是否需要成为关键帧,也由这一模块判断。
在视觉惯性模式下,状态还包括速度和 IMU 偏置,估计同时使用视觉与惯性约束。
普通帧与关键帧的区别主要在长期保留和参与建图的方式。普通帧也参与实时跟踪,不应理解为“系统只处理关键帧”。
6.2 Local Mapping:维护局部地图
局部建图接收新关键帧,创建地图点,筛除不可靠的点和冗余关键帧,并进行局部优化。筛选既是为了控制计算量,也是为了保留能稳定支持跟踪的地图信息。
BA 是Bundle Adjustment,常译为“光束法平差”或“束调整”。理解时先关注:哪些相机状态和三维点一起优化、它们被哪些观测约束。局部 BA 针对有限窗口;全局 BA 则作用于更大范围的地图与关键帧,触发时机和计算代价不同。
6.3 Loop Closing/Map Merging:复用旧区域
ORB-SLAM3 区分两种情况:识别到的区域属于当前地图,就可能形成回环;属于其他地图,就可能进行地图合并。它们都需要可靠的数据关联与几何验证。
上述模块关系可对照论文的系统图理解。ORB-SLAM3 原论文,第 III 节及图 1
位置识别中的 BoW 是Bag of Words,词袋模型。DBoW2 用视觉词汇表示图像,帮助快速找到候选关键帧;“看起来相似”只是候选线索,仍需要判断特征是否满足几何关系。DBoW2 官方仓库
几何校正中常见的SE(3)表示三维旋转和平移,Sim(3)还包含尺度。纯单目地图的尺度漂移是使用 Sim(3) 的重要背景;已有可靠尺度时,约束的处理又不同。它们不是简单的图像相似度分数,也不能把三维位姿变换写成 SE(2)。官方 LoopClosing 源码
Atlas 管理当前活动地图和其他非活动地图,支持再次识别并合并共同区域。多地图能力减少了跟踪中断后丢掉所有已有成果的需要;是否能够合并,仍取决于共同观测和验证条件。实际可管理的地图规模也受计算和内存资源限制。ORBSLAM-Atlas 原论文
7. 为什么引入 IMU?
相机提供丰富的环境观测,但弱纹理、遮挡和运动模糊可能使视觉约束不足。IMU 提供高频惯性观测,能帮助预测短时间的运动。
陀螺仪测量角速度;加速度计测量比力,估计运动时需要处理重力、偏置和噪声。它们不会直接输出准确的相机位置:持续积分会累积误差,因此需要与视觉约束联合估计。视觉惯性 SLAM 原论文,第 II 节
对单目视觉惯性系统,初始化需要处理尺度、重力方向、速度和偏置等变量。足够的运动激励与合适的标定是估计这些状态的重要条件;不能理解为“接上 IMU 就立即获得可靠尺度”。ORB-SLAM3 使用基于优化的视觉惯性初始化。初始化原论文
IMU 预积分可以先理解为:把两帧或两个关键帧之间的多次 IMU 测量整理为相对运动约束,供后续优化使用。深入时还要学习噪声传播和偏置修正,不能把预积分当成对加速度取平均。
8. 看公开数据集演示时,应该观察什么?
8.1 先分清数据集
| 数据集 | 主要数据 | 适合关注的内容 |
|---|---|---|
| EuRoC MAV | 双目图像、IMU 和参考轨迹等 | 单目/双目与惯性配置的对应关系。ETH ASL 数据集入口 |
| TUM RGB-D | 彩色图像、深度图和参考轨迹等 | RGB-D 输入与轨迹评估。官方入口 |
| TUM-VI | 鱼眼双目图像、IMU 等 | 视觉惯性估计与鱼眼相机模型。官方入口 |
“TUM”可能指不同数据集,不能把 RGB-D 数据和 TUM-VI 混用。下载时还要核对格式、标定文件和示例程序所需的输入。
8.2 观察地图如何变化
初次看演示,可以依次观察:
- 当前图像中的特征匹配是否稳定。
- 相机位姿如何随运动变化。
- 新关键帧和地图点何时加入。
- 关键帧之间的图连接表达了什么关系。
- 返回旧区域时,是否发生识别、校正或地图合并。
共视图的节点是关键帧,连接反映关键帧共享地图点的关系,不是“相机能看到几张图片”。ORB-SLAM2 原论文,第 III 节
官方可视化界面提供Show Graph、Localization Mode、Step By Step与Step等控制项。逐帧观察可以帮助理解状态变化;定位模式使用已有地图跟踪,并停止局部建图。官方 Viewer 源码、官方 System 源码
这些界面现象适合帮助理解流程。要判断定位精度,仍需要保存轨迹、对齐时间和坐标系,再与参考轨迹比较;轨迹看起来平滑或首尾接近,本身不足以证明误差很小。
8.3 把环境与能力范围说清楚
本文代码功能核对的是官方提交4452a3c4ab75b1cde34e5505a36ec3f9edcdc4c4,核验日期为2026-10-03。该提交的传感器枚举包含单目、双目、RGB-D 及各自的惯性配置;具体接入还需要对应程序、参数与标定。官方 System.h
该版本 README 记录了作者在 Ubuntu 16.04 和 18.04 上的测试,以及 C++、Pangolin、OpenCV、Eigen 等依赖。这是历史测试记录,不能直接推导为其他系统和任意新依赖组合都已验证。固定版本 README
9. 如何安排 ORB-SLAM3 学习路线?
可以采用“项目驱动,遇到问题再有针对性地补理论”的方式,同时保留必要的基础学习。
| 阶段 | 重点 | 一个可检查的学习结果 |
|---|---|---|
| 理清输入与输出 | 相机类型、标定、时间戳、图像与 IMU 的对应关系 | 能说明每份输入数据和配置参数的作用 |
| 补几何基础 | 坐标变换、旋转矩阵、四元数、相机投影、三角化、PnP | 能画出世界、相机与图像坐标之间的关系 |
| 补优化基础 | 最小二乘、鲁棒核、雅可比、BA,SO(3)、SE(3)、Sim(3) | 能说出一个优化问题的变量、观测和误差 |
| 按模块读代码 | Tracking、Local Mapping、Loop Closing,以及 Frame、KeyFrame、MapPoint | 能追踪一帧输入如何生成位姿与关键帧 |
| 深入惯性与多地图 | IMU 预积分、初始化、偏置、Atlas、地图合并 | 能解释一次失败恢复或地图合并需要什么条件 |
| 面向任务改进 | 动态场景、语义信息、稠密表示或关键帧策略 | 有明确问题、基线和评估条件,而不是只替换模块名称 |
OpenCV 要学到什么程度?
以阅读 ORB-SLAM3 为目标,可以先学习图像读写、cv::Mat、灰度图与金字塔、相机标定和畸变、特征提取与匹配,以及常用几何接口。能理解数据格式和参数含义后,再随具体问题补图像预处理与其他算法,不必一开始掌握整个库。
C++ 则需要能阅读类、容器、对象生命周期和线程协作。仅仅编译成功,还不足以解释为什么某段代码要插入关键帧、剔除地图点或中止一次优化。
工程应用与研究改进如何衔接?
工程学习先把问题落到具体场景:输入质量如何,哪些运动会丢失跟踪,输出地图是否满足下游任务,计算资源是否足够。研究改进则需要固定基线、数据和评价方式,解释改动解决了什么问题,以及在哪些条件下有效。
语义分割可以提供物体类别或区域信息,稠密建图可以补充表面结构;把这些信息接入 SLAM,仍需要设计数据关联、地图表示和运行流程。学习式关键帧选择也可以作为探索方向,但效果需要实验验证,不能仅凭“采用深度学习或强化学习”就认定整体更优。
下一步可以先选择一种输入配置和一个公开序列,在理解标定与时间戳后,围绕“当前帧怎样变成关键帧”追踪一次完整流程。把运行现象、模块职责和几何约束对应起来,再继续深入 BA、IMU 预积分和 Atlas,会更容易形成连续的知识结构。
参考资料
- ORB-SLAM3 原论文:系统设计与视觉惯性、多地图方法。
- ORB-SLAM3 官方仓库:代码、依赖与示例入口;本文代码核对版本见第 8.3 节。
- ORB-SLAM2 原论文:视觉系统、关键帧与优化背景。
- PTAM 原论文:跟踪与关键帧建图并行的早期工作。