ORBSLAM2的關鍵幀簡介
圖像插入頻率過高會導致信息冗余度快速增加,而這些冗余的信息對系統的精度卻十分有限,甚至沒有提高,反而消耗了更多的計算資源。這等於吃力不討好。
關鍵幀的目的在於,適當地降低信息冗余度,減少計算機資源的損耗,保證系統的平穩運行。
ORBSLAM2也是沿襲PTAM的方案,將定位和建圖分成兩個線程,不過ORBSLAM2還增加了回環這個線程,在關鍵幀的問題上做了更靈活的處理,使得系統的跟蹤更流暢和穩定。
接下來我們將按照ORBSLAM2源碼中的方案將內容分成兩個部分進行介紹:
1. 關鍵幀的篩選;
2. 關鍵幀的插入。
關鍵幀的篩選:
由於關鍵幀的篩選主要涉及一些判斷條件,沒有公式沒有插圖,讀起來想必是十分枯燥的。因此筆者主要提煉大綱,讓大家能夠比較直觀的看出,ORBSLAM2中所用的策略是什么,並根據筆者的拙見對原因進行分析,不當之處,敬請指正。
首先是直接不插入關鍵幀的條件,主要有三個:
1. 若當前處於定位模式,不插入關鍵幀;
原因:定位模式是只定位不建圖,只利用已有的地圖點對當前相機姿態進行估計,而不更新地圖點,因此沒有插入關鍵幀的必要。
2. 若局部地圖處於全局閉環情況下,不插入關鍵幀;
原因:局部地圖被占用,插入關鍵幀會影響全局閉環的優化。
3. 若距離上一次重定位較近,不插入關鍵幀;
原因:重定位時,當前幀通過與局部關鍵幀匹配並進行運動估計,能夠很好地恢復其運動姿態。筆者認為,因為重定位時當前幀與重定位候選幀的信息冗余度較低,所以在重定位成功后,當前幀會作為關鍵幀插入地圖中。而新來的一幀,由於重定位時剛剛插入關鍵幀,所以不需要頻繁插入。
排除了上面三種情況,接下來就需要對關鍵幀進一步檢測,才能確定是否真的需要插入關鍵幀。進一步檢查包含一個必不可少的條件和另外三選一的條件。
必須滿足的條件:
1. 內點數必須超過設定的最小閾值,並且重疊度不能太大;
原因:保證關鍵幀跟蹤的質量,同時,避免引入過多的信息冗余。
三選一的條件:
2.1 距離上次插入關鍵幀已經過去MAX幀,MAX是ORBSLAM2預設的最大值;
原因:防止過去太多幀,跟蹤丟失。
2.2 距離上次插入關鍵幀至少過去MIN幀,且局部建圖線程處於空閑狀態,MIN是ORBSLAM2預設的最小值;
原因:防止圖像重疊度太高,並且局部建圖線程有空閑處理新的關鍵幀。
2.3 局部建圖線程中關鍵幀隊列的關鍵幀數量不超過3個;
原因:主要也是考慮局部建圖線程的處理能力,以及信息的冗余度問題吧。
插入關鍵幀的條件即是必須滿足條件1以及滿足2.1-2.3中任意一個條件。
關鍵幀的插入
確定了當前幀是關鍵幀,那么就需要將其輸入局部建圖模塊以及回環檢測模塊。但是在輸入這兩個模塊之前,需要將關鍵幀的觀測信息進行更新。為了更加直觀的表達關鍵幀插入的方法,筆者還是以列提綱的方式,為大家介紹這個過程:
1. 中斷局部建圖線程,即中斷處理地圖點、關鍵幀以及優化相機位姿;
原因:這是必須插入關鍵幀的情況,強制終止局部建圖。
2. 更新當前關鍵幀的位姿,即從 $T$ 矩陣中取出旋轉矩陣 $R$ 和位移矩陣 $t$ 以及相機中心 $O$;
原因:主要用於局部建圖模塊和回環檢測模塊中做重投影。
3. 將當前幀所對應的地圖點按深度信息進行排序;
原因:篩除超出深度閾值的地圖點。
4. 對當前關鍵幀中未關聯的三維點,創建新的地圖點,具體包括觀測信息,更新地圖點的描述子以及法向量和深度;
原因:非常平凡的創建地圖點的過程。
5. 將所創建的地圖點插入地圖中,最后將更新后的關鍵幀也插入地圖中。
原因:插入關鍵幀的過程最后一個步驟。
插入關鍵幀的流程大體如上面五個步驟所述。大家在設計關鍵幀插入流程時可以參考這幾種方案,當然也可以根據實際需要設計更符合要求的方案。
總結:
終於又到了寫總結的時候了,寫一篇博客着實不易啊。
本文主要介紹了ORBSLAM2對待關鍵幀的策略,包括關鍵幀的篩選和插入。
不同的SLAM系統所采用的的關鍵幀策略有所不同,但是目的都是類似的:一是考慮計算資源的損耗,二是考慮信息的冗余度,最重要的是系統精度提高的可能性。在精度滿足要求的前提下,尋求信息冗余度和計算資源損耗的折中。
至此,ORBSLAM2的跟蹤線程我們已經全部介紹完了,接下來我們將進入局部建圖線程。
下一講,筆者將為大家介紹ORBSLAM地圖的更新策略。
PS:
如果您覺得我的博客對您有所幫助,歡迎關注我的博客。此外,歡迎轉載我的文章,但請注明出處鏈接。
對本文有任何問題可以在留言區進行評論,也可以在泡泡機器人論壇:http://paopaorobot.org/bbs/index.php?c=cate&fid=1中的SLAM技術交流模塊發帖提問。
我的github鏈接是:https://github.com/yepeichu123/orbslam2_learn。