orb-slam2(一)线程调度

local mapping线程停止(进入睡眠状态)
需要满足以下两个条件时:

  • loop closing请求停止local mapping
  • tracking已经完成关键帧的插入

标志位:mbStopRequested
用于local mapping与loop closing线程之间的调度
LoopClosing线程,CorrectLoop()函数体执行前先调用RequestStop()->请求局部地图停止->接着调用isStopped()函数查看local mapping线程是否停止
作用:

  • 防止局部地图线程中KeyFrameCulling()函数删除关键帧
  • 以及防止在tracking线程中,新的关键帧被插入

local mapping在执行Local BA之前调用stopRequested(),查看<闭环检测>有没有请求停止LocalMapping


标志位:mbStopped
true->local mapping线程停止(已经睡眠)


标志位:mbNotStop
正在插入关键帧标志,用于local mapping与tracking线程之间的调度,tracking中的CreateNewKeyFrame()函数执行前先调用SetNotStop()函数,这个函数有两个作用:

  • 查询插入关键帧的条件是否满足,
  • 设置mbNotStop状态

false:tracking插入关键帧已经完成
true:正在插入关键帧


tracking线程中NeedNewKeyFrame()函数
执行条件:

  • Loop Closure已经发出了冻结local Mapping的请求
  • local Mapping已经被Loop Closure冻结

标志位:mbAcceptKeyFrames
tracking看到local mapping是否在处理关键帧的标志,通过SetAcceptKeyFrames()函数设置该标志位,
当local mapping开始处理关键帧时,复位标志位,false:tracking看到local mapping是繁忙的
处理完成时,置位标志,进入3ms的睡眠时间,允许tracking插入,true:空闲


标志位: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()置位的标志位有, mbStopRequestedmbAbortBA

猜你喜欢

转载自blog.csdn.net/hzwwpgmwy/article/details/80493247
今日推荐