【ORB-SLAM2代码】(一)线程调度

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


下一篇:ORB-SLAM2代码(二)建图


@leatherwang
二零一八年五月二十九日

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值