[TOC]
地图构建线程负责处理新的关键帧并执行 BA,以实现传感器周围地图的最佳重建。先加入关键帧和地图点到当前激活地图,删除其余帧,并通过对当前帧的附近关键帧操作,利用视觉 BA 或视觉-惯性 BA 优化地图。此外,在惯性模式下,LocalMapping 线程会利用最大后验估计(MAP)来初始化和优化 IMU 参数。
将 Tracking 线程输出的关键帧揷入共视图(Covisibility Graph),首先更新共视图,其中节点是关键帧,边的权重为两个关键帧共视的地图点数量。共视图中过多的边会占用计算资源,影响 SLAM 算法的实时性。一般通过设定阈值控制边的数量。然后更新与跟关键帧中有大多数共同的相连接在一起的生成树,最后计算关键帧的词袋向量。
并不是所有地图点都是有效的,在地图点背创建后的前 3 个关键帧的时间内,该点要经过严格检验以保证它能被跟踪。一个地图点必须满足以下2个条件:
- 跟踪到该地图点的帧数与预计可观测到该地图点云的帧数的比值应该大于
$25 %$ ; - 从该地图点云创建起,到现在已经过了不小于 2 个关键帧,但观测到该地图点的关键帧不超过
${N}$ 个。 若相机类型是单目,$N$ 取 2,否则$N$ 取3。
新地图点生成部分负责从共视图中已连接的关键帧进行三角化计算 ORB 特征点来创建新地图点。对于关键帧中每个未匹配的 ORB 特征点,在另一个关键帧中搜索与其他不匹配点进行匹配,丢弃不满足对极约束的匹配。 最后对 ORB 特征点匹配对进行三角化计算生成新地图点。
三角化是指,通过在两处观察同一个点的夹角,确定该点的距离,即深度信息。由于噪声的影响,这两条直线往往无法 相交。因此,通过最小二乘求解。
优化当前关键帧、在共视图中所有连接到当前关键帧的关键帧以及被关键帧观测到的所有地图点。 所有其他观测到地图点但未连接到当前关键帧的关键帧均包含在优化中,同时保持固定不变。 在优化中间和结束时,将标记为异常值的观测值丢弃。
当 2D 的特征点反投影到 3D 空间点,和真正的 3D 点的位置存在重投影误差。BA 的作用就是,通过最小二乘法最小化该重投影误差。假设 3D 地图点的实际位置为
地图点
IMU 初始化的目的在于获得较好的 IMU 的初始值:速度、重力方向和偏置。
-
Vision-Only MAP Estimation:采用 ORB-SLAM1 (单目)的初始化流程,按照关键帧速率 4 Hz 运行 2s 揷入关键帧 ,然后按比例缩放的地图,包括10个关键帧以及上百个地图点,然后通过 Visual-Only BA 进行优化。
-
Inertial-Only MAP Estimation:为了获得 IMU 参数的最优估计。利用前述单目视觉SLAM初始化后稳定运行的数 据,以及这些关键帧之间的IMU测量,包括:尺度因子、重力方向、IMU 偏置、 关键帧的无尺度速度。这些IMU测量放在一起构成状态向量,构建优化问题求解 。一旦惯性优化完成,帧的姿态、速度以及 3D 地图点就会以估计的尺度进行缩放 ,同时旋转以使 z 轴与估计的重力方向对齐。
-
Visual-Inertial MAP Estimation:一旦视觉以及 IMU 有了较好的估计后,进行一个联合优化进一步对这些参数进行精化。结合惯性残差和视觉残差,视觉-惯性 SLAM 可以看作是基于关键帧的最小化问题。在后期中,基于下式进行计算优化: $$ \min {\overline{\mathcal{S}}{k}, \mathcal{X}}\left(\sum_{i=1}^{k}\left|\mathbf{r}{\mathcal{I}{i-1, i}}\right|{\Sigma{\mathcal{I}{i, i+1}}^{-1}}^{2}+\sum{j=0}^{l-1} \sum_{i \in \mathcal{K}^{j}} \rho_{\mathrm{Hub}}\left(\left|\mathbf{r}{i j}\right|{\Sigma_{i j}^{-1}}\right)\right) $$ ORB-SLAM3采用了滑动窗口思想,把关键帧及其地图点的滑动窗口作为优化变量,IMU 误差作为基于关键帧重投影误差的约束。
随着关键帧数量的增加,BA 的复杂度也会随之提高。为了保证 SLAM 算法的效率,LocalMapping 线程也会检测和删除冗余的关键帧以维持重构过程的紧凑。剔除关键帧的好处是保证关键帧的数量不会无限制的增加,控制BA的复杂度。冗余关键帧必须满足以下条件:
- 若某个关键帧的
$90 %$ 以上的地图点能被其它关键帧(至少3个)在同一尺度或更好尺度上观测到,则该关键 帧为只余关键帧。
通过 BA 优化尺度和重力方向。