☰
ORB-SLAM3论文翻译与核心算法解析:视觉惯性SLAM系统设计与多地图合并
2026/10/15 1:15:29 网站建设 项目流程

1. 为什么有人愿意花时间啃ORB-SLAM3这篇论文

如果你正在做视觉SLAM方向的研究或者工程落地,ORB-SLAM3这个名字你一定绕不开。它是目前开源视觉惯性SLAM系统里公认的标杆之一,支持单目、双目、RGB-D以及各种惯性组合模式,还能做多地图合并和重定位。但问题在于,原论文写得非常紧凑,公式密度高,很多关键设计一笔带过,直接读英文原文对不少人来说门槛不低。

我自己第一次读ORB-SLAM3论文的时候,光是搞清楚它和ORB-SLAM2的区别就来回翻了好几遍。后来我决定干脆做一次比较完整的翻译和梳理,把论文主体部分逐段吃透,跳过相关研究综述和实验精度验证那些偏“论文八股”的章节,专注于系统架构、算法原理和关键公式的解读。这篇博文就是那次工作的整理成果,适合正在入门视觉SLAM、需要快速理解ORB-SLAM3核心设计的朋友,也适合已经用过ORB-SLAM3但想回头补理论基础的开发者。

需要提前说明的是,我翻译和解读的重点放在论文的方法论部分,也就是系统怎么设计的、每个模块解决什么问题、公式背后的直觉是什么。相关研究部分主要是罗列前人工作,精度验证部分是一堆表格和曲线,这两块对理解系统本身帮助有限,所以直接略过。下面我会按照论文的逻辑顺序,把核心内容拆开来讲,同时补充一些论文里没写但实际理解时很关键的经验。

2. 系统总览:ORB-SLAM3到底在解决什么问题

2.1 从ORB-SLAM2到ORB-SLAM3的核心跨越

ORB-SLAM2已经是一个很成熟的系统了,支持单目、双目和RGB-D,有完整的跟踪、局部建图、回环检测和重定位能力。但它有一个明显的短板:没有惯性融合,而且在跟踪丢失之后重建地图的能力有限。ORB-SLAM3要解决的核心问题就是两个:第一,把IMU数据真正用起来,让系统在视觉退化或者快速运动时依然稳定;第二,支持多地图系统,当跟踪丢失时不是简单重启,而是新建一个子地图,等条件合适时再和之前的地图合并。

这两个目标听起来简单,但实现起来涉及大量细节。惯性融合不是简单地把IMU预积分结果加到优化里就行,还要处理初始化、尺度估计、重力方向对齐、偏置估计等一系列问题。多地图合并也不是把两个点云拼在一起那么简单,需要做地图对齐、位姿图优化、融合重复地图点,还要保证合并后的地图在后续跟踪中能正常使用。

论文里把系统分成了几个主要模块:跟踪线程、局部建图线程、回环检测与地图合并线程,以及一个 Atlas 地图集结构。Atlas 是ORB-SLAM3比较有特色的设计,它允许系统同时维护多个子地图,每个子地图有自己的关键帧和地图点,子地图之间通过共视关系或者惯性信息建立连接。

2.2 Atlas地图集的设计逻辑

Atlas 这个名字听起来很唬人,其实它的核心思想不复杂。你可以把它理解成一个“地图的容器”,里面可以装多个独立的地图。每个地图有自己的原点、关键帧集合、地图点集合和共视图。系统在正常跟踪时,所有新关键帧和地图点都加到当前活跃地图里。一旦跟踪丢失,系统不会像ORB-SLAM2那样直接进入重定位模式然后可能彻底失败,而是把当前地图标记为非活跃,然后新建一个空地图,从当前帧重新开始跟踪和建图。

这个设计的好处在于,系统不会因为一次跟踪失败就丢掉之前建好的所有地图信息。当相机重新回到之前建过图的区域时,系统可以通过重定位或者地图合并,把新旧地图连起来。论文里提到,Atlas 还支持地图的保存和加载,这对于长期运行的机器人或者AR应用来说很实用。

不过这里有一个容易忽略的细节:多地图系统里的尺度问题。单目SLAM本身尺度不确定,不同子地图的尺度可能不一致。ORB-SLAM3通过惯性信息来估计尺度,并且在合并地图时会做尺度对齐。如果没有IMU,纯单目情况下多地图合并的尺度一致性会比较麻烦,论文里也提到这种情况下的处理方式相对保守。

2.3 惯性融合在系统中的位置

