ORB-SLAM学习(3)—— LoopClosing线程

毋庸置疑的是,随着相机的运动,我们计算的相机位姿,三角化得到的点云位置,都是有误差的,即使我们使用局部的或全局的BA去优化,仍然会存在累积误差。而消除误差最有效的办法是发现闭环,并根据闭环对所有结果进行优化。闭环是一个比BA更加强烈、更加准确的约束,所有如果能够检测到闭环,并对其优化,就可以让结果更加准确。

代码框架

整个LoopClosing模块是在线程中完成,并在创建线程时调用LoopClosing::Run()函数让其运行。整个框架如下图所示:

ORB-SLAM学习(3)—— LoopClosing线程_第1张图片

闭环条件检测

首先我们计算关键帧Ki和在Covisibility Graph中与其相连的关键帧之间的词袋(BOW)之间的相似度。作者离线训练了大量的基于ORB描述的词袋,在程序运行时加载进去。这里的词袋作为对该关键帧的描述,将闭环检测转变为一个类似于模式识别的问题。当相机再次来到之前到过的场景时,就会因为看到相同的景物,而得到类似的词袋描述,从而检测到闭环。

在这里插入图片描述

计算Sim3

当检测到闭环候选帧的时候,就需要对当前关键帧和对应的闭环候选帧之间计算其变换关系。这时需要用当前关键帧和其对应的闭环候选帧进行sim3求解,这里的sim3求解是对当前关键帧和闭环候选帧之间匹配的MapPoint进行sim3求解。通过sim3变换解出当前关键帧和闭环候选帧的匹配MapPoint之间的旋转矩阵R、平移向量t、尺度变换s,也就能对当前关键帧进行位姿校正(当然也要对关键帧对应的MapPoints以及其共视的关键帧进行校正)。当然在实际代码中,这个过程还要做多次投影和优化操作以确保更高的准确率和精度。

在这里插入图片描述

闭环融合与Essential Graph优化

闭环矫正的第一步是融合重复的点云,并且在Covisibility Graph中插入新的边以连接闭环。首先当前帧的位姿会根据相似变换而被矫正,同时所有与其相连的关键帧也会被矫正。所有的被闭环处的关键帧观察到的地图点会通过映射在一个小范围里,然后去搜索它的近邻匹配。这样就可以对所有匹配的点云进行更加有效的数据融合,并更新关键帧位姿,以及在图中的边。
为了有效地完成闭环,本文使用本质图(Essential Graph)去优化位姿图。这样就可以将闭环的误差分散到整个图中。

在这里插入图片描述

参考博文
https://blog.csdn.net/chishuideyu/article/details/76165461
https://blog.csdn.net/qq_30356613/article/details/80588038
https://blog.csdn.net/u010128736/article/details/53409199

你可能感兴趣的:(orb-slam)