Skip to content

Latest commit

 

History

History
83 lines (48 loc) · 6.68 KB

04-ORB-SLAM3源码阅读(四)Loop&Merging 线程.md

File metadata and controls

83 lines (48 loc) · 6.68 KB

[TOC]

一、Loop&Merging 线程作用

image-20230814151238678

Local&MapMerging 线程主要作用 :

  • 每当加入一个新的关键帧,将该关键帧在整个 Atlas 地图中检测公共区域。
  • 如果该公共区域属于 Active Map,它就会执行闭环校正;如果该公共区域属于 Non-active Map,就会 把它们融合为一个地图,并把这个融合地图作为新的激活地图。
  • 在闭环校正以后,一个独立线程就会进行全局 BA,进一步优化地图,同时并不影响实时性能。

1、位置识别

  • 数据库查询。首先我们计算关键帧和在共视图中与 其相连的关键帧之间的词袋(BOW)的相似度。通过 离线训练了大量的基于 ORB 描述的词袋 ( 对该关键帧的描述 ),将闭环检测转变为一个类似于模式识别的问题。当相机再次来到之前到过的场景时,就 会因为看到相同的景物,而得到类似的词袋描述, 从而检测到闭环。
  • 计算Sim3。当检测到闭环候选帧的时候,就需要对当前关键帧对应的闭环候选帧之间计算其变换关系, 即 Sim3 求解。通过 Sim3 ( g2o:::sim3 ) 变换解出当前关键帧和闭环候选帧的匹配 MapPoint 之间的旋转矩阵R、平移向量t、尺度变换s,也就能对当前关键帧进行位姿校正(当然也要对关键帧对应的 MapPoints 以 及其共视的关键帧进行校正)。

image-20230814151900367

2、闭环校正

闭环校正的第一步是融合重复的地图点,并且在共视图中揷入新的边以连接闭环

首先当前帧的位姿会根据相似变换而被校正,同时所有与其相 连的关键帧也会被矫正。所有的被闭环处的关键帧观察到的地 图点会通过映射在一个小范围里,然后去搜索它的近邻匹配。 这样就可以对所有匹配的地图点进行更加有效的数据融合,并 更新关键帧位姿,以及在图中的边。

为了有效地完成闭环,使用本质图 (Essential Graph) 去优化位姿图。这样就可以将闭环的误差分散到整个图中。

1690957525842

3、地图合并

当检测到闭环候选帧的时候,就需要对当前关键帧和对应的闭环候选帧之间计算其变换关系,即Sim3 求解。 通过 Sim3 变换解出当前关键帧和闭环候选帧的匹配 MapPoint 之间的旋转矩阵 R、平移向量 $\mathrm{t}$ 、尺度变换 s,也 就能对当前关键帧进行位姿校正 (当然也要对关键帧对应的MapPoints 以及其共视的关键帧进行校正)。

  • Visual Map Merging 视觉地图融合 当场景识别成功后,位于 Active map $M_{a}$ 中的当前关键帧 $K_{a}$ 与位于 Active map $M_{m}$ 中的当前关键帧 $K_{m}$ 产 生了多地图的数据关联,此时会进行地图融合。由于 $M_{a}$ 包含许多元素,融合它们可能需要很长时间。因此融合分为两个步骤:

    1. 在由 $K_{a}$$K_{m}$ 的邻域定义的 Welding window (焊接窗口) 中执行融合;

    2. 通过位姿图优化将校正传播到融合图的其余部分。

    具体过程如下:

    • Step 1: Welding window assembly 构建焊接窗口集合 Welding window 包括当前关键帧 $K_{a}$ 及其共视帧、 $K_{m}$ 以及其共视帧,以及被这些关键帧观测的地图点。在将它们包含在 Welding window 中之前,属于 $M_{a}$ 的关键帧和地图点通过 $T_{m a}$ 进行变换,以使其与 $M_{m}$ 对齐。

    • Step 2: Merging maps 合并地图点

      $M_{a}$$M_{m}$ 融合为一个新的 Active map。为了要删除重复的点, $M_{m}$ 关键帧主动搜索匹配 $M_{a}$ 中的点。对于每个匹配点,都会删除 $M_{a}$ 中的点,并保留 $M_{m}$ 中的点, 同时更新共视图以及本质图。

    • **Step 3: Welding BA ** Welding window 范围内的所有关键帧进行局部 BA 优化。为了确定尺度自由度,观测到 $M_{m}$ 的那些关键帧需要保持固定。优化完成后,Welding window 区域中包含的所有关键帧都可以用于跟踪,实现地图 $M_{m}$ 的准确、快速复用。

    • Step 4: 本质图优化 保持整个Welding window范围内关键帧固定,对整个合并地图的本质图执行位姿优化。

  • Visual-Inertial Map Merging 视觉惯导地图融合
    • Step 1: VI Welding window assembly 构建焊接窗口集合 若 Active map 成熟,与纯视觉类似,对地图 $M_{a}$ 进行 $T_{m a} \in S E(3)$ 变换,与 $M_{m}$ 对齐。若 Active map 末成熟 ,将对地图进行 $T_{m a} \in \operatorname{Sim}(3)$ 变换,与 $M_{m}$ 对齐。
    • Step 2: Merging maps 合并地图点 $M_{a}$$M_{m}$ 融合为一个新的 Active map。为了要删除重复的点, $M_{m}$ 关键帧主动搜索匹配 $M_{a}$ 中的点。对于每个匹配点,都会删除 $M_{a}$ 中的点,并保留 $M_{m}$ 中的点,同时更新共视图以及本质图。
    • Step 3: VI Welding BA 优化的对象包括关键帧 $K_{a}$$K_{m}$ ,及其它们前 5 个连续关键帧的位姿、速度、偏置。 对于 $M_{m}$ ,优化中包括但不固定在紧接局部窗口之前的那一个关键帧位姿;而对于 $Ma$,局部窗口之前的那一个关键帧,但其姿势仍然参与优化。所有这些关键帧看到的所有地圆密以人观测这些地图点的关键帧姿势也都进行优化。所有关键帧和地图点都通过重投影误差项进行关联。

image-20230814154118136

4、闭环校正

闭环校正算法类似于地图融合,但是在这种情况下,当前关键帧以及匹配关键帧都同属于 Active map。 Welding window 是由匹配的关键帧组合而成、重复的 3D 点被融合、更新共视图以及本质图的连接关系。下 一步是姿势图优化,以均分误差。由于闭环增加了中期/长期数据关联,此时进行全局 BA 。仅在关键帧的数量低于阈值时才执行全局 BA,以避免巨大的计算量。

二、

  • CheckNewKeyFrames() 检查队列 mlpLoopKeyFrameQueue 是否有末处理的关键帧。
  • NewDetectCommonRegions() 实现闭环检测。
  • MergeLocal() 非当前地图闭环情况下,纯视觉模式的地图合并与校正。
  • MergeLocal2) 非当前地图闭环情况下,IMU 模式的地图合并与校正。
  • CorrectLoop() 当前地图闭环情况下,闭环校正。