IMU数据在ORB-SLAM3里不是简单地和视觉结果做滤波融合,而是通过预积分理论嵌入到因子图优化里。具体来说,系统会在关键帧之间对IMU测量做预积分,得到相对旋转、速度和位置的变化量,然后把这些预积分量作为约束加入到局部BA或者全局BA中。

这样做的好处是,IMU的高频信息被压缩成了关键帧之间的约束,既保留了运动信息,又不会让优化变量爆炸。论文里用了大量篇幅推导预积分的公式,包括旋转、速度、位置的预积分项,以及偏置更新时的雅可比矩阵。这些公式看起来吓人,但核心思想就是:把IMU测量从“原始数据”变成“相对运动约束”,然后让优化器去调整关键帧位姿和IMU偏置,使得视觉观测和惯性约束同时满足。

实际使用中,IMU的初始化和偏置估计对系统稳定性影响很大。论文里提到,系统会在启动阶段用一段时间做惯性初始化,估计重力方向、尺度和初始偏置。如果这段时间内相机运动不够充分,初始化可能会失败或者估计不准。我在实际测试中发现,手持设备做初始化时,最好有比较明显的平移和旋转运动,不要只是原地转动,否则尺度估计容易出问题。

3. 跟踪线程:每一帧进来之后发生了什么

3.1 帧的预处理与特征提取

每一帧图像进入系统后,首先做的是ORB特征提取。ORB特征本身是Oriented FAST加旋转BRIEF描述子,计算速度快,适合实时应用。论文里提到,系统会根据图像金字塔做多尺度特征提取,保证在不同距离下都能找到足够的匹配点。

特征提取之后,系统会做初始位姿估计。如果是双目或者RGB-D模式,可以直接通过特征匹配和三角化得到深度信息,位姿估计相对直接。如果是单目模式,就需要依赖之前的地图点或者惯性信息来估计位姿。论文里特别提到,在惯性模式下,系统会用IMU预积分结果作为初始位姿猜测,然后再用视觉观测做优化。

这里有一个实操中容易踩的坑:特征提取的数量和质量对跟踪稳定性影响很大。论文里默认每帧提取1000到2000个特征点,但在纹理较弱的场景下,这个数量可能不够。我试过在白色墙面或者空旷走廊里跑ORB-SLAM3,特征点经常掉到几百个,跟踪很容易丢失。后来我调整了特征提取参数,增加了每帧提取数量,同时降低了FAST角点的阈值,情况有所改善,但代价是计算量上升。

3.2 位姿估计与局部地图跟踪

初始位姿估计之后,系统会把当前帧和局部地图里的关键帧做匹配,进一步优化位姿。局部地图里包含了当前帧附近的关键帧以及它们观测到的地图点。匹配过程会用到描述子距离、极线约束和尺度一致性检查,剔除误匹配。

论文里提到,系统会维护一个共视图,记录关键帧之间的共视关系。共视图的作用是快速找到和当前帧有共同观测的关键帧,避免全局搜索。这个设计在ORB-SLAM2里就有,ORB-SLAM3继续沿用并做了优化。

位姿优化的目标函数是重投影误差,也就是把地图点投影到当前帧上,最小化投影位置和实际观测位置之间的距离。如果惯性模式开启,还会加入IMU预积分约束。优化变量包括当前帧位姿、地图点位置,有时还包括IMU偏置和速度。

实际运行中,局部地图跟踪的鲁棒性很大程度上取决于地图点的质量。如果之前建图时引入了错误的地图点,后续跟踪就会被带偏。论文里提到系统有地图点剔除机制,会移除那些重投影误差过大或者被观测次数太少的地图点。但我在实际使用中发现,有些错误地图点会存活比较久,尤其是在纹理重复的场景里。这时候可能需要手动干预,或者调整剔除策略的参数。

3.3 跟踪失败后的处理策略

跟踪失败在SLAM里是常态,关键是怎么处理。ORB-SLAM3的策略比ORB-SLAM2更灵活。当跟踪失败时,系统会先尝试重定位,在当前活跃地图里找相似的关键帧。如果重定位成功,就继续跟踪;如果失败,系统会把当前地图标记为非活跃,然后新建一个地图,从当前帧重新开始。

这个过程中,Atlas 的作用就体现出来了。新建的地图会独立运行,直到系统检测到它和某个旧地图有足够的共视关系或者惯性一致性,才会触发地图合并。论文里提到,地图合并会在回环检测线程里处理,合并时会做位姿图优化,把两个地图的坐标系对齐。

