说明
这是一个可以接受的大致逻辑,虽说还是不够简明但大致的说明还是应该的
流程
回环检测线程在SLAM系统的构造函数中初始化并运行,线程的主入口函数以RUN为起点。RUN函数里面包含了一个无限循环的while函数,它保证了该线程处于一直待命的状态,只有收到停止命令时它才会退出while循环。每循环一次呢它要进行适当的休息避免CPU资源的过度占用。现在进入正式的回环检测线程的流程了!首先它会检验由局部建图线程传来的关键帧队列中是否有关键帧,当有关键帧时,就往下进行了,首先它遍历这些关键帧,只有间隔超过10帧及以上的关键帧才有资格成为闭环候选关键帧,计算这些满足间隔的关键帧和它们的共视关键帧组成的每个组的得分,得出一个最低的分数,用于后续条件的判断。我们遍历这些满足一定间隔的关键帧。以遍历中的一个关键帧为例,我们找到这个关键帧的具有共同单词的所有的关键帧,但是要去除掉与该关键帧共视相连的关键帧,剩下的关键帧们单词数要满足一定要求才能保留下来。遍历剩下的这些关键帧们,以一个关键帧为例,找到它的共视关键帧们组成一个组,计算这个组的得分,比较所有的组和之前传入的那个最低得分,满足最低分的那些组中的关键帧才能作为待定的闭环候选关键帧。接下来就要计算闭环的连续性,(如果是初次构建连续组链要求就是把要进行闭环检测的关键帧和它的共视帧们组成的组这里我们称为子候选组,初次构建无法取得与上次构建的连续性信息故在第一次构建时,这个子候选组相当于连续组其连续长度计数为0储存在首次的连续组链中用于后续的判断) 。之后我们判断当前要判断闭环的关键帧和它的共视关键帧组成的子候选组和上一次生成的连续组链的连续性,我们遍历上一次生成的那个连续组链中的每一个连续组(包括没有满足条件冒充为连续组连续长度为0的子候选组)中的每一帧和当前的子候选组帧的帧是否存在相同的,存在就在上一个连续组链的那个连续组长度的基础上+1放入此次的连续组链最后用这个连续组链来更新上一次的连续组链,同时我们把连续长度超过3的那个连续组中的关键帧作为满足连续性的闭环候选关键帧。在满足了连续性的闭环候选关键帧组中利用词袋快速匹配出与当前要进行闭环检测的关键帧之间的匹配点数大于一定要求的关键帧,为它们构造一个sim求解器,遍历满足要求的这些满足连续性的候选关键帧们,就算它们的sim,实际上就是利用最小二乘求解尺度因子s、旋转R、平移t,将这个sim作为初始值,在当前要进行闭环的关键帧和计算出这个sim的关键帧之间通过sim进行正反向的投影匹配得到更多的匹配关系,再用这些匹配关系来对计算出来的sim进行BA(实际上就是利用g2o通过添加顶点、边等来增加约束从而达到一个比较精确的解。)如果求出来的这个sim它匹配出来的内点超过20个,就算是得到了一个比较满意的sim了,就不用继续进行计算sim了,可以退出计算循环了。获取满足要求的已经计算出sim的满足连续性的这个闭环候选关键帧及它的共视关键帧们所观察到的所有地图点,我们通过地图点投影到当前要进行闭环检测的关键帧上来匹配特征点得到更多的匹配关系,如果此时匹配的内点超过了40个,那么恭喜你,终于检测到回环了。下面该进行闭环矫正了,矫正之前确保局部建图线程和BA是停止的,我们先要更新一下共视连接关系(计算sim时发生了改变),利用sim来传播和矫正与当前帧所连接的共视关键帧们的位姿以及地图点,检查当前帧的地图点与闭环匹配关键帧的地图点是否有冲突,对冲突的地图点进行替换填补,之后在对闭环匹配关键帧所相连的那些共视关键帧们的地图点投影到当前帧的组中进行匹配、融合,新增或替换。更新当前关键帧的两级共视关键帧的连接关系,得到前面经过地图点融合而新建立的共视连接关系(在更新的基础上去除之前的连接剩下的就是新建立的关系)。进行本质图优化,优化本质图中所有关键帧的位姿。新建一个线程用于全局BA 优化。矫正完后就要进行全局的BA了,调用全局BA函数优化所有的关键帧位姿和地图点,利用最小生成树的方式通过递归的父子关系来更新关键帧位姿,逐步的进行优化,遍历每个地图点,用更新的关键帧位姿来更新地图点,如果地图点参与了BA,直接设置位姿,没参与就用参考关键帧来更新,都不行就放弃了。
结束语
这就是我学习总结出来的流程,可能会有不足之处,还请谅解,大家作适当的参考即可。