参考:orb-slam2源码
orb-slam三个线程(tracking、local mapping、loop close)之间的线程调度,通过标志位实现的,下面将介绍这些标志位.
文章目录
1、local mapping线程停止(进入睡眠状态)
需要满足以下两个条件时:
- loop closing请求停止local mapping(
mbStopRequested=ture, mbAbortBA=true
) - tracking已经完成关键帧的插入(
mbNotStop=false
)
2、mbStopRequested
用于local mapping与loop closing线程之间的调度
LoopClosing线程,CorrectLoop()
函数体执行前先调用RequestStop()
->请求局部地图停止->接着调用isStopped()
函数查看local mapping线程是否停止
作用:
- 防止local mapping线程中
KeyFrameCulling()
函数删除关键帧 - 以及防止在tracking线程中,新的关键帧被插入
local mapping在执行Local BA之前调用stopRequested()
,查看<闭环检测>有没有请求停止LocalMapping
3、mbStopped
true
->local mapping线程停止(已经睡眠)
4、mbNotStop
正在插入关键帧标志,用于local mapping与tracking线程之间的调度,tracking中的CreateNewKeyFrame()
函数执行前先调用SetNotStop()
函数,这个函数有两个作用:
- 查询插入关键帧的条件是否满足?(
mbStopped
) - 设置mbNotStop状态
false
->tracking插入关键帧已经完成
true
->正在插入关键帧(插入前调用SetNotStop()
函数设置true
,插入完成设置false
)
tracking线程中NeedNewKeyFrame()
函数
执行条件:
- Loop Closure是否已经发出了冻结local Mapping的请求?(
mbStopRequested=true
) - local Mapping是否已经被Loop Closure冻结?(
mbStopped=true
)
5、mbAcceptKeyFrames
tracking看到local mapping是否在处理关键帧的标志,通过SetAcceptKeyFrames()
函数设置该标志位,
- 当local mapping开始处理关键帧时,复位标志位,
false
->tracking看到local mapping是繁忙的 - 处理完成时,置位标志,进入
3ms
的睡眠时间,允许tracking插入,true
->空闲
6、mbAbortBA
是否中途终止BA优化的标志位,local mapping中的LocalBundleAdjustment()
函数,在优化过程中需要查询的标志位
- tracking线程中调用了
InsertKeyFrame()
,BA优化时,就不要插入新的关键帧,说明插入关键帧优先 - tracking线程中调用了
InterruptBA()
,插入关键帧时发现BA优化还在进行,直接流产本次优化,说明插入关键帧优先 - LoopClosing线程,
CorrectLoop()
函数中调用了RequestStop()
注意:
1) 当local mapping空闲的,返回需要插入关键帧,否则->local mapping繁忙->调用InterruptBA->如果是双目->并且队列中的关键数目少于3时->返回插入关键帧
2) 当local mapping线程停止(进入睡眠状态)时,tracking往local mapping线程插入关键帧将会失败
3) RequestStop()置位的标志位有, mbStopRequested
和mbAbortBA
下一篇:ORB-SLAM2代码(二)建图