ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)系统,以下是对其的详细解析:
一、系统概述
ORB-SLAM3可以在单目、双目和RGB-D相机上利用针孔或者鱼眼模型运行。它是第一个基于特征的紧耦合的视觉惯性里程计(VIO)系统,仅依赖于最大后验估计(包括IMU在初始化时)。这样的系统效果是:不管是在大场景还是小场景,室内还是室外,都能鲁棒实时地运行,且在精度上相比于上一版提升了2到5倍。
二、系统特点与创新
-
数据关联与混合地图:
- ORB-SLAM3是第一个可能对短期、中期、长期数据进行数据关联的视和视觉惯导的系统。
- 根据改进recall的新的重定位模块来构建的混合地图,这个模块可以让ORB-SLAM3在特征不是很好的场景中长期运行。当视觉里程计失败的时候,系统会重新构建地图并将这个地图和原来构建的地图对齐。
- Atlas是一个由一系列离散的地图组成的混合地图,会维护一个active map来定位新的关键帧。local mapping线程会不断地优化更新这个地图。Atlas里还有non-active地图。
-
重定位与地图融合:
- 当跟踪线程跟丢时,跟踪线程会尝试在所有的Atlas中完成当前帧的重定位。如果重定位成功,跟踪就被拉回;否则,过一段时间后,activate会重新存储为non-active,并初始化一个新的active map。
- 闭环检测和地图融合线程会在active map和整个Atlas中检测相同的区域。如果相同的区域在active中,就会执行闭环的过程;如果属于不同的map,它们就会被融合为一个地图。
-
抽象的相机表示:
- 使SLAM系统与所使用的相机模型无关,并允许通过提供投影、非投影和雅可比函数来添加新模型。系统提供了针孔模型和鱼眼模型的实现。
-
视觉-惯导融合:
- ORB-SLAM3是一个单目和双目的视觉惯导SLAM系统,全部依赖于最大后验估计(MAP),即使是在IMU初始化的时候。
- 在有惯导的情况下,IMU的参数是利用MAP估计来初始化和优化的。
-
召回场景识别:
- 召回场景识别采用先检查候选关键帧的几何一致性,然后检查与三个共视关键帧的局部一致性策略。以略高的计算成本为代价,增加了召回率并增加了数据关联,提高了地图准确性。
三、系统框架与流程
ORB-SLAM3的系统框架主要包括数据处理、初始化、视觉里程计、地图维护、闭环检测等部分。具体流程如下:
- 数据处理:对获得的视觉图像进行特征提取和畸变矫正。同时,根据预测模型计算当前帧IMU提供的位姿。
- 初始化:进行IMU数据的单目初始化。在视觉跟踪丢失时,IMU可以提供短时间的位姿。在恒速跟踪模型中,如果IMU完成初始化,当前帧位姿初始值可由IMU的预测模型得到。
- 视觉里程计:以第一帧图像为参考帧,对后续的视觉帧进行特征匹配、位姿求解(对极约束)和三角化,完成3D地图点的生成,供后续PNP(3D-2D)求解。
- 地图维护:主要维护地图中的地图点。由于每个地图点都会被许多相机观测到,每个关键帧都有相对地图点的不同描述子,因此在新关键帧插入后,需要对每个受新关键帧影响的地图点法向量、描述子等进行更新。
- 闭环检测:主要通过视觉词典完成当前帧与历史关键帧之间相对位姿的求解。如果检测到两关键帧是同一地点,会根据情况执行回环矫正或地图合并。
四、性能与应用
ORB-SLAM3在EuRoC数据集上达到了平均3.6cm的精度,在TUM-VI这种利用手持设备快速移动的数据集(AR/VR场景)上达到了9mm的精度。其应用场景包括但不限于机器人导航、自动驾驶、增强现实(AR)和虚拟现实(VR)等领域。
综上所述,ORB-SLAM3是一个高精度、鲁棒性强的SLAM系统,具有广泛的应用前景和重要的研究价值。
ORB-SLAM3的代码详细解析可以从其系统结构和主要模块入手,以下是对其代码的详细解析:
五、系统结构
ORB-SLAM3的代码结构清晰,主要包括主程序(main)、前端模块(tracking)、后端核心模块(localmapping和loopclosing)、可视化工具(viewer)以及工具函数和通用模块(utils)。
六、主要模块
-
主程序(main)
- 功能:负责系统的初始化,包括参数读取、系统对象创建以及相关线程的启动等操作。
- 实现:在初始化ROS(如果使用ROS版本)系统后,创建ORB_SLAM3系统对象,并准备好图像和IMU(如果有)的数据获取接口。
-
前端模块(tracking)
- 功能:主要负责相机姿态估计和特征点跟踪。
- 实现:
- 使用ORBextractor类进行特征点提取。首先对输入的图像进行预处理,例如灰度化、高斯滤波等操作,以减少噪声对特征点提取的影响。然后根据ORB算法的原理,在图像上检测角点,并计算这些角点的特征描述符。
- 使用Matcher类进行特征点匹配。常见的匹配方法包括暴力匹配和基于FLANN(Fast Library for Approximate Nearest Neighbors)的匹配。为了提高匹配的准确性,还会进行一些筛选操作,例如去除距离过大的匹配对(可能是错误的匹配),或者使用RANSAC(Random Sample Consensus)算法来估计基础矩阵,并根据基础矩阵进一步筛选匹配对。
- 估计当前帧位姿:对于后续的每一帧图像,通过与之前的关键帧进行特征点匹配,利用PnP(Perspective-n-Point)算法或者其他位姿估计方法来估计当前帧的相机姿态。
- 优化当前帧位姿:使用优化算法(如Gauss-Newton法或Levenberg-Marquardt法)对估计的相机姿态进行优化,以提高姿态的准确性。
-
后端核心模块
-
localmapping:管理和优化局部地图。
- 功能:关键帧管理、地图点管理、局部BA优化等。
- 实现:决定哪些帧应该被选为关键帧,管理关键帧之间的连接关系,构建共视图(Covisibility Graph)。当新的关键帧被创建时,会将关键帧中的特征点初始化为地图点,并插入到局部地图中。同时,会根据特征点的匹配关系和三角测量原理,计算地图点的3D位置。定期进行局部束调整(Bundle Adjustment)优化,以优化局部地图中关键帧的姿态和地图点的位置。
-
loopclosing:回环检测和闭环优化模块。
- 功能:用于检测历史轨迹中的回环,并对全局地图进行优化以消除累积误差。
- 实现:检测当前帧是否与历史关键帧形成回环。如果检测到可能的回环,会进行进一步的验证。当回环被确认时,会计算当前帧与回环关键帧之间的变换矩阵,并基于回环检测的结果进行全局图优化。全局优化会同时考虑所有的关键帧和地图点,通过最小化全局的重投影误差来调整关键帧的姿态和地图点的位置。
-
-
可视化工具(viewer)
- 功能:通过OpenGL等技术实现实时的3D视图显示,帮助用户直观地观察SLAM系统的运行情况和构建的地图。
- 实现:从ORB_SLAM3系统中获取最新的相机姿态、地图点等信息,并将这些信息转换为可视化的格式,例如将3D点转换为OpenGL中的顶点数据,将相机姿态转换为视图变换矩阵。然后使用OpenGL等图形库进行渲染,绘制出当前的地图和相机轨迹。
-
工具函数和通用模块(utils)
- 功能:包含各种工具函数和通用模块,例如数学运算、文件操作、时间处理等辅助功能,为其他模块提供支持。
七、代码运行流程
- 系统初始化:首先进行一些基本的设置和参数读取,例如读取配置文件中的相机参数、IMU参数(如果使用)、地图保存路径等信息。然后根据配置创建ORB_SLAM3系统对象,该对象是整个SLAM系统的核心控制对象,它会管理各个模块的运行和交互。
- 数据获取线程启动:创建图像和IMU数据的获取线程。如果是从摄像头获取图像数据,会订阅相应的图像话题,并设置回调函数来接收图像数据。对于IMU数据也是类似,订阅IMU数据话题并在回调函数中处理数据。
- 系统运行:启动ORB_SLAM3系统的运行,这通常会触发各个模块的初始化和开始运行。主程序会进入一个循环,等待系统的运行结束或者用户的退出操作。
ORB-SLAM3的代码结构清晰、模块分明,通过各个模块的协同工作实现了高精度的SLAM功能。