ORB-SLAM3代码详解(一)----代码整体框架
原理五花八门,不如花点时间搞懂代码!(建议看完《视觉SLAM十四讲》再来看我的这个) 源码链接:https://github.com/UZ-SLAMLab/ORB_SLAM3 论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9440682 首先介绍一下整体框架: 这是 ORB-SLAM3 系统的主要组件框架图。图中展示了 ORB-SLAM3 的各个关键模块及其交互关系。 翻译:
中文解释:ORB-SLAM3 包括以下几个主要模块:
Tracking(跟踪):
从帧中提取ORB特征。IMU数据集成。通过从最后一帧、重定位或地图创建的初始位姿估计进行跟踪。跟踪局部地图。新关键帧决策。 Atlas(地图集):
包含“活动地图”和“非活动地图”。活动地图中有地图点(MapPoints)、关键帧(KeyFrames)、共视图(Covisibility Graph)和生成树(Spanning Tree)。非活动地图中也包含地图点、关键帧、共视图和生成树。 DBoW2 KeyFrame Database(DBoW2关键帧数据库):
包含视觉词典(Visual Vocabulary)和识别数据库(Recognition Database)。 Local Mapping(局部建图):
关键帧插入。最近地图点裁剪。新地图点创建。局部BA(Bundle Adjustment)。IMU初始化。局部关键帧裁剪。IMU尺度细化。 Loop & Map Merging(回环与地图合并):
回环检测、图优化、回环融合、地图合并。计算Sim3/SE3。数据库查询。 Full BA(全局BA):
地图更新。完整的Bundle Adjustment。焊接BA。
这张图展示了ORB-SLAM3系统如何通过这些模块实现SLAM功能,包括跟踪、局部建图、回环检测与地图合并,以及全局优化。
一、结构
下面是使用Ubuntu18.04,终端命令:tree -L 2 调出的文件两层树结构,更加详细的结构可以通过命令:tree 查看(注意调用命令时候应该在所查看文件路径下打开终端):
book@100ask:~/ORB_SLAM3-master$ tree -L 2
(src包含了核心算法(特征提取、相机跟踪、地图构建、图优化、回环检测),Examples中是使用实例(单目、双目、单目+IMU、双目+IMU、RGB-D、RGB-D+IMU)) ├── build_ros.sh ├── build.sh ├── Calibration_Tutorial.pdf ├── Changelog.md ├── CMakeLists.txt ├── Dependencies.md ├── evaluation │ ├── associate.py │ ├── evaluate_ate_scale.py │ └── Ground_truth ├── Examples │ ├── Calibration │ ├── Monocular │ ├── Monocular-Inertial │ ├── REAMDME.md │ ├── RGB-D │ ├── RGB-D-Inertial │ ├── Stereo │ └── Stereo-Inertial ├── Examples_old │ ├── Monocular │ ├── Monocular-Inertial │ ├── REAMDME.md │ ├── RGB-D │ ├── RGB-D-Inertial │ ├── ROS │ ├── Stereo │ └── Stereo-Inertial ├── include │ ├── Atlas.h │ ├── CameraModels │ ├── Config.h │ ├── Converter.h │ ├── FrameDrawer.h │ ├── Frame.h │ ├── G2oTypes.h │ ├── GeometricTools.h │ ├── ImuTypes.h │ ├── KeyFrameDatabase.h │ ├── KeyFrame.h │ ├── LocalMapping.h │ ├── LoopClosing.h │ ├── MapDrawer.h │ ├── Map.h │ ├── MapPoint.h │ ├── MLPnPsolver.h │ ├── OptimizableTypes.h │ ├── Optimizer.h │ ├── ORBextractor.h │ ├── ORBmatcher.h │ ├── ORBVocabulary.h │ ├── SerializationUtils.h │ ├── Settings.h │ ├── Sim3Solver.h │ ├── System.h │ ├── Tracking.h │ ├── TwoViewReconstruction.h │ └── Viewer.h ├── LICENSE ├── README.md ├── src │ ├── Atlas.cc │ ├── CameraModels │ ├── Config.cc │ ├── Converter.cc │ ├── Frame.cc │ ├── FrameDrawer.cc │ ├── G2oTypes.cc │ ├── GeometricTools.cc │ ├── ImuTypes.cc │ ├── KeyFrame.cc │ ├── KeyFrameDatabase.cc │ ├── LocalMapping.cc │ ├── LoopClosing.cc │ ├── Map.cc │ ├── MapDrawer.cc │ ├── MapPoint.cc │ ├── MLPnPsolver.cpp │ ├── OptimizableTypes.cpp │ ├── Optimizer.cc │ ├── ORBextractor.cc │ ├── ORBmatcher.cc │ ├── Settings.cc │ ├── Sim3Solver.cc │ ├── System.cc │ ├── Tracking.cc │ ├── TwoViewReconstruction.cc │ └── Viewer.cc ├── Thirdparty │ ├── DBoW2 │ ├── g2o │ └── Sophus └── Vocabulary └── ORBvoc.txt.tar.gz
27 directories, 67 files
二、功能
下面我将详细介绍ORB_SLAM3项目结构中的各个文件夹和文件,并解释它们的作用及相互之间的联系。
根目录中的文件
build_ros.sh:
作用: 这个脚本用于在ROS环境中编译ORB-SLAM3。它通常包括一些用于设置环境变量、调用CMake配置、生成和安装可执行文件的命令。这个脚本专门针对ROS环境,通过编译生成与ROS兼容的节点和库,使ORB-SLAM3能够在ROS框架下运行。 build.sh:
作用: 这个脚本用于在标准C++环境中编译ORB-SLAM3(不依赖于ROS)。它通过调用CMake和make来配置和编译项目,生成适用于非ROS应用的可执行文件。 Calibration_Tutorial.pdf:
作用: 这个PDF文件提供了相机校准的教程,指导用户如何使用工具(如OpenCV)来校准相机并生成所需的校准文件(例如内参和畸变参数)。这些参数对SLAM系统的精确性至关重要。 Changelog.md:
作用: 这个文件记录了ORB-SLAM3项目的更新日志,列出了各个版本的改进、修复的bug、新增的功能等内容。 CMakeLists.txt:
作用: CMake的配置文件,定义了项目的构建系统。它列出了源文件、头文件、依赖库、编译选项等信息,并且指导CMake生成Makefile或其他构建系统的配置文件,以便编译ORB-SLAM3。 Dependencies.md:
作用: 这个文件列出了ORB-SLAM3项目的依赖项及其安装方法,包括第三方库如DBoW2、g2o、Sophus等,帮助用户设置开发环境。
evaluation 文件夹
作用: 这个文件夹包含用于评估ORB-SLAM3系统性能的工具和脚本。
associate.py:
作用: 将SLAM系统输出的轨迹文件与地面真实数据(Ground Truth)文件关联,匹配时间戳并生成对应的轨迹点对,便于后续的误差计算。 evaluate_ate_scale.py:
作用: 用于计算SLAM系统轨迹的绝对轨迹误差(Absolute Trajectory Error, ATE),这是衡量SLAM系统精度的重要指标。 Ground_truth:
作用: 存储地面真实数据,用于与SLAM系统输出的轨迹进行对比和评估。这些数据可能是来自公开数据集的真值位姿。
Examples 文件夹
作用: 这个文件夹包含了针对不同传感器配置的示例代码,展示了如何在各种场景下使用ORB-SLAM3系统。
Calibration:
作用: 提供相机校准的示例,帮助用户生成SLAM系统所需的内参和畸变参数文件。 Monocular:
作用: 展示了如何使用单目相机(单个摄像头)进行SLAM的示例代码,包括初始化、特征提取与匹配、位姿估计以及地图构建。 Monocular-Inertial:
作用: 展示了如何结合单目相机和IMU传感器进行SLAM的示例代码。通过IMU数据的辅助,系统可以在光照变化或运动模糊的情况下继续跟踪相机位姿。 RGB-D:
作用: 提供了使用RGB-D相机(如Kinect、RealSense)进行SLAM的示例代码,利用深度信息来增强位姿估计的准确性。 RGB-D-Inertial:
作用: 展示了如何结合RGB-D相机和IMU传感器进行SLAM。该配置可以在复杂的环境中提供更为稳定的定位和建图能力。 Stereo:
作用: 展示了如何使用立体摄像头(双目相机)进行SLAM的示例代码,通过双目视差来计算深度信息,并利用这些信息构建地图。 Stereo-Inertial:
作用: 提供了结合立体摄像头和IMU传感器的SLAM示例代码,通过视觉和惯性数据的结合,提升系统的鲁棒性和精度。
Examples_old 文件夹
作用: 这个文件夹包含旧版本的示例代码,适用于ORB-SLAM3的早期版本或特定的硬件配置。这些示例可能已经过时,但仍然可以作为参考资源。
Monocular:
作用: 早期版本的单目相机SLAM示例代码。 Monocular-Inertial:
作用: 早期版本的单目+IMU传感器的SLAM示例代码。 RGB-D:
作用: 早期版本的RGB-D相机SLAM示例代码。 RGB-D-Inertial:
作用: 早期版本的RGB-D+IMU传感器的SLAM示例代码。 ROS:
作用: 早期版本的用于ROS环境的SLAM示例代码。 Stereo:
作用: 早期版本的双目相机SLAM示例代码。 Stereo-Inertial:
作用: 早期版本的双目+IMU传感器的SLAM示例代码。 REAMDME.md:
作用: 提供关于Examples_old目录中示例代码的说明文档。
include 文件夹
作用: 该文件夹包含了ORB-SLAM3项目的头文件,这些头文件定义了系统的核心数据结构、类和接口,是src目录中源文件的声明部分,使得不同模块之间能够相互调用并共享信息。
Atlas.h:
作用: 定义SLAM系统中地图的核心数据结构Atlas,包括管理关键帧、地图点等信息。 CameraModels:
作用: 包含不同相机模型的头文件,定义了不同相机的内参和畸变校正模型。 Config.h:
作用: 定义配置管理类,负责加载和存储系统的配置参数。 Converter.h:
作用: 提供数据格式转换工具的头文件,用于坐标系转换、矩阵与四元数转换等操作。 FrameDrawer.h:
作用: 定义帧绘制类,负责可视化显示SLAM系统中每一帧的跟踪结果。 Frame.h:
作用: 定义帧的核心数据结构,Frame包含图像、特征点等信息,是SLAM系统的基本处理单元。 G2oTypes.h:
作用: 定义与g2o优化库相关的数据类型,用于图优化任务。 GeometricTools.h:
作用: 提供几何计算工具的头文件,包含一些辅助几何计算函数。 ImuTypes.h:
作用: 定义IMU数据类型和相关处理类的头文件。 KeyFrameDatabase.h:
作用: 定义关键帧数据库类,管理系统中的所有关键帧及其索引。 KeyFrame.h:
作用: 定义关键帧的数据结构,包含图像数据、位姿信息、地图点等。 LocalMapping.h:
作用: 定义局部地图构建类,负责在SLAM系统中进行局部地图的扩展和优化。 LoopClosing.h:
作用: 定义闭环检测类,负责检测系统是否回到已经经过的地方,并修正位姿误差。 MapDrawer.h:
作用: 定义地图绘制类,用于可视化显示SLAM系统构建的地图。 Map.h:
作用: 定义地图数据结构,`Map
`包含地图点、关键帧等全局地图信息。
MapPoint.h:
作用: 定义地图点的数据结构,包含地图中三维点的信息。 MLPnPsolver.h:
作用: 定义多层感知机PnP求解器,用于基于深度学习模型来求解位姿的类和函数。 OptimizableTypes.h:
作用: 定义可优化的类型,用于图优化中表示待优化的变量和误差。 Optimizer.h:
作用: 定义优化器类,Optimizer使用g2o库对SLAM系统中的位姿和地图点进行全局优化,减少误差累积。 ORBextractor.h:
作用: 定义ORB特征提取器类,包含提取ORB特征的核心算法。 ORBmatcher.h:
作用: 定义ORB特征匹配器类,负责在不同帧之间进行ORB特征的匹配,从而实现跟踪、建图和闭环检测。 ORBVocabulary.h:
作用: 定义ORB词典类,用于回环检测和场景识别的词袋模型。 SerializationUtils.h:
作用: 提供序列化工具的头文件,用于将SLAM系统的数据结构序列化为文件格式,方便保存和加载。 Settings.h:
作用: 定义系统配置类,用于读取和存储系统的配置参数。 Sim3Solver.h:
作用: 定义Sim3求解器类,用于估计位姿之间的相似变换。 System.h:
作用: 定义SLAM系统的核心类,包含了系统的主要功能,如初始化、跟踪、建图、回环检测等。 Tracking.h:
作用: 定义跟踪模块类,负责在每一帧中跟踪相机的位姿。 TwoViewReconstruction.h:
作用: 定义双目重建类,用于从两张视角不同的图像中重建三维场景。 Viewer.h:
作用: 定义可视化显示类,用于实时显示SLAM系统的运行结果和地图。
src 文件夹
作用: 该文件夹包含了ORB-SLAM3项目的源代码文件。这里的.cc和.cpp文件是实际的功能实现,头文件中的声明在这里得到定义。
各个源文件与include文件夹中的头文件一一对应,如Atlas.cc与Atlas.h对应,ORBextractor.cc与ORBextractor.h对应。通过这种方式,ORB-SLAM3项目将声明与实现分离,便于模块化开发和维护。 在src文件夹中,主要包含了ORB-SLAM3实现中各个核心模块的源代码。这些模块对应SLAM系统的不同功能,包括特征提取、相机跟踪、地图构建、图优化、回环检测等。下面详细介绍src文件夹中一些关键文件和它们包含的核心算法:
***********************核心算法 **************************
1. System.cc
核心算法: ORB-SLAM3系统的入口和主要控制逻辑,负责初始化系统、处理输入数据(图像、IMU等)、管理各个模块的交互。它协调跟踪、建图、回环检测模块,构成SLAM系统的主流程。功能:
初始化系统参数、加载词典、设置相机模型。调用跟踪模块处理每一帧数据。调用回环检测和全局优化模块。处理单目、双目、RGB-D和惯性传感器的SLAM。
2. Tracking.cc
核心算法: 相机的位姿跟踪算法。在每一帧中,跟踪模块负责通过特征匹配或直接法估计相机的位姿。功能:
ORB特征提取与匹配。通过位姿预测、运动模型或光流法进行粗略跟踪。基于PnP(透视n点问题)或优化方法精确估计相机位姿。处理不同类型的输入(单目、双目、RGB-D、IMU)。
3. LocalMapping.cc
核心算法: 局部地图更新与优化。该模块负责将新帧整合进地图,并在局部范围内进行优化。功能:
新关键帧的插入与地图点的添加。通过局部BA(Bundle Adjustment)优化关键帧和地图点。剔除冗余的关键帧和地图点,保持地图的有效性。
4. LoopClosing.cc
核心算法: 回环检测与全局图优化。该模块检测相机是否回到之前经过的地方,并通过全局优化来减少累积误差。功能:
通过词袋模型检测可能的回环。基于Sim3(相似性变换)估计回环闭合时的位姿变换。进行全局优化(例如,使用g2o库进行全局BA),校正地图中所有关键帧和地图点的位姿。
5. Optimizer.cc
核心算法: 图优化算法。ORB-SLAM3使用g2o库进行位姿和地图点的全局和局部优化。功能:
局部BA:对当前帧附近的关键帧和地图点进行优化。全局BA:对整个地图进行优化,通常在回环检测后触发。Pose Graph Optimization(位姿图优化):在回环检测后调整整个地图的位姿图。
6. KeyFrame.cc
核心算法: 关键帧管理与操作。关键帧是SLAM系统中保存的重要帧,通常包含丰富的特征信息,用于地图构建和优化。功能:
保存图像特征、位姿、地图点等信息。维护关键帧之间的连接关系,形成位姿图。
7. MapPoint.cc
核心算法: 地图点管理与操作。地图点是SLAM系统中表示三维场景点的基本元素。功能:
保存地图点的三维坐标、可见性、与关键帧的关联关系等。进行地图点的添加、更新和剔除。
8. ORBextractor.cc
核心算法: ORB特征提取算法。ORB(Oriented FAST and Rotated BRIEF)是一种高效的特征点检测和描述方法。功能:
检测图像中的关键点(使用FAST算法)。计算关键点的方向和描述子(使用BRIEF算法)。
9. ORBmatcher.cc
核心算法: ORB特征匹配算法。负责在不同帧之间匹配ORB特征,提供跟踪、建图和回环检测的基础。功能:
使用Hamming距离在不同图像之间匹配ORB描述子。进行基础矩阵或单应矩阵的计算,以剔除误匹配。
10. Sim3Solver.cc
核心算法: Sim3求解算法。用于估计两组点云之间的相似变换(包括旋转、平移和缩放),通常在回环检测时使用。功能:
基于RANSAC估计Sim3变换。处理尺度变化的场景,如单目SLAM中的回环检测。
11. G2oTypes.cc
核心算法: 定义与g2o优化库相关的数据类型和操作,构建用于图优化的因子图。功能:
定义优化变量(如位姿、地图点)。定义误差项和约束条件,用于BA和位姿图优化。
12. ImuTypes.cc
核心算法: IMU数据处理与积分算法。在视觉惯性SLAM中,IMU数据用于补充视觉信息,提升系统的鲁棒性。功能:
对IMU数据进行预积分处理,提供高频率的位姿估计。结合IMU和视觉信息,提升运动估计的精度。
13. TwoViewReconstruction.cc
核心算法: 双目视图重建算法。用于从两张不同视角的图像中重建三维场景点。功能:
估计相机的基础矩阵或单应矩阵。通过三角测量重建三维点云。
14. GeometricTools.cc
核心算法: 提供几何计算工具。该文件包含一些常用的几何操作,如三角测量、旋转矩阵与四元数的转换等。功能:
基础几何计算,辅助SLAM系统中的位置和姿态估计。
这些源文件共同构成了ORB-SLAM3的核心算法,实现了从特征提取、跟踪、建图、优化到回环检测的完整SLAM流程。每个模块都有明确的职责,并通过数据结构和函数调用进行交互,形成一个紧密集成的SLAM系统。
Thirdparty 文件夹
作用: 这个文件夹包含了ORB-SLAM3项目依赖的第三方库。通常这些库不在系统默认路径中,因而直接包含在项目中,确保项目的可移植性。
DBoW2:
作用: 这是一个用于实现词袋模型(Bag of Words)数据结构的库,ORB-SLAM3使用它来进行回环检测和场景识别。 g2o:
作用: 一个开源的图优化库,ORB-SLAM3使用它来进行位姿和地图点的全局优化,减少漂移和误差累积。 Sophus:
作用: 一个处理李代数和李群的库,用于几何计算中的旋转和平移操作,ORB-SLAM3使用它来处理位姿变换。
Vocabulary 文件夹
作用: 这个文件夹包含了ORB-SLAM3使用的ORB特征词典,用于词袋模型的回环检测和场景识别。
ORBvoc.txt.tar.gz:
作用: 这是经过训练的ORB词典文件,压缩存储于此,SLAM系统启动时会加载它来进行回环检测。 综上所述,ORB-SLAM3项目通过将不同功能模块的代码进行良好的分层和模块化设计,使得各个模块之间能够协作并有效管理复杂的SLAM系统。通过这种设计,用户能够根据需要扩展或修改特定模
块
的功能,同时也可以更方便地理解和使用整个系统。 上述内容仅供个人学习,后期发现错误会进行更新,如果有发现错误的老铁可以评论区留言,非常感谢! 下一期分享核心代码阅读心得 学习ORB-SLAM3源码的路线可以分为几个阶段,从基础的系统框架到具体的算法实现。以下是详细的学习路线,包括每个阶段的重点文件和建议的学习顺序:
*三、学习步骤
从整体到局部: 先了解整个系统的结构和主要功能,然后逐步深入到具体的算法实现。 阅读注释和文档: 阅读代码中的注释和文档,帮助理解复杂的算法和数据流。 实验和调试: 在理解每个模块的功能后,尝试运行示例代码并进行调试,帮助加深对源码的理解。 结合实际应用: 将所学知识应用到实际问题中,测试和调整SLAM系统,以增强对其工作原理的理解。
1. 理解系统框架和整体结构
System.cc:
了解SLAM系统的初始化、数据处理流程、主要功能函数。学习如何启动和管理SLAM系统。 Config.cc:
理解如何读取和解析配置文件,了解系统的参数设置。 Converter.cc:
了解数据类型的转换工具,如何将数据从一种格式转换为另一种格式。
2. 掌握前端处理
Tracking.cc:
理解特征提取、匹配、位姿估计、帧处理等前端工作。学习如何处理图像数据、提取关键点、进行帧间匹配等。 ORBextractor.cc:
深入了解ORB特征的提取算法。理解如何从图像中提取ORB特征点和描述子。 ORBmatcher.cc:
了解ORB特征点的匹配过程。学习如何通过特征描述子进行点匹配和帧间关联。
3. 理解地图构建与维护
LocalMapping.cc:
了解如何在局部区域构建和优化地图。学习关键帧的插入、地图点的更新等。 Map.cc 和 MapPoint.cc:
理解如何表示和管理地图和地图点。学习地图点的创建、更新、删除等操作。 KeyFrame.cc 和 KeyFrameDatabase.cc:
了解关键帧的管理和数据库操作。学习如何存储、检索和匹配关键帧。
4. 探索回环检测和全局优化
LoopClosing.cc:
理解回环检测的算法。学习如何检测和处理回环以优化全局地图。 Optimizer.cc 和 G2oTypes.cc:
了解位姿图优化算法和相关数据结构。学习如何使用g2o库进行图优化。 Sim3Solver.cc:
理解尺度不变相似变换(Sim3)的求解方法。学习如何通过Sim3优化位姿估计。
5. 学习可视化和辅助功能
Viewer.cc 和 FrameDrawer.cc:
了解如何将SLAM结果进行可视化。学习如何展示地图、关键帧和轨迹。 GeometricTools.cc:
掌握一些几何工具函数的实现。学习如何进行几何计算和变换。 MLPnPsolver.cpp:
了解多点拟合算法(如PnP)在SLAM中的应用。学习如何求解相机位姿。
6. 辅助学习和工具
CameraModels/:
理解不同相机模型的实现。学习如何处理相机的内参和外参。 SerializationUtils.h:
了解数据序列化和反序列化的实现。学习如何存储和读取SLAM数据。 Settings.h:
理解系统设置和参数管理。学习如何配置系统参数。
通过上述路线,你可以系统地掌握ORB-SLAM3的源码,理解其工作原理,并能够根据需要进行修改和扩展。