我在测试中发现,跟踪失败后新建地图的策略在大多数情况下是有效的,但有一个问题:如果相机一直在同一个区域来回运动,系统可能会频繁新建地图,导致Atlas里堆积很多小地图。这些地图之间的合并需要时间,而且合并过程中可能会引入误差。所以实际使用时,如果场景比较固定,可以考虑调整跟踪失败的判定阈值,避免过于敏感。

4. 局部建图与关键帧管理

4.1 关键帧的插入策略

关键帧是SLAM系统里的核心概念,它决定了地图的密度和优化的计算量。ORB-SLAM3的关键帧插入策略和ORB-SLAM2类似,主要看当前帧和上一个关键帧之间的共视点数量、平移距离和旋转角度。如果共视点太少,或者运动超过一定阈值,就插入新关键帧。

论文里提到,在惯性模式下,关键帧插入还会考虑IMU预积分的时间间隔。如果两个关键帧之间时间太长,IMU预积分的误差会累积,所以系统会限制最大时间间隔,超过就强制插入关键帧。

这个策略在实际使用中需要根据场景调整。比如在快速运动的场景里,如果关键帧插入太稀疏,跟踪容易丢失;如果太密集,局部BA的计算量会很大。我一般会根据相机的运动速度和计算平台的性能,适当调整关键帧插入的阈值。在嵌入式平台上跑的时候,我会把阈值调大一些,减少关键帧数量,保证实时性。

4.2 局部BA的优化变量与边缘化

局部建图线程的核心任务是做局部BA,优化最近一段时间内的关键帧位姿和地图点位置。论文里提到,局部BA的优化窗口包含当前关键帧、它的共视关键帧以及这些关键帧观测到的地图点。优化变量包括关键帧位姿、地图点位置,惯性模式下还包括速度和偏置。

局部BA的规模不能太大,否则计算量会爆炸。所以系统会限制优化窗口的大小,把那些和当前关键帧共视关系较弱的关键帧排除在外。论文里提到,系统会固定一些关键帧不参与优化,只优化最近的关键帧和地图点。这个策略在ORB-SLAM2里就有,ORB-SLAM3继续沿用。

边缘化是局部BA里的一个关键操作。当优化窗口滑动时,旧的关键帧和地图点需要被移除,但它们提供的约束不能直接丢掉,否则会丢失信息。论文里用了舒尔补来做边缘化,把旧变量的信息压缩成先验约束,加到后续优化里。这个过程涉及大量矩阵运算,论文里给了公式推导,但实际实现时需要注意数值稳定性。

我在阅读这部分时,最大的体会是:边缘化的理论看起来很优雅,但实际实现时很容易出问题。比如先验信息的构建如果处理不好,会导致优化结果有偏。论文里没有详细讲实现细节,但如果你要自己复现或者修改代码,这部分需要特别小心。

4.3 地图点的创建与剔除

地图点的创建主要靠三角化。当新关键帧插入后,系统会尝试用新关键帧和之前的关键帧做三角化,生成新的地图点。三角化的条件是:两个关键帧之间有足够的基线,匹配点的视差角足够大,三角化后的重投影误差在合理范围内。

地图点的剔除则是一个持续的过程。系统会定期检查所有地图点,移除那些被观测次数太少、重投影误差过大、或者被多个关键帧观测到但一直不更新的点。论文里提到,剔除策略还会考虑地图点的尺度一致性,如果某个地图点在多个尺度下的观测不一致,也会被移除。

实际使用中,地图点的质量直接决定了跟踪和建图的精度。我遇到过一种情况:在纹理重复的场景里,三角化会产生很多错误的地图点,这些点虽然重投影误差不大,但位置是错的。这种点很难通过常规的剔除策略移除,因为它们在某些视角下看起来是合理的。后来我通过增加极线约束的严格程度,以及引入惯性信息做一致性检查,才把这类错误点压下去。

5. 回环检测与地图合并的完整链路

5.1 基于词袋模型的位置识别

回环检测的第一步是位置识别,也就是判断当前帧是否回到了之前去过的地方。ORB-SLAM3用的是DBoW2词袋模型,把ORB描述子量化成视觉单词,然后通过倒排索引快速检索相似的关键帧。

论文里提到,系统会维护一个关键帧数据库,每个关键帧用词袋向量表示。当新关键帧插入时,系统会在数据库里搜索相似的关键帧,如果相似度超过阈值,就认为是候选回环。候选回环还需要经过几何验证,也就是用特征匹配和位姿估计确认两个关键帧确实观测到了同一个场景。

