ORB-SLAM介绍(无源码版本)
??SLAM大致可分為激光SLAM和視覺SLAM,本篇就重點介紹一下一種經典的視覺SLAM——ORB SLAM。在2015年被首次提出,后續也有比較好的擴展性,應用很廣泛。要想真正讀懂ORB-SLAM肯定要從源碼入手,網上也有很多教程去解讀源碼。但鑒于目前的需要,所以只是從結構上介紹下ORB-SLAM,不對代碼進行任何的解讀。如果你是和我一樣的小白,不妨看一看,可能會有所收獲~
??首先列舉幾種常見的視覺SLAM,這些大部分都是在ORB-SLAM之前。
??內容參考:一文詳解ORB-SLAM3
??下面對ORB-SLAM進行一些特點的介紹:
??ORB-SLAM基于PTAM架構,同樣是基于關鍵幀(key fream based)在保證tracking和mapping線程分開基礎上,又增加了地圖初始化和閉環檢測的功能,總共三個線程(tracking、local mapping、loop closing )。
??ORM-SLAM的適用范圍:最開始基于單目,后來擴展到stereo和RGB上
??ORB-SLAM的實現是需要完全依托于ROS,對ORB-SLAM的評價是雖然完成了,但僅限于demo,所以基本只有后面的改進版本才能夠廣泛應用。
??ORB-SLAM的輸入及輸出:
????輸入:攝像頭采集的圖像及時間碼
????輸出:軌跡(每幀圖像對應的相機位姿)+地圖(KF+MP)
??上圖是ORB-SLAM的架構圖,也是流程圖(簡直清晰的一塌糊涂),把這個圖讀懂了,就完全明白ORB-SLAM的工作流程及原理了。見簡單概括下:主要有5個模塊,其中tracking,local mapping,loop closing是重點模塊,完成了大部分內容。place recognition模塊主要是配合上面三個重點模塊,MAP只是一個數據結構的存儲庫(不作為介紹的重點)。下面我根據流程執行順序依次介紹各個模塊。
注:上文提到了,ORB-SLAM主要是由三個線程完成。所以第一步是三個線程的初始化,在此不再贅述。
1.TRACKING
??從架構圖上可看出包含四個部分,包括了它所能完成的三個功能:(1)確定每幀的初始位姿 (2) 姿態優化 (3)確定KF給Local Mapping。完成三個具體功能之前,要做一些準備工作:
??準備工作1:從frame中提取ORB特征,如果你不知道啥是ORB,可以參考:ORB(Oriented FAST and Rotated BRIEF)
??準備工作2:初始化局部地圖(這也是單目的局限性,第一時間必須多角度初始化建立局部地圖),ORB-SLAM提供自動初始化方式。單目SLAM地圖初始化的目標是構建初始的三維點云,初始化的常見方法有三種:
??ORB SLAM作者提出一種基于統計的模型選擇方法,該方法優先選擇第三種方法,并期望在場景退化情形下自動選擇第二種方法。如果選取的兩幀不滿足要求,放棄這兩幀并重新初始化
??該模型方法的具體操作過程,參考:ORB-SLAM(三)地圖初始化
??下面介紹tracking完成的具體三個功能:
??(1)確定每幀的初始位姿(pose)
??pose的確定是根據上一幀完成的,根據從上一幀提取出的特征(特征的對應關系是Frame 1對n匹配feature,feature 1對1匹配MP,后續處理都以幀為單位)。
注:相機位姿:位姿即位置和姿態,相機的位姿可以看做相機從原始位置到當前位置的變換,包含一個平移變換和一個旋轉變換
參考:視覺SLAM中相機位姿的多種描述
??估計當前位姿的過程有兩個:1)跟蹤 2)計算位姿
??1)跟蹤(跟蹤局部地圖前要先構建局部地圖,也就是初始化),跟蹤的目的是找到MP和當前幀特征之間的對應關系。原理是當前幀和參考關鍵幀匹配,通過MP建立聯系(3D→2D的過程)。幀是2D特征,MP是3D點
跟蹤的的具體操作流程是:
??根據上一幀的位姿加上兩幀MP之間的關系,將上一幀的MP投影到當前幀。在投影點和當前幀原有點間尋找匹配,建立當前幀和MP之間的新關系。
??2)計算位姿,跟蹤后,通過PnP對當前幀的位姿進行求解
姿態優化的原因:影響ORB SLAM精度的影響因素:幀與幀之間的位姿優化是否準確
??(2)位姿優化
??主要思路是在當前幀和(局部)地圖之間尋找盡可能多的對應關系,來優化當前幀的位姿
??進行位姿優化的原因:得到的位姿是相對位姿,通過優化來保障精度。
??優化位姿的方式:局部/全局位姿優化,閉環檢測優化
??(3)確定關鍵幀
??通過參考幀就可以決定當前幀是不是關鍵幀
??關鍵幀要求:
????1.不要太稠密(兩相鄰關鍵幀有一定時間距離)
????2.當前幀確定為關鍵幀至少要匹配到50個MP
????3.當前幀匹配MP不能超過參考幀的90%,否則認為是冗余關鍵幀,不需要創建
??添加關鍵幀時間:局部地圖優化的空閑時間
??要選出關鍵幀的原因就是減少幀的數量,便于后面的BA
2.Local Mapping
??整個模塊的功能是更新局部地圖(由關鍵幀的聯系組成),將新關鍵幀加入,建立關鍵幀之間的聯系對關鍵幀位姿和map point點位置進行修正
??從架構圖上看,Local Mapping具體完成5部分功能:(1)關鍵幀的插入 (2)MP的剔除 (3)MP的創建 (4)local BA (5)KF的剔除
??(1)關鍵幀的插入
??添加關鍵幀步驟:
????確定當前幀的鄰接關鍵幀和二級鄰接關鍵幀(確定方法同上,只不過發起者變成鄰接關鍵幀),將當前幀的MP投影至一級/二級,若出現新匹配特征,曾更加該關鍵幀與MP的聯系,未出現新的,但出現匹配更多的也修改MP與該幀的匹配聯系。若匹配MP的數量達到閾值,即認定為關鍵幀。
??(2)Map Point的剔除
??MP的剔除是選擇與關鍵幀聯系較少,少于某一個指定閾值(原文中應該是3)。認定其為壞點,將其剔除。減少MP的數量,有利于優化速度。剔除的檢查步驟發生在MP新加入時
??(3)Map Point的創建
??MP創建原則:
????當前關鍵幀在covisibility graph中鄰接的一些關鍵幀(設定共同MP個數,達到要求算鄰接)。對鄰接的關鍵幀進行遍歷,在極線上進行搜索并三角化。根據匹配點對,通過三角化計算3d點。再確定MP的相關屬性(平均觀測方向、觀測距離、最佳描述子)
注:MP和KF變了之后,covisibility和spantree都要變。添加進入約束后要進行局部BA
??(4)局部優化(local BA)
??目的:這個不用輸,就是提高局部地圖精度
??局部優化的參與者:當前關鍵幀A、與A直接相連的關鍵幀B,與B關聯的關鍵幀C、A對應的MP,B對應的MP(不包括與A共同的)
注:全局優化的參與者:除第一幀外所有關鍵幀及所有MP
??(5)局部KF的剔除
??根據covisibility確定局部關鍵幀,若關鍵幀A對應的MP能被其他至少三個關鍵幀觀測到90%以上,認為其冗余,去除。也是為優化增加便利
以上完成VO過程
3.Loop Closing
??模塊整體作用:解決累計誤差,尺度漂移問題
??步驟:確定候選閉環幀→確定閉環幀
??具體過程:ORB-SLAM采用改進的DBoW2的方式解決環路檢測問題。改進點就在于原來是尋找一個,現在返回多個可能匹配值。
??為了解DBoW2,介紹詞袋模型(bag of words),詞袋模型是以特征描述作為元素的詞典。本文就是ORB特征了。詞典元素可以通過數據訓練出來(可離線訓練,增強實時性)。從圖像中提取特征描述(多用多維向量表示),將特征描述分類(可用聚類中各種機器學習算法)。就組成了詞袋模型。為了便于搜索再使用樹狀結構組織,就形成DBoW2。簡而言之DBoW2可以判斷兩張圖片是否有相似性,改進后輸出與屬于輸入有相似性的一組圖片。
??確定候選閉環幀:確定局部關鍵幀,計算局部關鍵幀的詞袋向量和所有局部關鍵幀的詞袋向量相似度。關鍵幀庫中尋找不小于最小相似度的作為備選回環關鍵幀。再檢查剩下的一致性確定閉環幀(連續三次的關鍵幀對應相同的候選閉環幀)
??確定閉環幀(回環驗證):從候選的回環幀中確定真的回環幀。遍歷每個回環幀,匹配和當前幀的MP,用MP去求一個相似變換(通過RANSAC)。如果回環幀對應的矩陣有足夠多內點,做Sim3優化,過程循環一下。最終發現足夠多內點,接受該回環幀。
??閉環融合:回環幀信息融合到當前幀中(因誤差累計更信任之前的信息)
??優化Essential Graph也是優化的一種,操作對象是covisibility graph,為后續局部優化、全局優化減少工作量。
4.place recognition模塊
??功能是路徑識別,即判斷兩幀是否存在大范圍的相似。應用場景是回環檢測和重定位(因阻擋、模糊等情況丟失后重新匹配關鍵幀)
??以上就是ORB-SLAM的整個操作流程,只有清楚上面這些操作,才能更好的理解后面的ORB-SLAM2和ORB-SLAM3哈~
補充說明內容:
1.covisibility graph、essential graph到底是什么?
??圖的思想貫穿了ORB-SLAM,優化也是選取的圖優化。不能說covisibility graph就是全局地圖,我覺得叫位姿地圖吧。covisibility graph的每個頂點是相機的pose(位姿),邊是pose和pose之間的變換關系。邊建立的基礎和幀、MP組成的圖有關系,也就是相機看到相似點時就會產生聯系,邊的權值就是聯系的可信程度。我覺得還是不要把這個和幀,MP聯系在一起了,單純當成姿態關系圖就行了。
??而essential graph是對covisibility graph的一個簡化(ORB-SLAM自己提的),減少邊的數量(保持連通性,最小生成樹),目的是在全局回環的時候減少計算量。
參考:Covisibility Graph - 心田居士 - 博客園 (cnblogs.com) 這篇文章的作者主要內容也是參考高博在知乎的一個回答
2.三角化創建MP點什么意思?
??文中說通過三角化的方式就可以創建MP點,三角化指根據在兩個圖片中的點和變換矩陣就能確定3D點坐標。具體的我也不是很明白(數學過程沒看~),把其理解為根據一組匹配點確定特征點(MP)的過程吧。
參考:slam 三角化 - 知乎
3.局部地圖、全局地圖到底指什么?
??這個問題困惑了我很久,這里的地圖不是指看得到那種地圖。其實是特征點信息,局部是當前臨近,全局就是所有。這些特征點可以配合當前幀去求位姿信息,也就實現了定位的功能。至于SLAM最后建的圖其實就是無數個特征點,特征點分布就可以反應環境的輪廓。
參考資料:
orb-slam的簡單講解-馮兵_騰訊視頻
SLAM - 標簽 - 路游俠 - 博客園
下面這篇對ORB-SLAM的特點把握的比較好:
ORB-SLAM2詳解(一)
總結
以上是生活随笔為你收集整理的ORB-SLAM介绍(无源码版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux常用命令(精)
- 下一篇: 语法分析与中间代码生成