SLAM的通用框架:GSLAM
SLAM的通用框架:GSLAM
GSLAM: A General SLAM Framework and
Benchmark
論文鏈接:
http://openaccess.thecvf.com/content_ICCV_2019/papers/Zhao_GSLAM_A_General_SLAM_Framework_and_Benchmark_ICCV_2019_paper.pdf
摘要
SLAM技術最近取得了許多成功,吸引了高科技公司的注意。然而,如何統一現有或新興算法的接口,有效地進行速度、健壯性和可移植性方面的基準測試,仍然是一個難題。本文提出了一種新的SLAM平臺GSLAM,它不僅提供了評估功能,而且為研究人員快速開發SLAM系統提供了有用的工具。的核心貢獻是為研究和商業應用提供一個通用的、跨平臺的、完全開放源碼的SLAM接口,旨在在統一的框架中處理與輸入數據集、SLAM實現、可視化和應用程序的交互。通過這個平臺,用戶可以通過插件的形式實現自己的功能,以獲得更好的性能,進一步推動應用程序向SLAM的實際應用發展。帶有文檔wiki的GSLAM源代碼已經發布,可以在GitHub上找到。
- 主要貢獻
自20世紀80年代以來,同步定位與映射(SLAM)一直是計算機視覺與機器人領域的研究熱點[3,10,14]。SLAM為許多需要實時導航的應用提供了基本功能,如機器人、無人機(UAV)、自動駕駛以及虛擬和增強現實。近年來,SLAM技術發展迅速,提出了多種SLAM系統,包括單目SLAM系統(基于關鍵點的SLAM系統[12,37,49]、直接的SLAM系統[15,16,53]和半直接的SLAM系統[22,23])、多傳感器SLAM系統(RGBD系統[7,36,68]、立體的SLAM系統[17,23,51]和慣性輔助的SLAM系統[45,56,66])、基于學習的SLAM系統(監督的SLAM系統[6,55,67]和無監督方法[71,72]。
隨著SLAM技術的迅速發展,幾乎所有的研究者都把注意力放在了自己SLAM系統的理論和實現上,使得交換思想變得困難,并且不容易將實現移植到其他系統上。妨礙了快速適用于各種工業領域。目前,SLAM系統的實現方式很多,如何有效地進行速度、健壯性和可移植性方面的基準測試仍然是一個問題。最近,Nardi等人[52]和Bodin等人[4]提出了統一的SLAM基準系統,以進行定量、可比和可驗證的實驗研究,研究不同SLAM系統之間的權衡。通過這些系統,利用數據集和度量評估模塊可以方便地進行評估實驗。
由于這些系統只提供評估基準,有可能建立一個平臺,服務于SLAM算法的整個生命周期,包括開發、評估和應用階段。基于SLA的深度學習近年來取得了顯著的進展,有必要建立一個既支持C++又支持Python的平臺,更好地支持基于SLAM系統的幾何和深度學習的集成。本文介紹了一種新的SLAM平臺,它不僅提供了評估功能,而且為研究人員快速開發自己的SLAM系統提供了有用的工具。通過該平臺,用戶可以直接使用常用函數或創建自己的函數來實現自己的項目,從而獲得更好的性能。希望這個平臺能進一步推動SLAM系統的實際應用。總之,這項工作的主要貢獻如下:
1) 為研究和商業應用提供了一個通用的、跨平臺的、完全開放源碼的SLAM平臺,這超出了以前的基準。SLAM接口由幾個輕量級的、無依賴項的頭文件組成,這使得在一個統一的框架中與不同的數據集、SLAM算法和帶有插件表單的應用程序進行交互變得容易。此外,JavaScript和Python也被提供給基于web和基于深度學習的SLAM應用程序。
2)在GSLAM平臺中,引入了三個優化模塊作為工具類,包括估計器、優化器和詞匯表。估計器的目的是提供一個封閉形式的求解器的集合,涵蓋所有有趣的情況和穩健樣本一致性(RANSAC);優化器的目的是為流行的非線性SLAM問題提供一個單一的接口;詞匯表的目的是提供一個有效和便攜式的詞匯袋實現與多線程和SIMD優化的地方再電離。 3)得益于上述接口,在一個統一的框架中實現并評估了現有數據集、SLAM實現和可視化應用程序的插件,未來新興基準或應用程序可以更容易地集成。
General SLAM Framework
GSLAM的核心工作是提供一個通用的SLAM接口和框架。為了更好的體驗,界面被設計成輕量級的,它由幾個頭組成,并且僅依賴于C++ 11標準庫。基于該接口,支持JavaScript、Python等腳本語言。在這一部分中,介紹了GSLAM框架,并簡要介紹了幾個基本接口類。 框架概述
GSLAM的框架如圖1所示,一般來說,接口的目的是處理三個部分的交互:
1)SLAM實現的輸入
運行SLAM時,需要傳感器數據和一些參數。對于GSLAM,Svar類用于參數配置和命令處理。SLAM實現所需的所有傳感器數據都由一個數據集實現提供,并使用Messenger進行傳輸。GSLAM實現了幾個流行的visual SLAM數據集,用戶可以自由地實現自己的數據集插件。
2)SLAM的實現
GSLAM將每個實現視為一個插件庫。開發人員很容易基于GSLAM接口和實用程序類設計SLAM實現。開發人員還可以使用接口包裝實現,而不必導入額外的依賴項。用戶可以專注于核心算法的開發,而不必關心SLAM實現之外應該處理的輸入和輸出。
3)使用SLAM結果的可視化部分或應用程序
在SLAM實現處理輸入幀之后,用戶可能希望演示或利用結果。一般來說,SLAM結果應該以標準格式發布。默認GSLAM使用Qt進行可視化,但是用戶可以自由地實現自定義的可視化工具,并添加應用程序插件,如評估應用程序。
該框架被設計為兼容不同種類的SLAM實現,包括但不限于單目、立體、RGBD和具有多傳感器融合的多攝像機視覺慣性里程表。現在它最適合基于特征的實現,同時也支持基于直接或深度學習的SLAM系統。由于現代的深度學習平臺和開發人員喜歡Python進行編碼,GSLAM提供了Python綁定,因此開發人員能夠使用Python實現SLAM,并用GSLAM調用它,或者用Python調用基于C++的SLAM實現。此外,GSLAM可以用來訓練SLAM模塊,其監督過程可以概括為:
1)使用傳統SLAM插件計算稀疏深度圖和相機姿態;
2)使用深度圖和相機姿態作為監督訓練估計器。GSLAM還可以應用無監督的方法來聯合學習深度和姿態估計器,通過數據集插件只需要不需要地面真實深度的圖像序列進行訓練。然后,利用多視圖幾何約束作為損失對網絡進行訓練。
3.2 基本接口類
SLAM接口通常使用一些數據結構,包括參數設置/讀取、圖像格式、姿態變換、相機模型和地圖數據結構。下面將簡要介紹一些基本的接口類。
3.2.1參數設置
GSLAM使用一個小的參數解析和參數設置類Savar,它僅由一個依賴于C++
11的單個標頭組成,其特征如下:
- 參數解析和配置加載與幫助信息。與Google
g flags2等流行的參數解析工具類似,變量配置可以從參數、文件和系統環境中加載。用戶還可以通過“幫助”中的“介紹”定義不同類型的參數。
2.一種具有變量、函數和條件的小型腳本語言,使配置更加強大。
-
線程安全的變量綁定和共享。建議使用非常高頻率的變量與指針或引用綁定,這樣既方便又高效。
-
C++和純腳本的簡單函數調用和調用。命令和函數之間的綁定有助于開發人員分離文件依賴關系。
-
支持樹結構表示,這意味著很容易加載或保存XML、JSON和YAML格式的配置。
3.2.2進程內消息傳遞
由于ROS提供了一種非常方便的節點間通信方式,受到了大多數機器人研究人員的青睞。受ROS2消息傳遞體系結構的啟發,GSLAM實現了一個類似的進程內通信實用程序類Messenger。這為在SLAM實現中替換ROS并保持兼容性提供了另一種選擇。由于進程內設計,Messenger可以發布和訂閱任何類,而不需要額外的成本。下面列出了更多功能:
- 這個界面保持了ROS的風格,用戶可以很容易地開始使用。并且支持所有的ROS-defined消息,這意味著幾乎不需要什么工作來取代原來的ROS消息。
2.由于不存在序列化和數據傳輸,因此可以發送消息而無需等待時間和額外成本。同時,有效載荷不限于ROS定義的消息,但支持任何可復制的數據結構。
- 源是基于C++ 11的頭字號LES,沒有額外的依賴性,這使得它是可移植的。 4. API是線程安全的,當隊列大小大于零時支持多線程條件通知。主題名和RTTI數據結構檢查都在發布服務器和訂閱服務器相互連接之前完成,以確保調用正確。
三維變換
旋轉、剛性和相似性是SLAM研究中最常用的三種變換。點p=(x,y,z)T的相似變換常用于使用4×4齊次變換矩陣或將該矩陣分解為旋轉和平移分量:
3.2.4圖像格式
圖像數據的存儲和傳輸是視覺SLAM的兩個重要功能。為了高效和方便,GSLAM使用了一個與cv::Mat兼容的數據結構框架。它有一個智能點計數器,可以安全地釋放內存,而且不需要內存拷貝就可以輕松地傳輸。并且數據指針是對齊的,這樣單指令多數據(SIMD)的速度就更容易提高。用戶可以無縫安全地在GImage和cv::Mat之間進行轉換,而無需內存拷貝。
3.2.5攝像機型號
攝像機模型應被定義為將三維點pc從攝像機坐標投影到二維像素x。一個最流行的攝像機模型是針孔模型,其中投影可以通過乘以一個稱為:
由于SLAM圖像可能包含由于制造不完善而產生的徑向和切向畸變,或者是用魚眼或全景相機拍攝的,因此提出了不同的相機模型來描述投影。GSLAM提供的實現包括OpenCV[24](ORBSLAM[51]使用)、ATAN(PTAM[37]使用)和OCamCalib[59](MultiCol SLAM[65]使用)。用戶也很容易繼承類并實現其他一些相機模型,如Kannala Brandt[35]和等矩形全景模型。
3.2.6 地圖數據結構
對于SLAM實現,其目標是定位實時姿勢并生成地圖。GSLAM提出了一種統一的地圖數據結構,由多個地圖框架和地圖點組成。這種數據結構適用于大多數現有的視覺SLAM系統,包括基于特征的方法和直接方法。圖幅用于表示不同時期的位置狀態,包括由傳感器捕獲的各種信息或估計結果,包括IMU或GPS原始數據、深度信息和相機模型。它們之間的關系由SLAM實現來估計,它們之間的連接形成一個姿勢圖。映射點用于表示幀所觀察到的環境,通常用于基于特征的方法。但是,映射點不僅可以表示關鍵點,還可以表示GCP、邊緣線或三維對象。它們與圖幅的對應形成一個觀察圖,通常稱為束圖。
4. SLAM實現實用程序
為了簡化SLAM系統的實現,GSLAM提供了一些實用類。本節將簡要介紹三個優化模塊:估計器、優化器和詞匯表。
4.1. 估計器
純幾何計算仍然是一個需要魯棒精確實時解的基本問題。經典的視覺SLAM算法[22,37,49]和現代的視覺慣性解[45,56,66]都依賴于幾何視覺算法進行初始化、重新定位和環路閉合。OpenCV[5]提供了幾個幾何圖形算法和Kneip提出了一個幾何視覺工具箱OpenGV[39],該工具箱僅限于攝像機姿態計算。GSLAM的估計器旨在提供一組用穩健樣本一致性(RANSAC)[19]方法覆蓋所有有趣案例的閉式解算器。表2列出了估計器支持的算法。根據觀察結果,它們被分為三類。利用二維匹配估計外極或單應約束,并從中分解相對位姿。對于單目或多目相機系統,二維-三維對應關系被用來估計中心或非中心絕對位姿,這是著名的PnP問題。還支持三維幾何函數,如平面擬合和估計兩點云的SIM3變換。大多數算法都是根據線性代數庫的特征值來實現的,對于大多數平臺來說,特征值只是報頭,而且很容易實現。
計算性能評估包括內存使用率、malloc數、CPU使用率和每幀統計使用的時間,如圖4所示。結果表明,SVO占用的內存、CPU資源最少,速度最快。所有的成本都保持穩定,因為SVO是一個可視的里程表,并且在實現中只維護一個本地地圖。DSO內存塊數較少,但占用的內存超過100MB,增長緩慢。DSO的一個問題是當幀數小于500時,處理時間急劇增加,另外,關鍵幀的處理時間甚至更長。ORBSLAM占用的CPU資源最多,計算時間穩定,但由于bundle調整使用了G2O庫,沒有采用增量優化方法,內存利用率增長較快,分配和釋放了大量內存塊。里程表軌跡評估如圖5所示。如我們所見,SVO速度更快,但漂移更大,而ORBSLAM在絕對位姿誤差(APE)方面達到最佳精度。也提供了相對位姿誤差(RPE),但由于圖中,補充材料中提供了更多的實驗結果。由于集成評估是一個可插入的插件應用程序,因此可以使用更多的評估指標(如pointcloud的精度)重新實現它。
4.2 優化器
非線性優化是最先進的幾何SLAM系統的核心部分。由于Hessian矩陣的高維性和稀疏性,采用圖結構對SLAM的復雜估計問題進行建模。為了解決一般圖優化問題,提出了Ceres[1]、G2O[43]和GTSAM[13]等框架。這些框架被不同的SLAM系統廣泛使用。ORB-SLAM[49,51],SVO[22,23]使用G2O進行束調整和位姿圖優化。OKVIS[45],VINS[56]使用Ceres進行帶IMU因子的圖優化,并使用滑動窗口控制計算復雜度。Forster等人[21]提出了一種基于SVO的可視化初始方法,并用GTSAM實現了后端。GSLAM的優化器旨在為大多數非線性SLAM問題(如PnP求解器、束調整、位姿圖優化)提供一個統一的接口。基于Ceres庫實現了一個通用的插件。對于一個特殊的問題,比如包調整,一些更有效的實現,比如PBA[70]和ICE-BA[46]也可以作為插件提供。通過使用優化器實用程序,開發人員可以使用統一的接口訪問不同的實現,特別是對于基于深度學習的SLAM系統。
4.3 詞匯
位置識別是SLAM重定位和環路檢測的重要組成部分。單詞包(BoW)方法由于其高效性和性能在SLAM系統中得到了廣泛的應用。FabMap[11][30]提出了一種基于位置外觀的概率識別方法,RSLAM[47],LSD-SLAM[16]使用了這種方法。由于使用了諸如SIFT和SURF這樣的浮動描述符,DBoW2[25]構建了一個用于訓練和檢測的詞匯樹,它同時支持二進制和浮動描述符。Rafael提出了DBoW2的兩個改進版本DBoW3和FBoW[48],簡化了界面,加快了訓練和加載速度。在ORB-SLAM[49]采用ORB[58]描述符并使用DBoW2進行環路檢測[50]、重新定位和快速匹配之后,ORB-SLAM2[51]、VINS Mono[56]和LDSO[26]等多種SLAM系統使用DBoW3進行環路檢測。它已經成為實現SLAM系統位置識別的最流行的工具。受上述工作的啟發,GSLAM實現了DBoW3詞匯表的header-only實現,具有以下特性:
-
刪除OpenCV依賴性,所有功能都在一個單獨的頭標題中實現,只依賴于C++ 11。
-
結合了DBoW2/3和FBoW[48]的優點,這兩種方法都非常快速且易于使用。提供了類似于DBoW3的接口,并使用SSE和AVX指令加速二進制和浮點描述符。
-
我們提高了存儲的利用率,加快了加載、保存或訓練詞匯以及從圖像特征到弓向量的轉換的速度。
-
SLAM評估基準
已有的基準測試[2963]需要用戶下載測試數據集并上傳結果進行精度評估,無法統一運行環境,無法進行性能比較評估。得益于GSLAM的統一接口,對SLAM系統的評估變得更加優雅。在GSLAM的幫助下,開發者只需上傳SLAM插件,就可以在固定資源的dockerlized環境中對速度、計算成本和準確性進行各種評估。在本節中,我們將對三種具有代表性的SLAM實現進行速度、精度、內存和CPU使用情況的評估,以證明使用不同SLAM實現插件實現統一SLAM基準的可能性。
5.1 數據集集合
運行SLAM系統總是需要具有相應配置的傳感器數據流。為了讓開發人員專注于核心SLAM插件的開發,GSLAM提供了一個標準的數據集接口,開發人員不需要處理SLAM輸入。在線傳感器輸入和流量數據都是通過不同的數據集插件提供的,正確的插件通過識別給定的數據集路徑suf fix動態加載。數據集實現應提供所有請求的傳感器流和相關配置,因此不同數據集不需要額外設置。所有不同的傳感器流都是通過在Sec中引入的Messenger發布的。具有標準主題名稱和數據格式。GSLAM已經實現了表中列出的幾個流行的visual SLAM數據集表4。對于用戶來說,實現一個僅基于頭的GSLAM核心的數據集插件并將其作為插件發布或與應用程序一起編譯也是非常容易的。此外,我們還提供了ORBSLAM可以在不同數據集上運行的屏幕截圖,圖2中只修改了一個參數。
5.2 SLAM實現
圖3展示了一些使用內置Qt可視化工具運行的開源SLAM和SfM插件的截圖。該框架支持SLAM系統的不同體系結構,包括直接的、半直接的、基于特征的、甚至SfM方法和基于學習的密集深度估計。應該提到的是,由于SVO、ORBSLAM和TheiaSfM利用了Sec中介紹的地圖數據結構。可視化是自動支持的。DSO實現需要發布點云、相機姿態、軌跡和姿態圖等結果,以便進行可視化,就像基于ROS的實現一樣。用戶可以使用UNI框架訪問不同的SLAM插件,根據C++、Python和節點JS接口開發基于SLAM的應用程序非常方便。由于許多研究人員使用ROS進行開發,GSLAM還提供ROS可視化工具插件來無縫傳輸ROS定義的消息,開發人員可以利用Rviz進行顯示或繼續開發其他基于ROS的應用程序。
5.3 評價
因為大多數基準測試只提供有或沒有基本事實的數據集,供用戶自己執行評估。GSLAM為計算性能和準確性評估提供了內置插件和腳本工具。使用TUMRGBD數據集中的序列nostructure紋理near withloop來演示計算的執行方式。并采用三個開源的單目SLAM插件DSO、SVO和ORBSLAM進行后續實驗。所有實驗都使用了一臺運行64位Ubuntu 16.04的i7-6700cpu、GTX 1060 GPU和16gbram的計算機。計算性能評估包括內存使用率、malloc數、CPU使用率和每幀統計使用的時間,如圖4所示。結果表明,SVO占用的內存、CPU資源最少,速度最快。所有的成本都保持穩定,因為SVO是一個可視的里程表,并且在實現中只維護一個本地地圖。DSO內存塊數較少,但占用的內存超過100MB,增長緩慢。DSO的一個問題是當幀數小于500時,處理時間急劇增加,另外,關鍵幀的處理時間甚至更長。ORBSLAM占用的CPU資源最多,計算時間穩定,但由于bundle調整使用了G2O庫,沒有采用增量優化方法,內存利用率增長較快,分配和釋放了大量內存塊。里程表軌跡評估如圖5所示。如我們所見,SVO速度更快,但漂移更大,而ORBSLAM在絕對位姿誤差(APE)方面達到最佳精度。也提供了相對位姿誤差(RPE),但由于圖中,補充材料中提供了更多的實驗結果。由于集成評估是一個可插入的插件應用程序,因此可以使用更多的評估指標(如pointcloud的精度)重新實現它。
Conclusions
本文介紹了一種新型通用的SLAM平臺GSLAM,它提供了從開發、評估到應用的支持。常用的工具包由插件表單提供,用戶也可以方便地開發自己的模塊。為了使平臺易于使用,我們只允許接口依賴于C++ 11。此外,還提供了Python和JavaScript接口,以便更好地集成傳統的和基于深度學習的SLAM或分布式web。
總結
以上是生活随笔為你收集整理的SLAM的通用框架:GSLAM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker_Swarm集群系统
- 下一篇: 图像拼接技术