視覺SLAM(一)——視覺SLAM框架

1.簡介及說明

SLAM(Simultaneous Localization And Mapping)——同時定位與地圖構建。因此SLAM是研究“定位”和“地圖構建”問題的。
目前多用於機器人導航、無人車駕駛、跟蹤建模。對於不同應用場景,精度要求、魯棒性等有所差異,此時選擇傳感器、運算側重環節也往往不同。但是基本框架幾乎一致。

本系列主要研究以視覺爲主的SLAM系統,主要是系統的學習基礎的SLAM相關內容。本人從事三維機器視覺相關工作,主要在交通行業應用,由於項目側重於跟蹤建模,研究過ORB-SLAM(特徵點匹配法)、DSO(光度恆定直接法)源代碼,各有優缺點。主要工作內容是對高速場景下的多車道車輛實時跟蹤三維建模,爲了保證準確、實時、同時跟蹤多目標並建模,所有運算環節均在Nvidia GPU中完成,產品已經滿足設計要求,且工作穩定,下圖爲自主研發產品檢測建模結果。現在作爲回顧,系統學習SLAM的相關內容。
Measure Result

主要參考書目是高翔博士的《視覺SLAM十四講》,中間會記錄一些個人實踐經驗和思考。

2.SLAM基礎框架

SLAM伴隨着機器視覺發展和機器人導航已經相對成熟,形成了合理高效的基本框架。
主要包含:
傳感器數據、前端視覺里程計、後端優化、迴環檢測、建圖。

傳感器數據

採集根據不同應用場景和需求進行選擇,主要有如下幾種傳感器:

1.單目:

也就是單獨一個攝像機,應用於手機AR場景。
單目第一個問題是沒有像素點的深度信息,在DSO初始化環節中,通過小位移假設對有效的像素點進行試探掃描,進而對深度初始化。ORB-SLAM中初始化對特徵點匹配進行,運Homography和Fundamental Matrix,選擇較好的運算位姿,最後進行Full Bundle Adjustment。
單目第二個問題是尺度不確定,測試過單目DSO,建圖會出現突然場景變大好多倍的現象。

2.雙目:

雙目的好處是受光線影響較小在戶外場景可以使用,按照場景可以選擇不同基線距離和分辨率的雙目相機。分辨率高時,運算量會非常大,並且目前雙目匹配優化比較消耗內存或顯存;分辨率低時,遠處準確度會變差;基線小時,遠處準確率難以保證;基線大時,近處測量不到,增大視差掃描範圍可部分解決,但性價比不高,64像素與128像素,可能只是增加近處0.5m的深度檢測範圍,但是視差運算時運算量會增加近一倍。

需要根據應用場景特點,在分辨率和基線參數上權衡。

市面上目前消費級雙目相機有
ZED(一代):分辨率高,深度由SDK優化過,速度和精度均爲頂尖水平,需要在帶有GPU的主機上運算,深度範圍:0.3-25m(實際10m處精度已經比較差了),視場角大:90x60,捲簾快門:對快速運動物體會有拖影,效果可能比較差。
RealSense(D435):基線距離短,Intel的產品!所以片上運算出深度數據,不必消耗太多計算機資源,但是實際測試3m以外,測量誤差幾乎超過20cm了。

自主設計雙目相機
匹配算法主要有OpenCV——BMSGBM,開源的有libSGM;opencv的BM有GPU實現,但是無亞像素級,遠處深度直接分段,幾乎可以認爲GPU的BM算法不可用(截至目前)。SGBM運算效果很好,但是運算速度太慢,無GPU版本,github上有個國內的大佬實現了SGBM的GPU版本,只支持640*480分辨率,測試效果與CPU運算結果幾乎一致!但是工程使用中,還是不太敢用,畢竟沒有深入研究代碼,怕有bug(逃。。。)。libSGM是日本的fixstar做的開源版本具有GPU版本的雙目匹配算法,一直都有維護,youtube上看該團隊做的項目很高大上,也研究並改動過源代碼,效果雖然沒有SGBM好,但是運算效率高且穩定,支持64\128像素視差,居家必備良心推薦。

3.RGB-D相機:

