天天看點

視覺SLAM開源算法ORB-SLAM3 原理與代碼解析

文稿整理者:何常鑫,稽核&修改:劉國慶

本文總結于上交感覺與導航研究所科研助理——劉國慶關于【視覺SLAM開源算法ORB-SLAM3 原理與代碼解析】的公開課。

ORB-SLAM最早的版本在2014年的RSS上釋出,在2016年作者又釋出了ORB-SLAM2,接着在去年(2020年)釋出了ORB-SLAM 3。ORB-SLAM1隻能針對單目相機資料進行處理;ORB-SLAM 2 增加了對于雙目和RGB-D相機的處理,在回環檢測子產品增加了Full Global BA的處理;ORB-SLAM 3則增加了對于IMU融合的支援,相容魚眼相機模型,并且增加了Altas多地圖的支援;同時,回環檢測為了支援多地圖的模式,提供了一種叫Welding BA的優化方式。ORB -SLAM的作者将上述提到的各版本項目都開源了,為學術研究還是工程落地都提供了很好的參考。

1

首先來介紹一下ORB SLAM中涉及的一些基礎概念。​

幀&關鍵幀:視覺SLAM都是對一個圖像序列進行處理,每一張圖像被稱為幀,而關鍵幀則是通過一定篩選機制得到的、具有一定代表性的圖像幀。

地圖點/路标點:将圖像上被觀察到的特征點通過三角化等方式進行深度恢複,我們就可以得到其對應的在三維空間的位置,同時包含幀的觀測資訊,這種點就被稱為地圖點或路标點。

共視:當一個地圖點被多幀觀察到時,我們就可以稱這幾幀有基于該地圖點的共視關系。

共視圖&本質圖:我們可以把共視關系作用邊表示,關鍵幀用節點表示,就可以建立共視圖,而本質圖在共視圖基礎上隻保留具有較強共視關系的邊。

視覺SLAM開源算法ORB-SLAM3 原理與代碼解析

Altas(地圖集):ORB-SLAM 3提供了多地圖的存儲和拼接功能,在跟蹤丢失後可以嘗試将現有地圖和曆史地圖進行比對、融合,并更新目前的活躍地圖(Active Map)

資料關聯:在語義SLAM中,第k幀檢測到物體Obj1、Obj2,第k+1幀檢測到物體Obj3、Obj4,确定Obj1和Obj3、Obj4中的哪一個是對真實世界中同一個物體的多次觀測,這是資料關聯的一個直覺例子。在間接法(特征法)SLAM中,表現為不同幀中的特征,哪些是對應于同一個空間路标點/地圖點的。在ORB3中考慮到的資料關聯包括短期内滑動視窗中關鍵幀觀測到的路标點和圖像特征的資料關聯;中期的資料關聯是指圖像特征與局部地圖點的關聯;長期的資料關聯包括利用場景識别技術和詞袋模型,在回環檢測、重定位等過程中的資料關聯;而多地圖的資料關聯還可以實作地圖之間地圖點的比對和融合。

ORB-SLAM 3的基本流程和此前的ORB版本沒有顯著的改變,隻是也增加了部分新特性。基于詞袋模型的關鍵幀資料和之前差不多,每一個關鍵幀均會被存入資料庫用于回環檢測。地圖結構上進行了改進,ORB-SLAM3使用Altas地圖集的結構,地圖中包含一個Active Map和若幹個Non-active Map,每個Map均包括地圖點,關鍵幀,共視圖,Spanning Tree等資訊。跟蹤線程添加了IMU的積分,并且和以前一樣進行關鍵幀的判斷和構造;在LocalMapping線程中中執行IMU的初始化,以及和之前相同的備援關鍵幀和地圖點剔除、新地圖點的建立等工作;在回環檢測部分主要添加了多地圖的融合。

視覺SLAM開源算法ORB-SLAM3 原理與代碼解析

ORB-SLAM 3架構

總結一下,ORB-SLAM3的貢獻包括:

1、 提供了一個單雙目VI-SLAM的系統;

2、 改善召回率的場景識别技術;

3、 多地圖機制;

4、 抽象的相機表示。

2

抽象相機模型介紹​

為什麼ORB-SLAM3需要一個抽象的相機模型呢?

相比于傳統相機,魚眼相機超過180度的廣視角可以擷取更多的資訊,但是因為它不符合針孔模型數學模組化的假設,導緻uniform reprojection error的假設失效;如果對于圖像直接進行裁剪,将會導緻外圍圖像丢失,反而喪失了魚眼相機大視角的優勢。在ORB-SLAM3中,相機成像模型提供投影、反投影和相關的雅克比計算等函數,并且将此前系統中的EPNP更換為MAP-PNP, 進而實作了相機成像模型與SLAM部分的解耦,還可以擴充,能将相同的SLAM pipeline用于大部分類型的相機。

