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应用的可执行文件。
- 作用: 这个脚本用于在标准C++环境中编译ORB-SLAM3(不依赖于ROS)。它通过调用CMake和
-
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
,包括管理关键帧、地图点等信息。
- 作用: 定义SLAM系统中地图的核心数据结构
-
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系统。通过这种设计,用户能够根据需要扩展或修改特定模块的功能,同时也可以更方便地理解和使用整个系统。
上述内容仅供个人学习,后期发现错误会进行更新,如果有发现错误的老铁可以评论区留言,非常感谢!
下一期分享核心代码阅读心得