词袋模型的好处是检索速度快,适合大规模地图。但它也有局限性:如果场景里有大量重复纹理,词袋模型容易产生误匹配。论文里提到,系统会用时间一致性检查和共视关系检查来过滤误匹配,但实际使用中还是需要调参。

5.2 回环校正与位姿图优化

确认回环之后,系统会做回环校正。校正的过程是:先计算当前关键帧和回环关键帧之间的相对位姿,然后把这个位姿作为约束,加入到全局位姿图优化里。位姿图优化的变量是所有关键帧的位姿,约束包括相邻关键帧之间的相对位姿和回环约束。

论文里提到,ORB-SLAM3的位姿图优化用的是莱文贝格-马夸特方法,优化目标是最小化所有约束的误差。优化完成后,系统会根据优化后的位姿调整地图点位置,完成回环校正。

这里有一个细节值得注意:回环校正之后,系统还需要做地图点的融合。因为回环意味着两个关键帧观测到了同一个场景,它们各自的地图点可能是重复的。系统会把重复的地图点合并,更新共视关系,保证地图的一致性。这个过程在论文里没有展开讲,但实际实现时很关键,处理不好会导致地图里出现大量重复点,影响后续跟踪。

5.3 多地图合并的触发条件与执行过程

多地图合并是ORB-SLAM3相对ORB-SLAM2的一个重大升级。当系统在某个子地图里检测到回环,而这个回环的关键帧属于另一个子地图时,就会触发地图合并。

合并的过程分几步:首先,系统会计算两个子地图之间的相对位姿,通常是通过回环关键帧的位姿关系来估计。然后,系统会把两个子地图的关键帧和地图点合并到一个地图里,同时做位姿图优化,把两个地图的坐标系对齐。最后,系统会更新共视图和地图点观测关系,保证合并后的地图可以正常用于跟踪。

论文里提到,地图合并的触发条件除了回环检测,还可以通过惯性信息来判断。如果两个子地图的惯性测量显示它们在同一重力方向下运动,系统会认为它们可能属于同一个物理空间,从而尝试合并。

我在实际测试中发现,地图合并的成功率很大程度上取决于回环检测的质量。如果回环检测误报,地图合并会把两个不相关的地图强行拼在一起,导致后续跟踪彻底崩溃。所以实际使用时,回环检测的阈值不能设得太松,宁可漏检也不要误检。

6. 惯性初始化与尺度估计的实操细节

6.1 惯性初始化的三个阶段

ORB-SLAM3的惯性初始化分三个阶段:视觉初始化、惯性初始化和联合优化。视觉初始化就是先用纯视觉跑一段时间,建立初始地图和关键帧位姿。惯性初始化则是在视觉初始化完成后,用IMU数据估计重力方向、尺度和初始偏置。联合优化是把视觉和惯性约束放在一起做BA,进一步优化所有状态量。

论文里提到,惯性初始化需要足够的运动激励。如果相机在初始化阶段运动太少,IMU的偏置和尺度估计会不准。具体来说,系统需要相机在多个轴上都有旋转和平移,才能充分观测到重力方向和尺度信息。

我在实际使用中总结了一个经验:初始化阶段最好让相机做“8字形”运动,也就是同时有平移和旋转,这样IMU的各个轴都能被激励到。如果只是平推或者只是原地旋转,初始化很容易失败或者估计出的尺度偏差很大。

6.2 尺度估计与重力方向对齐

单目SLAM的尺度是不确定的,ORB-SLAM3通过IMU来恢复尺度。具体来说,系统会把IMU预积分得到的位置变化和视觉估计的位置变化做对比,通过最小化两者之间的差异来估计尺度因子。同时,系统还会估计重力方向,把视觉地图的坐标系对齐到重力坐标系。

论文里给了尺度估计的公式,核心思想是:IMU预积分的位置变化和视觉位置变化之间差一个尺度因子和旋转矩阵。通过求解一个最小二乘问题,可以得到尺度因子和重力方向。

这个过程听起来简单,但实际实现时有很多坑。比如IMU的偏置如果没有估计准,尺度估计会有系统偏差。再比如重力方向的估计对加速度计的噪声很敏感,如果IMU质量不好,重力方向会估计得不准,导致地图倾斜。我在测试中发现,用低成本的IMU做初始化时,重力方向的误差可能达到几度,这时候需要更长时间的初始化或者更好的滤波。

6.3 惯性模式下的跟踪稳定性调优

