版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 html
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匹配,而且設計了很是優秀的地圖管理策略。app
在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的複雜度。oop
在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的深度濾波器從機率分佈的角度充分利用了多幀圖像,深度不肯定性收斂到比較小的區間纔會插入地圖點。spa
參考文獻:線程
[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.htm
[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.blog