版權聲明:本文為博主原創文章,未經博主允許不得轉載。
ORB-SLAM[1]完全繼承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣缽,並做出了兩點巨大改進:1)實時回環檢測;2)很魯棒的重定位。為了實現這兩點改進,ORB-SLAM把PTAM的mapping線程基於局部BA和全局BA拆分成了local mapping和loop closing兩個線程,用ORB描述子替換了patch匹配,並且設計了非常優秀的地圖管理策略。
在tracking線程,ORB-SLAM和PTAM一樣,也是先構造金字塔(默認8層)再提取特征點(一個常規技巧是把圖像划分成網格,不同區域可以有不同的FAST閾值,這樣盡量使得提取的特征點分散在圖片各個區域)。不同的是,ORB-SLAM在FAST特征點的基礎上又提取了ORB描述子,這種描述子在不同觀測視角和不同光照條件下有魯棒的不變性,並且計算速度比SIFT、SURF要快很多。描述子的用途是配合DBoW[2]做特征點匹配和回環檢測。具體的說,每個描述子會對應詞典里一個單詞,詞典中的單詞以樹狀結構存儲,每個單詞對應一個葉節點。這個樹狀結構有兩種檢索方式,一種是從圖片查單詞(每張圖片有哪些單詞,以及單詞對應的圖片上特征點的具體編號),另一種是從單詞查圖片(每個單詞在哪些圖片被觀測到,以及這個單詞在這張圖片的權重)。當前幀位置姿態的估計方法和PTAM也幾乎一模一樣,也是把前一幀對應的地圖點投影到當前幀(根據勻速運動模型估計了一個初始位置姿態),然后找匹配(ORB匹配,而不是PTAM的patch匹配),找到足夠匹配后再優化求解。Track Local Map是把附近更多的地圖點投影到當前幀(上一步只涉及前一幀對應的地圖點)。這也是近似PTAM從粗到細兩輪求解的過程,粗測的優化結果作為精測的初值。在判斷當前幀是否是關鍵幀方面,ORB-SLAM是相對寬松的(在滿足PTAM類似的幾個小條件的基礎上,當前幀的匹配點數量少於關鍵幀的90%就要考慮插入新關鍵幀;在2016年的ORB-SLAM2[3]中,根據40倍baseline的距離把地圖點分為近點和遠點,近點對估計尺度、平移、旋轉都有貢獻,遠點只對估計旋轉有貢獻。當近點數量少於一個閾值,也要插入新的關鍵幀),因為關鍵幀越密集,越不容易跟蹤失敗。這么做帶來的問題是有冗余的關鍵幀,所以在local mapping線程,會再刪去多余的關鍵幀控制BA的復雜度。
在local mapping線程,插入新關鍵幀后首先要做的是更新covisibility graph和spanning tree。Covisibility graph是用來描述不同關鍵幀可以看到多少相同的地圖點:每個關鍵幀是一個節點,如果兩個關鍵幀之間的共視地圖點數量大於15,則這兩個節點之間建立邊,邊的權重是共視地圖點的數量。Spanning tree是covisibility graph的子集,保留了所有的節點(或者說關鍵幀),但每個節點只保留和最多共視地圖點關鍵幀之間的邊。之后計算新關鍵幀的詞袋(bags of words)描述,也就是建立上一段中“從圖片查單詞”和“從單詞插圖片”的檢索,這一方面是為了匹配特征點三角化出新的地圖點,另一方面是為了回環檢測。Recent MapPoints Culling是檢驗前三個關鍵幀新生成的地圖點(新生成的地圖點要接受連續三個新關鍵幀的檢驗),如果這些地圖點沒有通過檢驗(只能被少數圖片觀測到)則刪去。通過檢驗的地圖點如果被少於三個關鍵幀觀測到也會被刪去,這通常發生在刪除冗余關鍵幀和局部BA的情況下,這能保證地圖點精准且不冗余。New Points Creation是為新關鍵幀上沒有匹配上地圖點的特征點找匹配,如果能從其他關鍵幀(根據covisibility graph檢索共視地圖點最多的十個關鍵幀)找到匹配,且滿足一系列約束,則三角化出新的地圖點。Local BA的做法和PTAM是一樣的,也是把周圍的地圖點投影到周圍的關鍵幀,讓重投影誤差最小。這和tracking線程Track Local Map的區別是,這里調整關鍵幀(位置姿態)和地圖點(位置),tracking線程是調整當前幀的位置姿態。Local KeyFrames Culling階段,如果某個關鍵幀觀測到的90%的地圖點都能被其他至少三個關鍵幀觀測到,則被認為是冗余的,會被刪去。
在loop Closing線程,會把新關鍵幀的詞袋描述和其他關鍵幀做比較,如果兩個向量足夠相似,就說明出現了回環。怎么才算足夠相似呢?ORB-SLAM把新關鍵幀和周圍關鍵幀(covisibility graph里共視地圖點大於30個)的最小相似度作為動態閾值,其他關鍵幀的相似度只有大於這個閾值才有可能是回環關鍵幀(為了提高魯棒性,covisibility graph里的連續三個關鍵幀都必須滿足這個條件才可以)。由於新關鍵幀和回環關鍵幀之間可以進行ORB匹配,所以他們各自的地圖點之間也建立了匹配關系,於是可以優化出兩個關鍵幀之間的變換(2015年的ORB-SLAM只針對單目,會有尺度漂移的問題,所以計算的是相似變換;在2016年的ORB-SLAM2中,如果使用了雙目或者RGBD相機,尺度不再是未知數,於是可以直接計算剛體變換)。Loop Fusion階段,第一步是融合重復的地圖點,並且在covisibility graph里補上回環的那條邊。然后根據之前計算出的新關鍵幀和回環關鍵幀的變換,調整新關鍵幀及周圍關鍵幀的位置姿態,這樣回環的兩頭就基本對齊了。然后再把回環關鍵幀附近的地圖點投影到新關鍵幀,把匹配上的地圖點融合起來。之后再根據essential graph優化所有關鍵幀的位置姿態(essential graph是簡版的covisibility graph,保留了所有的節點,共視地圖點數量大於100才會建立邊),把回環誤差均攤到所有關鍵幀上。2015年的ORB-SLAM認為經過essential graph優化之后,精度已經足夠高了,在執行全局BA(同時優化所有的關鍵幀和地圖點)意義不大,但是ORB-SLAM2還是加上了全局BA(由於全局BA計算復雜度太高,為了不影響后續的回環檢測,又開了個新的線程專門執行全局BA)。跟蹤失敗后會進入重定位模式,具體重定位的方法和回環檢測類似。
ORB-SLAM有兩個問題:1)計算復雜度比較高,直接原因是每一幀都提取了描述子。2)實際測試中,ORB-SLAM的抖動(jitter)要比SVO大,個人感覺是因為ORB-SLAM的地圖點是簡單三角化出來的,額外的約束也只是為了剔除外點而沒有進一步的考慮地圖點的不確定性,而SVO的深度濾波器從概率分布的角度充分利用了多幀圖像,深度不確定性收斂到比較小的區間才會插入地圖點。
參考文獻:
[1] Mur-Artal R, Montiel J M M, Tardos J D. ORB-SLAM: a versatile and accurate monocular SLAM system[J]. IEEE Transactions on Robotics, 2015, 31(5): 1147-1163.
[2] Gálvez-López D, Tardos J D. Bags of binary words for fast place recognition in image sequences[J]. IEEE Transactions on Robotics, 2012, 28(5): 1188-1197.
[3] Mur-Artal R, Tardós J D. Orb-slam2: An open-source slam system for monocular, stereo, and rgb-d cameras[J]. IEEE Transactions on Robotics, 2017, 33(5): 1255-1262.