Contents — find the section you need
扫地机器人、无人机、自动驾驶汽车和AR眼镜都面临着一个共同的需求:回答“我现在在哪里?”这个问题。GPS在室内或人口密集的城市中无法正常工作,而且地图也并非总是可用。视觉SLAM技术仅使用摄像头图像(有时会配合一些廉价的辅助传感器)就能回答这个问题。本文首先探讨机器人为何会丢失自身位置,然后介绍特征跟踪、摄像头几何的数学原理、视觉里程计和SLAM的区别、地标算法的发展历程,最后阐述如何在实践中选择合适的算法。
Visual-SLAM 输入摄像头
车载摄像头示例图片:Intel RealSense 深度摄像头 D435(Marc Auledas,CC BY-SA 4.0)/ Car Mobileye 系统窗口摄像头(Ranbar,CC BY-SA 4.0),Wikimedia Commons。代表性相机,并非视觉SLAM的必要硬件配置。
0. 本文内容
-
什么是视觉SLAM,以及为什么仅凭相机就能估计自身位置
-
视觉里程计 (VO) 与 SLAM 的区别
-
ORB-SLAM、LSD-SLAM、DSO、SVO 和 DROID-SLAM 各自的设计贡献
-
基于特征、直接和基于学习的方法之间的区别
-
视觉SLAM 的局限性及其原因
-
如何为机器人、无人机、AR/VR 或自动驾驶汽车选择合适的方法
1. 视觉SLAM 的实际功能
一句话概括:视觉SLAM 仅使用相机拍摄的图像序列,即可同时估计相机在空间中的运动轨迹(定位)和周围环境的三维结构(建图)。
其名称——同步定位与建图——本身就指出了其核心所在。最关键的是“同时”二字。如果地图已知,确定自身位置就相对容易;如果位置精确已知,构建地图也同样容易。视觉SLAM却面临着这两种困境——构建地图需要知道自身位置,而知道自身位置又需要地图。这种先有鸡还是先有蛋的依赖关系必须从同一组观测数据中同时解决。
输入是来自摄像头(单目、双目或RGB-D)的时间序列图像,输出是两样东西:摄像头在每个时间步的6自由度位姿(3个位置自由度,3个方向自由度),以及代表周围环境的地图(一组稀疏的特征点,或一个密集的3D形状)。扫地机器人一边清洁一边学习房间布局,无人机在GPS信号无法覆盖的室内或地下稳定悬停,AR头显将虚拟物体叠加到现实世界中而不会发生漂移——在所有这些情况下,视觉SLAM都在幕后运行。
2. 为什么机器人不知道自己在哪里?
要理解视觉SLAM真正解决的问题,首先需要具体地问:为什么机器人会丢失自身位置?
首先,有很多环境没有GPS,或者GPS信号不可靠。例如室内、地下、隧道、摩天大楼之间的城市峡谷(多径反射会放大定位误差)、水下,甚至在其他没有卫星星座的星球上——在这些地方,你都无法直接获取绝对位置。
其次,地图可能根本不存在。新建的建筑物、灾难现场、未探索的行星表面——预先构建的地图数据并非总是可用的。没有地图,“对照地图检查自身位置”根本行不通。
第三,也是最根本的一点——即使从理论上讲,单个传感器的读数也无法确定绝对位置。摄像头只能告诉你它周围当前的情况。仅仅查看一张照片并不能立即告诉你“这是客厅里距离那面墙2.3米的地方”——要识别出那面墙是“那面墙”,你需要之前见过它,并且记得当时你在哪里。换句话说,将当前观测结果转化为有意义的位置信息需要与过去的观测结果建立对应关系(你现在的位置取决于你之前去过的地方)——而地图恰恰提供了这种对应关系。
SLAM问题的本质在于,仅凭观测数据,持续且一致地建立“我现在看到的”和“我之前绘制的地图”之间的对应关系,而无需任何外部绝对位置信息。一次错误的对应关系会将误差传播到后续的每一次估计中——如何抑制这种累积误差,以及如何在事后进行纠正,是所有视觉SLAM算法的核心设计问题。
3. 从摄像头图像中寻找什么
摄像头的原始输出只不过是一个像素值网格——亮度、颜色。要弄清楚“我是如何移动的”,第一步是在网格内找到可追踪的线索。
特征点是指图像中与周围环境明显区分开来的局部点,即使视角改变也能可靠地重新检测到——例如,角点、边缘交点、亮度梯度在多个方向上急剧变化的区域。一块与周围区域无法区分的均匀蓝色天空不能作为特征点。
特征检测在单幅图像中寻找候选特征点。诸如 ORB(定向快速旋转 BRIEF)、SIFT 和 FAST 角点检测器之类的算法会判断哪些像素“看起来像”特征点,并计算描述符——每个特征点周围局部外观的数值概括。
特征跟踪在下一帧中找到并匹配相同的特征点。有两种主要方法:一种是基于描述符相似性匹配检测到的特征(特征匹配),另一种是从特征在前一帧中的位置开始,在下一帧中搜索其邻域(光流,经典方法是 Lucas-Kanade 方法)。
这种关系——现实世界中的同一点在不同帧中出现在不同的位置——被称为对应关系。视觉 SLAM 中的几乎所有几何计算都以一组对应关系作为输入;如果没有任何对应关系,原则上就无法了解相机的运动轨迹。
光流是一个矢量场,它描述了图像中每个点(或一组稀疏点)在帧与帧之间移动的距离和方向——而不仅仅是特征点。基于特征的跟踪仅跟踪最具特征性的点,而光流可以利用更大范围内的运动信息,但通常计算成本更高。
- 计算摄像机的运动
一旦掌握了对应关系,就可以利用几何方法将其转化为对摄像机运动轨迹的估计。该计算的基础是极线几何。
图 1 — 两个相机视角 O_1 和 O_2,空间中的点 X,以及它在两个图像平面上的投影 x_1 和 x_2。给定 x_1,其对应的点 x_2 始终被约束在第二个图像中的一条直线上(极线)。
图:Epipolar 几何 (Arne Nordmann,CC BY-SA 3.0 / GFDL),Wikimedia Commons。原始 SVG 图像已转换为白色背景的 PNG 格式,以便在浏览器中稳定显示。
当从两个不同的视角拍摄空间中的同一点 X 时,给定另一幅图像中的点 \mathbf{x}_1,其中一幅图像中对应的点 \mathbf{x}_2 不能位于图像中的任意位置——它必须位于一条直线上(极线)。编码此几何约束的矩阵是本质矩阵 E。当相机的内部参数已知时,归一化相机坐标系中的对应点满足以下条件:
其中,R 和 \mathbf{t} 分别表示从相机 1 到相机 2 的旋转和平移,[\mathbf{t}]_{\times} 是由 \mathbf{t} 构建的斜对称矩阵,它将叉积表示为矩阵乘法。该等式表明,对应点 \mathbf{x}_1、\mathbf{x}_2 以及相机的相对旋转和平移之间始终存在此约束。所需的对应点数量取决于估计器:校准后的基本矩阵具有 5 点最小求解器,而线性 8 点估计至少使用 8 个对应点。实际数据包含异常值,因此实际系统会收集更多匹配点,并将其与 RANSAC 或其他鲁棒估计器结合使用。当内参未知或直接使用像素坐标时,包含内参矩阵 K 的基本矩阵 F = K_2^{-\top} E K_1^{-1} 发挥着相同的作用。
从基本矩阵恢复的平移 \mathbf{t} 不包含实际单位(例如米)——仅凭两张图像无法判断相机移动了一米还是两米。这种尺度模糊性是视觉 SLAM 特有的限制,尤其是在单目配置下,我们将在第 5 节中再次讨论。
计算对应点的实际三维位置——即空间中点 X 的坐标——称为三角测量。从每个视点向 X 延伸两条射线,理想情况下,这两条射线应该恰好相交于点 X;找到交点即可恢复对应点的三维位置(实际上,由于观测噪声,光线不会完全相交,因此会找到距离两者最近的点,即最小二乘意义上的最近点)。
如果已知地标的三维位置与其在图像中的位置之间存在对应关系,则可以直接由此计算相机的位姿。这就是PnP(透视n点)问题:给定n个三维点及其在图像中的投影位置,求解相机的位置和方向。一旦映射图存在,PnP就成为计算每一帧相机位姿的核心工具。
5. 视觉里程计
只需逐帧重复“根据对应点计算相机运动”,就足以估计相机的轨迹。这就是视觉里程计(VO)。
视觉成像 (VO) 仅将当前帧与前一帧(或最近几帧)之间的相对运动拼接起来,以构建相机的运动轨迹。它通常没有维护持久地图或识别先前访问过的地点的机制——其本质更接近于汽车的里程表,持续计算“我刚才走了多远”。
VO 和 SLAM 的区别恰恰在于此:系统是否维护地图以及是否具有恢复与过去一致性的机制。VO 轻量级且易于实现,但由于每一帧的估计都依赖于前一帧,因此微小的误差会随着时间的推移无限累积。这种累积的误差被称为漂移。如果机器人绕回起点,仅靠 VO 无法识别“我回到了起点”——估计的轨迹会始终偏离起点,并且永远不会闭合。
VO 还存在另一个特有的问题,尤其是在单目 VO 中,第四节已经提到过:尺度问题。单目相机拍摄的图像无法还原绝对的真实世界长度单位——图像外观无法区分“移动 2 米,物体看起来大了一倍”和“移动 4 米,物体看起来大了四倍”。立体相机(其两个镜头之间具有已知的基线距离以锚定比例)、RGB-D 相机(其深度传感器可直接提供真实世界距离)或与 IMU(其真实比例加速度可用于估计比例)配合使用,可以解决这种比例模糊性。
6. SLAM 在 VO 的基础上增加了什么
可以将 SLAM 理解为 VO 加上以下附加组件。
地图是迄今为止观测到的每个特征的 3D 位置(或密集的 3D 形状)的累积表示。与 VO 仅与紧邻的前一帧进行比较不同,该系统现在可以与地图中累积的所有信息进行匹配。
地标是地图中的一个独立元素——通常是一个具有三维位置的特征点。每当接收到新的帧时,系统会将其与该帧中可见的地标进行匹配,从而使相机位姿的估计不仅与前一帧保持一致,而且与机器人历史数据构建的整个地图也保持一致。
回环检测是SLAM相对于VO最重要的优势。当机器人返回到之前访问过的位置时,系统会利用图像相似性来检测这一事实,并在地图中添加一个新的约束,将“我现在的位置”与“我第一次访问该位置时的位置”关联起来。添加此约束后,系统可以重新分配并校正整个回环过程中累积的漂移。
校正的结果就是全局一致性。在回环检测出现之前,累积的误差会导致地图中两个本应是同一物理位置的记录位置略有不同。回环校正能够检测到这种偏差,并将整个地图重塑为自洽的形式——正是这种回环校正机制使得SLAM不仅能够提供“运动记录”,还能提供“一致的地图”。
7. 视觉SLAM的基本结构
将这些部分整合起来,我们可以大致了解所有主流现代视觉SLAM系统所共有的处理流程。
图 2 — 将来自相机的图像与前一帧进行匹配(特征/直接跟踪,使用第 3 节和第 8 节中的方法之一),这驱动姿态估计(第 4 节中的极线几何和 PnP),并并行进行局部映射(在最近观测区域中添加和更新地标)。当检测到循环时,循环闭环机制触发,后端(第 10 节)中的优化层(捆绑调整或姿态图优化)会将累积的姿态和地图修正为一个整体。
来自相机的图像首先经过特征/直接跟踪(第 3 节和第 8 节中介绍的两种方法之一)来建立与前一帧的对应关系。基于这些对应关系,姿态估计(使用第 4 节中的极线几何和 PnP)计算相机姿态,同时进行局部地图构建(在最近观测区域中添加和更新地标)。当检测到循环时,循环闭环机制触发,后端(第 10 节)的优化阶段会将累积的姿态和地图修正为一个全局一致的整体。该流程的最终结果是最终输出:相机的姿态(轨迹)和地图(其周围环境的 3D 结构)。
8. 地标算法
视觉SLAM的发展历程最容易沿着一个轴线来梳理:有多少是显式设计的,又有多少是交给机器学习的。
PTAM(并行跟踪与建图,Klein & Murray,2007)是一个开创性的系统,它将跟踪(姿态估计)和建图(地图构建)作为独立的并行线程运行。跟踪速度很快,每帧都在运行,而计算量较大的建图光束法平差则在后台线程中运行,有更多空闲时间——这种将跟踪与建图分离的思想被许多后来的视觉SLAM系统所继承。
ORB-SLAM(Mur-Artal、Montiel & Tardós,2015)基于ORB特征构建,结合了三线程结构(跟踪、局部建图、回环检测)和位置识别(通过词袋模型与过去的帧进行匹配),从而实现了实用的单目性能。 ORB-SLAM2 (Mur-Artal & Tardós, 2017) 将该框架从单目扩展到立体和 RGB-D 相机。ORB-SLAM3 (Campos, Elvira, Gómez Rodríguez, Montiel & Tardós, 2021) 增加了与 IMU(视觉惯性 SLAM)和多地图 SLAM 的紧密耦合,后者维护多个地图并根据需要进行合并——时至今日,它仍然是基于特征的 SLAM 的事实标准参考实现。
LSD-SLAM(大规模直接单目 SLAM,Engel, Schöps & Cremers, 2014) 是 直接方法 的一个里程碑式示例,它表明可以在大规模图像中直接使用图像亮度估计相机位姿,而无需特征检测步骤。完全跳过特征提取使其即使在特征稀疏的情况下也能利用信息。
DSO(直接稀疏里程计,Engel、Koltun 和 Cremers,2016 年首次提出,2018 年正式发表) 仍然采用直接方法,但与 LSD-SLAM 生成的半稠密估计不同,它通过最小化稀疏点集上的光度误差来实现,从而兼顾精度和计算效率。
SVO(快速半直接单目视觉里程计,Forster、Pizzoli 和 Scaramuzza,2014 年) 将特征检测与直接方法相结合,采用半直接方法,跟踪检测到的特征周围区域的亮度,从而在高帧率下实现快速运行——专为资源受限的平台(例如无人机)而设计。
DROID-SLAM(Teed & Deng,2021)完全用深度学习取代了显式的特征提取和匹配步骤,通过相关体、循环更新算子和可微分的捆绑调整层来估计相机位姿和逐像素深度——这是典型的基于学习的方法(其内部机制在Visual-SLAM Trends中有更详细的介绍)。
9. 基于特征 vs. 直接 vs. 基于学习
归根结底,这些算法可以归为三种设计理念之一。
| 方面 | 基于特征(例如 ORB-SLAM3) | 直接(例如 DSO/LSD-SLAM) | 基于学习(例如 DROID-SLAM) |
|---|---|---|---|
| 原则 | 检测并描述特征,根据对应点之间的几何关系计算姿态 | 完全跳过特征提取,直接最小化图像亮度以确定姿态 | 神经网络学习替代特征提取、对应关系和姿态/深度估计 |
| 准确率 | 在特征丰富的情况下准确率高;倾向于生成稀疏图 | 适用于存在亮度梯度的情况;可以生成半稠密到稠密的图 | 即使在纹理较少的环境中也相当稳健;易于获得稠密深度 |
| 计算成本 | 中等(特征提取、描述符、匹配) | 因实现方式而异,通常较为轻量级(特别是 DSO 优化了效率) | 高(仅推理通常就需要几到十几 GB 的 GPU 内存) |
| 鲁棒性 | 在纹理较少的环境或动态物体中较弱;对光照变化的适应性相对较强 | 对亮度变化敏感(自动曝光、光照) | 在其训练数据范围内表现良好,但对未见过的环境的泛化能力可能有限 |
| 实现难度 | 许多成熟的开源实现,易于采用 | 数学运算(亮度线性化)较为复杂 | 预训练模型易于使用;重新训练或调整内部参数需要更多专业知识 |
基于特征的方法拥有最悠久的历史,包括大量的嵌入式部署;直接方法在纹理稀少的情况下表现更佳;基于学习的方法发展迅速,但需要更强大的计算能力——这大致是截至 2026 年的现状。
10. 后端
最终决定 Visual-SLAM 精度的不仅仅是前端(特征提取、跟踪、姿态估计)——而是后端,它将所有累积的观测数据整合为自洽的整体。
捆绑调整联合优化相机姿态和地标的 3D 位置,使其与每次观测结果最大程度地保持一致。它最小化总重投影误差——即通过相机位姿 (R_j, \mathbf{t}_j) 投影到图像中的地标 \mathbf{X}_i 与实际观测到的对应特征位置 \mathbf{u}_{ij} 之间的差异。
\pi(\cdot) 是基于相机内部参数,将三维点投影到图像平面的投影函数。全局光束法平差 (BUD) 同时优化每一帧和每一个地标,精度很高,但计算量也很大;在实践中,它通常与局部光束法平差 (LUD) 结合使用,后者仅限于最近几帧,以控制计算量。
当检测到回环时,位姿图优化 就会发挥作用。与包含所有地标的光束法平差不同,位姿图优化仅将每个时间步的相机位姿视为一个节点,边编码帧之间的相对位姿约束——仅优化位姿,速度很快。通过闭环约束添加的新约束会将累积的漂移重新分配到整个回路中。
这两个问题都在非线性优化框架内得到解决。由于投影函数\pi(\cdot)和姿态中的旋转组合本质上是非线性的,因此会使用诸如高斯-牛顿法和莱文伯格-马夸特法之类的迭代方法,并且在视觉SLAM实现中广泛依赖g2o和Ceres Solver等库。
11. 视觉SLAM的不足之处
由于视觉SLAM依赖于被动传感器——摄像头,因此在某些情况下,其精度会系统性地下降。
-
黑暗环境:光线不足时,图像的信噪比会降低,从而影响特征检测和直接方法所依赖的亮度梯度计算。红外照明的RGB-D摄像头可以在一定程度上弥补这一缺陷,但这种效果在夜间户外环境中非常有限。
-
低纹理环境:白色墙壁、光滑地板、玻璃表面——任何亮度梯度稀少的环境,都会导致特征难以找到,或者直接方法的最小化过程会变得不适定且容易陷入局部最小值。
-
快速运动环境:相机的快速移动或旋转会扩大帧间对应关系的搜索范围,再加上运动模糊(见下文),跟踪很容易失效。与惯性测量单元 (IMU) (VIO) 配合使用是弥补这一缺陷的标准方法。
-
动态物体:将移动的行人或车辆上的特征视为静态环境的特征会给相机自身运动的估计引入误差。这需要预处理来检测并排除动态物体,或者使用能够显式建模动态物体的扩展函数。
-
运动模糊:曝光期间相机或被摄物体的运动会导致模糊,从而降低特征描述符的稳定性并降低匹配精度。全局快门相机或在曝光时间较短的高光照环境下可以减轻这种影响。
所有这些问题都有一个共同点:摄像头获取的视觉信息不足以进行有效工作。像激光雷达(LiDAR)这样的主动测距传感器(参见LiDAR-SLAM 技术趋势)原则上可以规避大部分此类缺陷,但它自身也存在一些不足(参见第 2 节)——没有一种单一传感器能够满足所有需求,而这种互补性正是传感器融合(参见传感器融合入门)至关重要的原因。
12. 实践中的方法选择
如何选择视觉 SLAM 方法很大程度上取决于您可以携带的传感器类型、可用的计算能力以及应用所需的精度和实时性能。
-
机器人(室内服务机器人、清洁机器人):通常受限于低成本的相机配置,基于特征的 ORB-SLAM 系列方法或基于 RGB-D 相机的密集地图构建是实用的选择。在走廊密集、纹理稀疏的环境中,可考虑与激光雷达 (LiDAR) 结合使用。
-
无人机:对计算能力和有效载荷重量的严格限制促使人们倾向于轻量级的半直接方法,例如 SVO,或与 IMU 紧密耦合的 VIO 配置。
-
AR/VR:实时性能和低延迟是首要考虑因素,视觉惯性 (VIO) 配置与头显内置 IMU 相结合已成为事实上的标准。尤其是在 AR 中,全局一致性直接决定虚拟物体是否漂移,因此回环检测的精度也至关重要。
-
自动驾驶:很少单独使用视觉 SLAM;基于摄像头的视觉信息通常会与激光雷达、雷达和全球导航卫星系统 (GNSS) 等多传感器融合在一起(参见传感器融合入门)。
-
室内与室外:室内光照变化平缓,且物体结构丰富,因此基于特征的方法通常效果良好;室外光照变化、动态物体和广阔的场景都带来了挑战,使得闭环检测的鲁棒性变得尤为重要。
截至 2026 年,大致的决策方向如下:如果计算资源充足且目标是最高精度,则选择基于学习的方法;如果注重过往经验和低资源消耗,则选择基于特征的方法;如果纹理稀疏环境下的鲁棒性至关重要,则选择直接方法。最新的研究方向——例如使用 3D 高斯散射/NeRF 重塑地图表示、前馈 3D 基础模型等等——已在 Visual-SLAM Trends 中进行了介绍。
实施前的五项检查
仅凭算法名称选择算法会使现场故障难以诊断。实施前,请确保可以记录以下五项内容;当跟踪失败时,您可以将传感器问题与估计器问题区分开来。
| 检查 | 准备信息 | 遗漏的后果 |
|---|---|---|
| 校准 | 内参 K、镜头畸变以及立体基线(如果适用) | 重投影误差看起来像位姿误差,且无法评估尺度 |
| 时间同步 | 帧时间戳、相机-IMU 偏移以及丢帧 | 在快速运动过程中,图像和惯性数据描述了不同的姿态 |
| 快门和曝光 | 全局/卷帘快门、曝光时间和自动曝光设置 | 运动模糊或几何畸变会被误认为是算法故障 |
| 动态物体 | 是否使用掩膜、移动物体的比例以及被拒绝的对应关系 | 行人或车辆会被合并到静态地图中 |
| 评估日志 | 真实值、ATE/RPE、轨迹丢失时间和回环检测结果 | “它移动了”不足以比较精度、漂移或恢复情况 |
首先填写此表还有助于区分从基于特征的方法切换到基于直接或基于学习的方法时,哪些必须改变,哪些可以保持不变。视觉SLAM应作为一个系统来选择——包括相机、计时、预处理、优化和评估——而不是作为一个孤立的算法。
13. 总结
视觉SLAM仅从相机图像中跟踪对应关系,利用极线几何和PnP算法恢复相机的运动,并通过地图和回环检测持续修正累积误差,从而实现同步定位与建图。三种设计理念——基于特征的(ORB-SLAM系列)、直接法(DSO/LSD-SLAM)和基于学习的(DROID-SLAM)——各自基于不同的权衡取舍,最容易理解的维度是:特征是否被显式处理、是否直接使用亮度信息以及有多少工作委托给学习。具体选择哪种方法取决于应用场景,需要权衡可用传感器、计算资源以及所需的精度和实时性能。
14. 参考文献
本文收集了上述代表性方法和双视图几何的主要论文和研究页面,作为实现和进一步阅读的起点。为了避免将论文的结论与特定产品或数据集上的性能混淆,请结合实验条件阅读链接文本。
-
ORB-SLAM3:用于视觉、视觉惯性和多地图 SLAM 的精确开源库 — 一个涵盖视觉、视觉惯性和多地图设计的库。
-
DROID-SLAM:用于单目、立体和 RGB-D 相机的深度视觉 SLAM — 一种基于学习的方法,结合了相关体和可微稠密光束法平差。
-
LSD-SLAM:大规模直接单目 SLAM — 直接半稠密单目 SLAM 的官方研究页面。
-
直接稀疏里程计 — 关于滑动窗口光度误差优化的 DSO 论文。
-
五点相对位姿问题的有效解决方案 — 关于五点基本矩阵求解器的原始论文。
美观的地图能否实现精确定位?
将地图外观与轨迹误差分开评估。检查比例尺、对齐情况、局部误差和长期漂移。
评论
请先登录。
暂无数据。