ORB-SLAM3代码详解(一)----代码整体框架

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 包括以下几个主要模块:

  1. Tracking(跟踪)

    • 从帧中提取ORB特征。
    • IMU数据集成。
    • 通过从最后一帧、重定位或地图创建的初始位姿估计进行跟踪。
    • 跟踪局部地图。
    • 新关键帧决策。
  2. Atlas(地图集)

    • 包含“活动地图”和“非活动地图”。
    • 活动地图中有地图点(MapPoints)、关键帧(KeyFrames)、共视图(Covisibility Graph)和生成树(Spanning Tree)。
    • 非活动地图中也包含地图点、关键帧、共视图和生成树。
  3. DBoW2 KeyFrame Database(DBoW2关键帧数据库)

    • 包含视觉词典(Visual Vocabulary)和识别数据库(Recognition Database)。
  4. Local Mapping(局部建图)

    • 关键帧插入。
    • 最近地图点裁剪。
    • 新地图点创建。
    • 局部BA(Bundle Adjustment)。
    • IMU初始化。
    • 局部关键帧裁剪。
    • IMU尺度细化。
  5. Loop & Map Merging(回环与地图合并)

    • 回环检测、图优化、回环融合、地图合并。
    • 计算Sim3/SE3。
    • 数据库查询。
  6. 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.ccAtlas.h对应,ORBextractor.ccORBextractor.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系统。通过这种设计,用户能够根据需要扩展或修改特定模块的功能,同时也可以更方便地理解和使用整个系统。
上述内容仅供个人学习,后期发现错误会进行更新,如果有发现错误的老铁可以评论区留言,非常感谢!
下一期分享核心代码阅读心得

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值