ORB-SLAM2(Oriented FAST and Rotated BRIEF-SLAM Second version)是一种基于特征识别的实时单目SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)系统,适用于室内和室外环境,大场景或小场景。以下是对ORB-SLAM2的详细解析:

一、基本原理

ORB-SLAM2使用Oriented FAST进行特征点检测,并使用Rotated BRIEF对特征点进行描述。它解决了FAST算法不具有旋转不变性的问题,并通过构建图像金字塔解决了尺度不变性的问题。

二、系统框架

ORB-SLAM2的框架可以概括为5个模块和3个线程:

  • 5个模块:输入模块、跟踪模块、局部建图模块、闭环检测模块、全局BA(Bundle Adjustment)优化模块。
  • 3个线程:跟踪线程(主线程)、局部建图线程、闭环检测线程。

三、详细流程

  1. 输入模块

    • ORB-SLAM2的输入模块是相机,可以是单目相机、双目相机或RGB-D相机。
    • RGB-D相机在实际代码中会被转化为双目相机来处理。
  2. 跟踪线程

    • 传入的图像首先会经过预处理,如RGB图像转化为灰度图像等。
    • 提取图像中的ORB特征点和计算描述子。
    • 地图初始化成功后,跟踪分为两个阶段:参考关键帧跟踪、恒速模型跟踪、重定位跟踪,以及局部地图跟踪。
      • 参考关键帧跟踪:利用最近一次建立的关键帧(参考关键帧)来跟踪当前帧。
      • 恒速模型跟踪:对输入的所有普通帧进行跟踪,是ORB-SLAM2系统中使用最多的跟踪方式。
      • 重定位跟踪:当跟踪失败时,会使用重定位跟踪,通过筛选得到候选关键帧,利用词袋来加速匹配当前帧与候选帧,进而求解出当前的位姿。
    • 根据一些设定条件判断是否将当前帧创建为关键帧。
  3. 局部建图线程

    • 当新的关键帧插入到局部地图中时,会对局部地图中的关键帧以及关键帧之间的连接关系进行更新。
    • 对当前局部地图中关键帧的位姿和地图点进行BA优化。
    • 删除冗余的关键帧及其对应的地图点。
    • 局部建图线程主要维护一个由共视图(Covisibility Graph)、本质图(Essential Graph)和生成树(Spanning Tree)组成的局部地图。
  4. 闭环检测线程

    • 主函数是一个无限循环,不断检测是否出现新关键帧,并检测缓冲队列中的新关键帧是否出现闭环。
    • 如果形成闭环,则计算闭环关键帧与闭环关键帧参考的对应场景之间的匹配关系,并进行相似变换。
    • 闭环线程主要包括闭环检测、闭环矫正和全局BA优化模块。
      • 闭环检测:检测机器人是否到达起始位置(或去过的位置),获取闭环候选关键帧。
      • 闭环矫正:用检测到的闭环关系对所有关键帧位姿和地图点进行矫正,将闭环误差分摊到每一帧及其相邻帧上。
      • 全局BA优化:在闭环检测成功后进行全局BA优化,利用图优化(如g2o)优化所有的关键帧和地图点。

四、算法优点

  • 适用于室内和室外环境。
  • 可以处理明显的并且数量合理的回环检测。
  • 支持单目、双目和RGB-D相机。

五、应用场景

ORB-SLAM2的算法应用场景广泛,包括但不限于机器人导航、增强现实(AR)、虚拟现实(VR)以及自动驾驶等领域。通过实时地构建环境地图并估计相机的位姿,ORB-SLAM2能够为这些应用提供可靠的空间定位信息。

综上所述,ORB-SLAM2是一种功能强大且广泛应用的SLAM系统,它通过高效的特征点提取和描述、多线程的并发处理以及精确的闭环检测等关键技术,实现了在复杂环境中的实时定位和地图构建。

ORB-SLAM2是一种先进的视觉SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)算法,其代码实现复杂且精细。以下是对ORB-SLAM2代码的详细解析:

六、代码结构与框架

