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


<完>
@leatherwang


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章