KinectV1:結構光,年代太早,現在幾乎已經找不到了。
KinectV2:Tof,效果很棒,在室內非常好用,精度高,數據穩定。官方SDK只支持一臺相機連接到計算機,使用libfreenect開源庫,可以同時連接多臺,之前專門編寫了多路libfreenect的採集同步,但由於KinectV2沒有同步觸發方式,多臺相機會存在同步採集問題。目前已經停產有兩年了,以後可能想用也用不上了。
Kinect Azure:第三代Kinect,也是Tof。與KinectV2對比測試過,KinectV2有三個激光發射模塊(後邊只裝了兩個,另一個空着沒有焊接發射模塊,可能是節約成本或者怕引起過曝),而Kinect Azure只有一個激光發射模塊。由於激光模塊功率變小,對於反射率低的空洞會變多。但是總體來說,Kinect Azure各方面性能都接近完美,可惜只適用於室內場景。
RealSense(L515):MEMS,沒有測評過,但是看youtube上的演示視頻,只給出僞彩深度圖的室內場景測試結果,目測精度沒有Kinect Azure高,並且發現對於測試場景中有個人人腿處大面積空洞,應當對於反射率低或黑色的效果比較差,失去了測評的興趣。
總體來說,RGB-D相機多數爲室內場景設計,一般850nm左右的波長就是針對室內場景了,905nm或者940nm左右的應當是室外自然光條件下也可以使用的。(陽光中該波長的光含量少,對於傳感器來講噪音就少了很多)

4.激光雷達:

激光雷達目前多應用於無人車駕駛,價格昂貴,點雲稀疏。但是好在測量結果穩定性好、測量深度範圍大,對於低反射率或者室外陽光下環境效果也保持穩定、準確。僅測評過DJI的Livox Mid-100,室內外測量效果沒得說,棒!價格也比較親民,只要9999!但是,機械式單點掃描速度較慢,100ms的採樣週期,相對比較稀疏,1s時很稠密,對於具體應用場景需要權衡。多線激光雷達採樣週期短,但就是太貴,造價不降下來的話,產品難以大量推廣應用,預研、demo都沒問題,量產產品就很心疼了。

5.IMU(慣性測量單元):

基於各種視覺導航的都會在特定場景下失效,比如少紋理時,所有基於視覺的都無法正常跟蹤。慣性導航作爲數據融合補充項,在視覺失效的場景下,能夠提供粗略的位姿信息。
實際用於定位導航的產品,幾乎都需要增加IMU作爲補充,提高產品環境適應性。但是視覺SLAM中暫時沒有研究這塊內容,開源項目VINS很好的對視覺和IMU進行融合,大神做的工作很充分了,值得學習研究。

前端視覺里程計(VO-Visual Odometry)

根據視覺特徵,對相鄰幀間的位姿進行擬合運算。不同方式,最終結果都是完成相機平移、旋轉的運算。

後端優化(Optimization)

通過大量觀測點的擬合,最終針對平移、旋轉6個參數進行尋優,往往得到結果準確度是比較高的。但準確度再高,也會有誤差,小誤差累計起來,會對建圖準確性產生很大影響。爲了得到準確的建圖結果,VO環節得到的位姿都輸入到優化器內,當優化器收到迴環檢測信息時,即可對所有中間輸入位姿全局優化,減小累計誤差對建圖準確性的影響。

迴環檢測(Loop Closing)

通過關鍵幀的特徵匹配,檢測到相機回到之前走過的場景,此時就可以作爲先驗知識,使用優化器去將之前的位姿人爲閉合。
這裏沒有專門研究過,想到了兩個問題:
1.如果遇上相似場景,導致匹配誤報,那場景豈不就大錯特錯了,是不是就得增加其他手段進行干預,比如GPS?對場景進行關聯,限定當前幀匹配範圍?
2.即使使用Bow,對特徵匹配進行加速,當場景很大時,關鍵幀就會變得非常多,此時匹配的速度一定會變慢,並且誤匹配的概率也會增加。應該也是需要分區域,限定匹配範圍。

建圖(Mapping)

根據需求,構建相應性質的地圖。
側重於定位時,多采用稀疏的路標地圖。
側重於路徑規劃自主導航時,則需要稠密的地圖,二維Grid、三維Voxel。
側重於實景建模時,需要對三維地圖進一步網格化。

關於傳感器數據就在本章完成討論,對於視覺里程計、後端優化、迴環檢測、建圖後續單獨分章節記述。

The End.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章