注:本文讲解的是整个系统的运行过程,不涉及具体代码的讲解。均假设系统运行没有重复构建现象
ORB_SLAM2系统代码流程粗讲解(一)
ORB_SLAM2系统代码流程粗讲解(二)
今天这篇文章,讲一下回环检测线程,具体的函数实现在LoopClosing.cc中,找到 Run () 函数。
1.首先需要将mbFinished 置为false,表示当前线程正在运行并未结束;
2.接着进入主循环,while(1) 表示一直处于运行状态;
3.检查闭环检测队列mlpLoopKeyFrameQueue中有没有关键帧,
(1)如果队列中不存在关键帧,就不需要进行回环检测,
(2)当队列中存在关键帧:
- 则进行相似性计算,即计算当前关键帧和上一步闭环候选帧的相似性Sim3变换
- 进行闭环矫正,利用上一步计算出来的相似变换
(3)检查是否有复位请求,复位当前回环检测线程;
(4)查看其他线程是否有终止当前线程的请求,如果有的话就跳出while,否则一直运行;
(5)最后跳出while循环后,如果mbFinished = true,说明需要终止这个线程。
至此整个ORB_SLAM2的三个线程结束
关于线程调度的文章:
ORB_SLAM2线程之间的调度