惯性模式开启后,系统的跟踪稳定性会明显提升,尤其是在快速运动或者视觉退化的场景里。但惯性模式也引入了新的调参需求。比如IMU预积分的噪声参数、偏置随机游走的参数、以及视觉和惯性约束的权重,这些都会影响跟踪效果。

论文里给了一组默认参数,但实际使用时需要根据IMU的质量和场景特点调整。我一般会先跑一段数据,观察跟踪误差和IMU预积分的残差,然后调整噪声参数。如果IMU噪声大,就增大预积分的噪声参数,让优化器更依赖视觉观测;如果视觉退化严重,就减小噪声参数,让优化器更依赖惯性约束。

还有一个容易忽略的点:IMU和相机之间的时间同步。如果两者时间戳有偏差,预积分结果会和视觉观测对不上,导致跟踪精度下降。论文里假设IMU和相机已经做了时间同步,但实际硬件上这个同步往往需要额外处理。我在一个项目里遇到过时间戳偏差几毫秒的情况,跟踪误差明显增大,后来通过离线标定做了时间对齐才解决。

7. 论文里没写但实际复现时容易卡住的地方

7.1 代码结构与论文的对应关系

ORB-SLAM3的代码量不小,刚上手时容易迷失。我的建议是先看论文的系统总览图,把几个主要线程和数据结构搞清楚,然后再去代码里找对应的类。比如跟踪线程对应Tracking类,局部建图对应LocalMapping类,回环检测对应LoopClosing类,Atlas对应Atlas类。

论文里的公式和代码里的实现往往有差异。比如论文里写的预积分公式是理论形式,代码里为了效率做了很多近似和优化。如果你要改代码,最好先确认论文里的公式和代码里的实现是不是一致的,不一致的地方以代码为准,但理解论文有助于你知道代码为什么这么写。

7.2 数据集与传感器配置的匹配问题

ORB-SLAM3支持多种传感器配置,但不同数据集和实际硬件的配置差异很大。论文里用的数据集主要是EuRoC和TUM VI,这些数据集的IMU频率、噪声特性、时间同步质量都比较好。如果你用自己的硬件跑,需要先确认IMU和相机的参数是否标定准确,时间戳是否同步。

我见过不少人直接拿论文的配置文件跑自己的数据,结果跟踪效果很差,然后怀疑是算法问题。其实很多时候是传感器标定或者时间同步的问题。建议在跑ORB-SLAM3之前,先单独验证IMU和相机的标定参数,确保重投影误差在合理范围内。

7.3 参数调整的优先级与常见误区

ORB-SLAM3的配置文件里有大量参数,刚上手时容易不知道从哪调起。我的经验是,先调特征提取相关的参数,比如每帧特征数、FAST阈值、金字塔层数。这些参数直接影响跟踪的鲁棒性。然后再调关键帧插入和地图点剔除的参数,这些影响地图的密度和质量。最后调惯性相关的参数,这些影响惯性融合的效果。

一个常见的误区是,很多人一上来就调惯性参数,觉得惯性融合是核心。但实际上,如果视觉跟踪本身就不稳定,惯性融合也救不回来。所以先把视觉部分调稳,再调惯性部分,效果会好很多。

还有一个误区是过度追求精度而忽略实时性。ORB-SLAM3的默认参数在桌面平台上可以实时运行,但在嵌入式平台上可能需要降频或者减少特征数。我一般会先保证实时性,再在实时性满足的前提下尽量提高精度。如果实时性都保证不了,精度再高也没意义。

8. 我个人在翻译和复现过程中的几点体会

翻译ORB-SLAM3论文的过程,其实也是重新学习一遍视觉惯性SLAM的过程。论文里的很多公式,第一次看的时候觉得懂了,但真正动手复现或者改代码的时候,才发现理解得不够深。比如预积分的雅可比矩阵,论文里给了推导,但实际实现时需要考虑数值稳定性和计算效率,这些论文里不会讲。

另外,ORB-SLAM3的多地图系统虽然强大,但实际使用时需要根据场景权衡。如果你的应用场景比较固定,相机不会跑出建图区域,那么多地图系统的优势不明显,反而增加了系统复杂度。但如果你的应用需要长期运行或者大范围移动,多地图系统就很有价值。

最后说一点关于论文阅读的方法。ORB-SLAM3的论文信息密度很高,第一遍读的时候不要纠结每个公式的推导,先把握系统架构和每个模块的作用。第二遍再深入看公式,结合代码理解。第三遍可以针对自己关心的部分精读,比如你做惯性融合,就重点看预积分和初始化部分。这样分层次阅读,效率会高很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询