參考: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
<完>
@leatherwang