ORB-SLAM2代码总结(一)线程调度

参考:orb-slam2源码

orb-slam三个线程(tracking、local mapping、loop close)之间的线程调度,通过标志位实现的,下面将介绍这些标志位.

文章目录

        • 1、local mapping线程停止(进入睡眠状态)
        • 2、`mbStopRequested`
        • 3、`mbStopped`
        • 4、`mbNotStop`
        • 5、`mbAcceptKeyFrames`
        • 6、`mbAbortBA`


ORB-SLAM2代码总结(一)线程调度_第1张图片


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


<完>
@leatherwang


你可能感兴趣的:(slam)