ORB-SLAM2的代码框架可以概括为五个模块和三个线程:

  1. 五个模块

    • 输入模块:负责接收相机输入的图像数据。ORB-SLAM2支持单目相机、双目相机和RGB-D相机三种输入方式。
    • 跟踪模块(线程):负责处理输入的图像序列,提取ORB特征,跟踪相机的运动,并估计当前帧的位姿。
    • 局部建图模块(线程):当新的关键帧插入到局部地图中时,会对局部地图中的关键帧以及关键帧之间的连接关系进行更新,同时对当前局部地图中关键帧的位姿和地图点进行BA(Bundle Adjustment)优化,最后对冗余的关键帧及其对应的地图点进行删除。
    • 闭环检测模块(线程):负责检测相机是否回到了之前访问过的位置(即闭环),如果检测到闭环,会计算闭环关键帧与闭环关键帧参考的对应场景之间的匹配关系,并进行相似变换和全局BA优化。
    • 全局BA优化模块:在闭环检测成功后进行全局BA优化,利用图优化(如g2o)优化所有的关键帧和地图点。
  2. 三个线程

    • Tracking线程(主线程):负责跟踪相机的运动,估计当前帧的位姿,并决定是否创建新的关键帧。
    • LocalMapping线程:负责处理新的关键帧,生成新的地图点,进行局部地图优化等。
    • LoopClosing线程:负责检测闭环,进行地图融合和优化等。

七、核心算法与实现细节

  1. ORB特征提取

    ORB特征是一种快速且具有旋转不变性的特征提取算法。ORB-SLAM2使用OpenCV库提供的ORB特征提取器进行特征提取,包括在图像中检测FAST角点,并计算BRIEF描述子。

  2. 跟踪线程实现

    • 跟踪线程首先会尝试使用匀速运动模型、参考关键帧或重定位来预测或估计当前帧的位姿。
    • 然后,通过特征匹配来寻找当前帧与地图中已有特征点的对应关系。
    • 如果匹配成功,会使用匹配点对当前帧的位姿进行优化。
    • 如果跟踪失败,会尝试进行重定位或跟踪局部地图。重定位是通过词袋模型加速匹配当前帧与候选帧,进而求解出当前的位姿。
  3. 关键帧选择与插入

    • ORB-SLAM2采用了一种策略来选择和插入关键帧。
    • 当当前帧与上一关键帧之间的差异足够大(如特征点数量、位姿变化等),或者跟踪失败时,会考虑将当前帧选为关键帧。
    • 关键帧会被插入到关键帧数据库中,供后续建图线程和闭环检测线程使用。
  4. 局部地图构建与优化

    • 建图线程会从关键帧数据库中获取新的关键帧,并对其进行处理。
    • 首先会验证新关键帧的有效性,并删除一些异常的地图点。
    • 然后,通过三角化等方法生成新的地图点,并将其加入到地图中。
    • 最后,会对局部的关键帧和地图点进行BA优化,以提高地图的精度和一致性。
  5. 闭环检测与地图优化

    • 闭环检测线程会检测相机是否回到了之前曾经访问过的区域。
    • 如果检测到闭环,会计算当前关键帧与闭环候选帧之间的相似变换。
    • 然后,会对地图进行融合和优化,以消除累积误差,提高地图的全局一致性。
    • 优化过程包括调整关键帧的位姿、更新地图点的坐标等。

八、代码细节与优化

  1. 变量命名规则

    ORB-SLAM2中的变量命名遵循匈牙利命名法。例如,以“m”开头的变量表示类的成员变量;以“mp”开头的变量表示指针型的类的成员变量;以“mb”开头的变量表示布尔型的类的成员变量;以“mv”开头的变量表示向量型的类的成员变量等。

  2. 多线程与并行计算

    ORB-SLAM2充分利用了现代计算机的多核处理能力,通过多线程来实现并行计算。例如,在特征提取和匹配过程中,可以使用多个线程来同时处理不同的图像区域或特征点,以提高计算效率。

  3. 内存管理与优化

    ORB-SLAM2在内存管理方面进行了优化,以减少内存占用和提高运行效率。例如,通过使用哈希表等数据结构来快速查找和匹配特征点;通过删除冗余的关键帧和地图点来保持地图的紧凑性;通过合理的内存分配和释放策略来避免内存泄漏等问题。

  4. 错误处理与鲁棒性

    ORB-SLAM2在代码实现中考虑了各种可能的错误情况,并进行了相应的处理。例如,在跟踪过程中,如果当前帧与参考关键帧之间的匹配点对数量较少或匹配质量较差,会尝试进行重定位或跟踪局部地图等策略来提高鲁棒性。此外,还采用了RANSAC算法来剔除图像中的外点,以减少噪声对计算结果的影响。

九、总结

ORB-SLAM2的代码实现是一个复杂而精细的过程,涉及多个模块和线程之间的协同工作。通过详细解析其代码结构和核心算法,我们可以更好地理解其工作原理和实现细节。ORB-SLAM2在实时性、旋转和尺度不变性、闭环检测与地图优化等方面具有显著优势,为机器人导航、增强现实等领域提供了有力的技术支持。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