此外,針對雙目相機模型,ORB-SLAM3也提供了一定的改善。ORB-SLAM2假設我們針對雙目相機預先進行了極線矯正,但是很多時候由于無法保證左右目相機光軸的絕對平行,極線糾正的效果也往往不好;而有些時候,我們需要使用兩個參數不同的相機進行觀測,而ORB-SLAM2無法相容這類雙目相機,如類似RGB-D相機中焦距、分辨率相差巨大的彩色相機+近紅外相機,如果将彩色圖像和近紅外圖像組成雙目圖像,ORB-SLAM2無法綜合利用這對圖像估計相機位姿。在ORB-SLAM3中将左右兩目相機視作為具有固定位姿變換的兩台單目相機使用,并且也不再限制兩台相機必須具有足夠面積的、重疊的共視區域,解決了這個問題。

3

VISLAM實作和IMU初始化

ORB-SLAM3中VI-SLAM在ORB-SLAM-VI上進行了改進,包括:提供快速,準确的IMU初始化;支援單雙目VI-SLAM;支援針孔/魚眼相機模型。在視覺和IMU融合方面,ORB-SLAM3在位姿求解時所建立優化問題的殘差項,包括所有關鍵幀和上一幀IMU估計的殘差項,以及所有路标點觀測的視覺誤差項。其中針對視覺路标點的觀測,為了避免錯誤比對造成的極端值的影響,嵌套了魯棒核函數。

IMU初始化的目的是為了得到Body系速度、重力方向和IMU偏置。ORB-SLAM3中初始化流程的設計建立在作者的幾點思考上:

1、ORB-SLAM純單目已經可以初始化得到精确的地圖,尺度資訊可以通過IMU得到;雙目圖像輸入下則尺度客觀,可以不考慮尺度資訊的問題;

2、如果将尺度單獨作為優化變量進行表示和優化,效果比在BA中的隐式表達收斂更快;

3、IMU初始化過程中必須考慮傳感器的不确定性,否則會産生難以預測的巨大誤差。

接下來的讨論IMU初始化問題時,均指單目輸入時的初始化。ORB3中IMU初始化的步驟包含三步,第一步是純視覺最大後驗估計(MAP),第二步是純慣性MAP,第三步是視覺+慣性MAP。針對純視覺MAP,我們提取初始化後2s内10幀圖像進行純視覺BA,進而得到沒有尺度資訊的相機位姿和路标點位置。接下來我們進行隻有IMU參與的初始化,最終得到的優化結果是:幀位姿、速度和地圖點,并都具有正确的尺度;Body系Z軸将被旋轉到和重力方向一緻;IMU的偏置被更新。第三步是視覺IMU聯合後驗估計,ORB-SLAM3隻需要2秒就可以完成尺度的初始化,誤差在5%左右,此外,ORB-SLAM3還将進行隻包含尺度因子和重力方向的優化,10秒一次,用于避免傳感器運動緩慢時IMU激勵不夠的情況。

ORB-SLAM3中的跟蹤和建圖和ORB-SLAM-VI類似,在短期跟丢後,在滿足一定條件時會嘗試利用IMU積分得到的位姿資訊進行重定位;當丢失持續一定時間後,将會重新初始化,建立新的Active map。

4

改進的回環檢測與多地圖融合

這一部分的内容很大程度上和ORB-SLAM2是相同的,我們首先來回顧一下基本概念。

準确率(PrecisionRate):檢測到的回環中正确的比率。

召回率(RecallRate):檢測到的回環占總真實回環數的比率。

在ORB-SLAM1/2中,僅通過DBoW詞袋資料庫就可實作50%~80%的準确率和召回率。在回環時,通過增加幾何一緻性和時間一緻性檢驗,犧牲召回率來增加準确率。ORB-SLAM3改進了回環檢測的速度,提高了召回率,并且增加了多地圖的部分。

尋找閉環幀的過程可以分為六步:

1.針對每一個新關鍵幀,在資料庫中查詢到三個最相似的關鍵幀;

2.嘗試對新關鍵幀及其共視關鍵幀,和候選關鍵幀及其共視關鍵幀進行資料關聯;

3.利用比對的特征點和地圖點求解位姿轉換;

4.利用位姿變換的初始估計,進行點雲重投影尋找新的比對,并且進行位姿的優化求精

5.對時間一緻性的檢驗,此前的步驟相對複雜,在ORB-SLAM3中局部地圖裡面已有關鍵幀的共視資訊進行判斷;

6.利用重力方向對于回環結果進行檢查。

回環檢測後是進行回環還是地圖合并,取決于目前關鍵幀檢測到的回環關鍵幀是在目前的active map還是在其他map。當對non-active map和active map進行融合時,共視圖和本質圖同步更新,active map中的資訊被追加到曆史地圖中,比對到的non-active map變成新的map。

5

總結

總體來說,ORB-SLAM3的流程和ORB-SLAM1/2非常相似,對于ORB-SLAM系列熟悉的同學應該很容易上手;相機模型的抽象處理,使得SLAM位姿求解過程和相機成像模型解耦,理論上支援絕大多數成像模型的相機;通過對于IMU的支援,ORB-SLAM系列加入了VI-SLAM的大家庭,也表明多傳感器融合的SLAM是目前一大發展趨勢;多地圖的機制有利于跟丢後保留盡可能多的資訊用于後續補救,也為後續實作多機器協同的SLAM提供了工作基礎。