上一篇提到,無論在單目、雙目還是RGBD中,追蹤得到的位姿都是有誤差的。隨着路徑的不斷延伸,前面幀的誤差會一直傳遞到后面去,導致最后一幀的位姿在世界坐標系里的誤差有可能非常大。除了利用優化方法在局部和全局調整位姿,也可以利用回環檢測(loop closure)來優化位姿。
這件事情就好比一個人走在陌生的城市里,一開始還能分清東南西北,但隨着在小街小巷轉來轉去,已經不知道自己在什么地方了。通過認真辨識周邊環境,他可以建立起局部的地圖信息(局部優化)。再回憶以前走過的路徑,他可以糾正一些以前的地圖信息(全局優化)。然而他還是不敢確定自己在城市的精確方位。直到他看到了一個之前路過的地方,就會恍然大悟,“噢!原來我回到了這個地方。”此時,將這個信息傳遞回整個地圖,就可以得到相當准確的地圖信息。這就是回環檢測。
因此,回環檢測在大尺度地圖構建上是一個非常有用的方法。回環檢測可以從二維圖像出發,也可以從三維點雲出發。目前大家更推薦基於二維圖像的方法。
DBoW2
基於二維圖像的方法本質上是一個場景識別的問題。我沒有深入研究過,因此直接介紹一下ORB-SLAM中用到的DBoW2的方法。
BoW(bag of words,詞袋模型),可以理解為一個以特征描述作為元素的詞典。如果是ORB特征,那就是ORB詞典;如果是SIFT特征,那就是SIFT詞典。詞典可以從圖像數據集中訓練出來。下面舉一個簡單的例子。假如我們有一個一萬幅圖像的數據集,並認為它基本上涵蓋了我們所面臨的場景。
-
從每幅圖像中提取特征點和特征描述;特征描述一般是一個多維向量,因此可以計算兩個特征描述之間的距離;
-
將這些特征描述進行聚類(比如k-means),類別的個數就是詞典的單詞數,比如1000;也可以用Beyes、SVM等;
-
DBoW2將這個詞典組織成樹的形式,方便搜索。
在實際應用中,每一幅圖像都在詞典中搜索其最近鄰的單詞,並在該單詞下留下標記。如果A、B兩幅圖像定位到同一個單詞時,說明這兩幅圖像有可能有相似的特征點。當A、B有一定量的相似點時,可以認為這兩幅圖像之間存在着一定的相似性。
ORB-SLAM的作者修改了DBoW2,輸出一系列候選圖像(candidate)而不是一幅最相似的圖像。
基於BoW的方法有一些非常好的優勢:
-
詞典可以離線訓練。在實時應用中能離線的東西越多越好。作者提供了通過大量數據訓練出來的BRIEF和SIFT的詞典。
-
搜索速度飛快。小尺寸的圖像可以在毫秒級別完成。作者提供了正向(direct index)和反向(inverse index)兩種輔助指標。反向指標在節點(單詞)上儲存到達這個節點的圖像特征的權重信息和圖像編號,因此可用於快速尋找相似圖像。正向指標則儲存每幅圖像上的特征以及其對應的節點在詞典樹上的某一層父節點的位置,因此可用於快速特征點匹配(只需要匹配該父節點下面的單詞)。
-
很多slam應用本身就需要計算特征點和描述,因此可以用特征來搜索。
-
ORB-SLAM的作者還用詞典的特性做快速的特征篩選,減少特征匹配需要的時間(特別是在大尺度上搜索特征時)。
當然它也有自己的劣勢:
-
如果應用的場景比較特殊,請訓練自己的詞典。一般的詞典會不太好用。
- BoW一般不太考慮特征之間的幾何關系(有人在做,但不清楚效果和計算量如何)
還有幾個comments:
-
如果應用本身不需要計算特征,那要考慮額外的計算時間。
-
推薦像ORB-SLAM一樣,BoW只用來快速篩選圖像,后續需要通過其它方法一一驗證、嚴格驗證。如果回環選錯了,那,就跪了。
-
如果場景特征很少,或者重復的特征太多,比較難辦。
-
在稠密點雲重建中,如果場景本身有豐富的幾何紋理,那么可以利用兩幀之間(包括相鄰位置)的三維點雲匹配去驗證回環。如果匹配的誤差足夠小,那么回環是比較准確的。
回環驗證和Sim3優化
對每個候選的回環幀,作者先匹配其和當前幀上的特征點,然后用特征點對應的三維點去求解一個相似變換矩陣(RANSAC框架下)。如果某個回環幀對應的矩陣有足夠多的內點,那去做Sim3優化。利用優化結果再去尋找更多的特征匹配,再做一遍優化。如果內點足夠多,那么接受這個回環。
Sim3優化詳見上一篇。
回環融合(fusion)
這里有一個隱含假設,即誤差隨着時間不斷累積,相對而言,我們更信任之前的信息而不是當前的信息。這部分主要是把回環幀的信息融合到當前幀里面,包括匹配的特征點對應的三維信息(深度、尺度等),世界坐標系下的位姿(通過Sim3的結果轉化過去)等等。融合也包括回環幀的鄰域和當前幀的鄰域。
全局優化
全局優化時,固定回環幀及其鄰域,當前幀及其鄰域,優化剩余幀在世界坐標系的位姿。詳見上一篇。
預告:
這個系列寫到這里就暫時告一段落啦。回頭來看,前面幾篇寫的並不滿意,尤其追蹤那部分,將來爭取重寫一下。
接下來,本來想寫關於LSD的文章,估計會暫緩一下,先寫一兩篇關於網格生成的文章。
該系列的其它文章:
