GSLAM | 一個通用的SLAM架構和基準
本文經自動駕駛之心公眾號授權轉載,轉載請聯系出處。
突然發現了一篇19年的論文
GSLAM:A General SLAM Framework and Benchmark
開源代碼:https://github.com/zdzhaoyong/GSLAM
直接上全文,感受這項工作的質量吧~
1 摘要
SLAM技術最近取得了許多成功,并吸引了高科技公司的關注。然而,如何同一現有或新興算法的界面,一級有效地進行關于速度、穩健性和可移植性的基準測試仍然是問題。本文,提出了一個名為GSLAM的新型SLAM平臺,它不僅提供評估功能,還為研究人員提供了快速開發自己的SLAM系統的有用工具。GSLAM的核心貢獻是一個通用的。跨平臺的、完全開源的SLAM接口,旨在處理輸入數據集、SLAM實現、可視化和應用程序的統一框架中的交互。通過這個平臺,用戶可以以插件形式實現自己的功能,以提高SLAM的性能,并進一步將SLAM的應用推向實際應用。
2 介紹
從上世紀80年代以來,同時定位與地圖構建(SLAM)一直是計算機視覺和機器人領域的熱門研究主題。SLAM為許多需要實時導航的應用提供了基本功能,如機器人技術、無人機(UAVs)、自動駕駛、以及虛擬現實和增強現實。近來年,SLAM技術得到了迅速發展,提出了各種SLAM系統,包括單目SLAM系統(基于特征點,直接和半直接方法)、多傳感器SLAM系統(RGBD、雙目和慣性輔助的方法)以及基于學習的SLAM系統(有監督和無監督方法)。
然而,隨著SLAM技術的迅速發展,幾乎所有的研究人員都集中精力于自己的SLAM系統的理論和實施,這使得難以交流思想,并且不容易實現遷移到其他系統。這妨礙了SLAM技術快速應用于各種行業領域。此外,目前存在許多SLAM系統的不同實現版本,如何有效地進行速度、穩健性和可移植性的基準測試仍然是一個問題。最近,Nardi等人和Bodin等人提出了統一的SLAM基準測試系統,以進行定量、可比較和可驗證的實驗研究,也探究各種SLAM系統之間的權衡。通過這些系統,可以使用數據集和度量評估模塊輕松進行評估實驗。
由于現有的系統僅提供評估基準,該論文認為有可能建立一個平臺,以服務SLAM算法的整個生命周期,包括開發、評估和應用階段。此外,近年來深度學習基礎的SLAM已取得顯著進展,因此有必要創建一個平臺,不僅支持C++,還支持Python,以更好地支持幾何和深度學習基礎的SLAM系統的集成。因此,在本文中,介紹了一個新型的SLAM平臺,不僅提供評估功能,還為研究人員提供了有用的工具,以快速開發他們自己的SLAM系統。通過這個平臺,常用功能以插件形式提供,因此用戶可以直接使用它們或創建自己的功能以實現更好的性能。希望這個平臺能進一步推動SLAM系統的實際應用。總而言之,本文的主要貢獻如下:
- 本文提出了一個通用的、跨平臺的、完全開源的SLAM平臺,旨在用于研究和商業用途,超越了以往的基準測試系統。SLAM接口由多個輕量級、無依賴的頭文件組成,這使得在統一框架中以插件形式與不同數據集、SLAM算法和應用進行交互變得容易。此外,還提供了JavaScript和Python,以支持基于Web和深度學習的SLAM應用。
- 提出的GSLAM平臺中,引入了三個經過優化的模塊作為實用工具類,包括Estimator、Optimizer和Vocabulary。Estimator旨在提供一組封閉形式的求解器,涵蓋所有情況,具有強大的樣本一致性(RANSAC);Optimizer旨在提供流行的非線性SLM問題的統一接口;Vocabulary旨在提供高效且可移植的詞袋實現,用于多線程和SIMD優化的地點識別。
- 受益于上述接口,該工作在一個統一的框架中實現并評估了現有數據集、SLAM實現和可視化應用的插件,未來出現的基準測試或應用也可以輕松地進行進一步集成。
下面首先介紹GSLAM框架的接口,并解釋GSLAM的工作原理。其次,介紹三個實用組件,即Estimator, Optimizer和Vocabulary。然后,使用幾個典型的公共數據集,使用GSLAM框架來評估不同流行的SLAM實現。最后,總結這些工作,并展望未來的研究方向。
3 相關工作
Simultaneous Localization And Mapping
SLAM技術用于在未知環境中構建地圖,并將傳感器在地圖中進行定位,主要側重于實時操作。早期的SLAM主要基于擴展卡爾曼濾波(EKF)。將6自由度的運動參數和3D地標以概率方式表示為單一狀態向量。經典EKF的復雜性隨著地標數量的增加呈二次增長,限制了其可拓展性。近年來,SLAM技術得到了快速發展,提出了許多單目視覺SLAM系統,包括基于特征點、直接法和半直接方法。然而,單目SLAM系統缺乏尺度信息,無法處理純旋轉情況,因此一些其他多傳感器SLAM系統,包括RGBD,雙目和慣性輔助方法出現,以提高魯棒性和精度。
盡管提出了大量的SLAM系統,但在統一這些算法的接口方面幾乎沒有什么工作,也沒有對它們的性能進行全面的比較。此外,這些SLAM算法的實現通常以獨立的可執行文件的形式發布,而不是以庫的形式,而且往往不符合任何標準結構。
最近,基于深度學習的有監督和無監督的視覺里程計(VO)與傳統的基于幾何的方法相比,提出了新穎的思路。但是,進一步優化多個關鍵幀的一致性仍然不容易。GSLAM提供的工具可以幫助獲得更好的全局一致性。通過該框架,更容易可視化或評估結果,并進一步應用于各種行業領域。
Computer Vision and Robotics Platform
在機器人技術和計算機領域,機器人系統(ROS)提供了節點之間非常便捷的通信方式,受到大多數機器人研究人員的青睞。許多SLAM實現提供了ROS包裝器,以訂閱傳感器數據并發布可視化結果。但它并未統一SLAM實現的輸入和輸出,難以進一步評估不同SLAM系統。
受ROS消息架構的啟發,GSLAM實現了一個類似的進程間通信實用類,稱為Messenger。這為替代SLAM實現內部的ROS提供了另一種選擇,并保持了兼容性,也就是說,該框架內支持所有ROS定義的消息,并自然地實現了ROS包裝器。由于采用了進程內設計,消息傳遞時沒有序列化和數據傳輸,消息可以無延遲和額外成本地發送。與此同時,消息的有效載荷不僅限于ROS定義的消息,還可以是任何可復制的數據結構。此外,不僅提供評估功能,還為研究人員提供了有用的工具,以快速開發和集成他們自己的SLAM算法。
SLAM Benchmarks
目前存在幾種SLAM基準測試系統,包括KITTI基準測試、TUM RGB-D基準測試和ICL-NUIM RGB-D基準數據集,這些系統僅提供評估功能。此外,SLAMBench2將這些基準測試擴展為算法和數據集,要求用戶將已發布的實現與SLAMBench2兼容,以進行評估,這難以擴展到更多應用領域。與這些系統不同,本文提出的GSLAM平臺提供了一個解決方案,可為SLAM實現的整個生命周期提供服務,從開發、評估到應用。為研究人員提供了有用的工具,以快速開發他們自己的SLAM系統,并進一步基于統一接口開發可視化、評估和應用程序。
4 通用SLAM架構
Framework Overview
GSLAM的框架如圖所示。總的來說,接口旨在處理三個部分的交互。
- 處理SLAM實現的輸入。運行SLAM時,需要傳感器數據和一些參數。對于GSLAM,使用Svar類進行參數配置和命令處理。所有SLAM實現所需的傳感器數據都由Dataset實現提供,并使用Messenger進行傳輸。GSLAM實現了幾個流行的視覺SLAM數據集,用于可以自由實現自己的數據集插件。
- SLAM實現。GSLAM將每個實現視為插件庫。開發人員可以非常容易地基于GSLAM接口和實用類設計一個SLAM實現。開發人員還可以使用接口包裝實現,而無需引入額外的依賴。用戶可以專注于核心算法的開發,而無需關心SLAM實現外部需要處理的輸入和輸出。
- 可視化部分或使用SLAM結果的應用。在SLAM實現處理輸入幀后,用戶可能希望展示或利用結果。為了通用性,SLAM結果應以標準格式發布。默認情況下,GSLAM使用Qt進行可視化,但用戶可以自由實現自定義的可視化工具,并添加應用插件,如評估應用程序。
該框架被設計為與各種不同類型的SLAM實現兼容,包括但不限于單目、雙目、RGBD和多攝像頭視覺慣性里程計與多傳感器融合。現代深度學習平臺和開發人員更喜歡使用Python進行編碼,因此GSLAM提供了Python綁定,開發人員能夠使用Python實現SLAM,并使用GSLAM調用它,或者使用Python調用基于C++的SLAM實現。此外,還支持JavaScript用于基于Web的用途。
Basic Interface Classes
SLAM接口通常使用的一些數據結構包括參數設置/讀取、圖像格式、姿態變換、相機模型和地圖數據結構。以下是一些基本接口類的簡要介紹。
Paramter Setting
GSLAM使用一個小巧的參數解析和參數設置類Svar,它僅包含一個頭文件,依賴于C++11,并具有以下特點:
a.參數解析和配置加載以及幫助信息。類似于流行的參數解析工具,如Google gflags,變量配置可以從命令行參數、文件和系統環境中加載。用戶還可以定義不同類型的參數,并提供介紹信息,這些信息將顯示在幫助文檔中。
b.一個小型腳本語言,支持變量、函數和條件語句,使配置文件更加強大。
c.線程安全的變量綁定和共享。建議將使用頻率非常高的變量綁定到指針或引用上,這不僅提供了高效性,還提供了便利性。
d,簡單的函數定義和從C++或純腳本進行調用。命令和函數之間的綁定有助于開發人員解耦文件依賴關系。
e.支持樹形結構表示,這意味著可以輕松地使用XML、JSON和YAML格式加載或保存配置。
Intra-Process Messaging
由于ROS提供了一個非常便捷的節點間通信方式,受到大多數機器人研究人員的青睞。受到ROS2消息架構的啟發,GSLAM實現了一個類似的進程間通信實用類,稱為Messenger。這為替代SLAM實現內部的ROS提供了另一種選擇,并保持了兼容性。由于采用了進程間設計,Messenger能夠發布和訂閱任何類,而無需額外成本。以下是更多功能的介紹:
a.該接口采用了ROS的風格,對用來說容易上手。而且支持所有ROS定義的消息,這意味著只需要很少的工作就能替代原來的ROS消息傳遞系統。
b.由于沒有序列化和數據傳輸,消息可以無延遲和額外成本地發送。與此同時,消息的有效載荷不僅限于ROS定義的消息,還支持任何可復制的數據結構。
c.源代碼只包括基于C++11的頭文件,沒有額外的依賴,使其具有可移植性。
d.API是線程安全的,并在列隊大小大于零時支持多線程條件通知。在發布者和訂閱者相互連接之前,會對主題名稱和RTTI數據結構進行檢查,以確保正確地調用。
3D Transforamtion
對于旋轉部分,有幾種表示方式可供選擇,包括矩陣、歐拉角、單位四元數和李代數so(3)。對于給定的變換,可以使用其中任何一種來表示,并可以相互轉換。但是,當考慮多個變換和流形優化時,需要密切關注所選擇的表示方式。矩陣表示法使用9個參數進行過度參數化,而旋轉只有3個自由度(DOF)。歐拉角表示使用3個變量,易于理解,但面臨著萬向鎖的問題,而且不方便進行多重變換。單位四元數是執行多次旋轉的最高效方式,而李代數則是執行流行優化的常見表示方法。
類似地,定義了剛體和相似性變換的李代數se(3)和sim(3)。GSLAM使用四元數來表示旋轉部分,并提供了一種表示形式轉換為另一種表示形式的函數。表格1展示了變換實現,并于另外三種流形的實現(Sophus, TooN和Ceres)進行了比較。由于Ceres實現使用角軸表示,因此不需要旋轉的指數和對數。如表格所示,GSLAM的實現性能更佳,因為它使用四元數并具有更好的優化,而TooN使用矩陣實現,在點變換方面性能更好。
Image format
圖像數據的存儲和傳輸是視覺SLAM中最重要的功能之一。為了提高效率和便利性,GSLAM使用了一個數據結構GImage,它與cv::Mat兼容。它具有智能指針計數器,以確保內存安全釋放,并且可以在不進行內存復制的情況下輕松傳輸。數據指針對齊,以便更容易進行單指令多數據(SIMD)加速。用戶可以在GImage和cv::Mat之間無縫、安全地進行轉換,而無需進行內存復制。
Camera Models
由于SLAM可能包含由于制造不完美而引起的徑向和切向畸變,或者是由魚眼或全景相機捕捉的圖像,因此提出了不同的相機模型來描述投影。GSLAM提供了包括OpenCV(ORB-SLAM使用)、ATAN(PTAM使用)和OCamCalib(MultiCol-SLAM使用)在內的實現。用戶也可以輕松繼承這些類并實現其他相機模型,如Kannala-Brandt和等距全景模型。
Map Data Structure
對于SLAM實現,其目標是實時定位并生成地圖。GSLAM建議使用一個統一的地圖數據結構,有多個地圖幀和地圖點組成。這個數據結構適用于大多數已有的視覺SLAM系統,包括基于特征或直接方法。
地圖幀用于表示不同時間的位置狀態,包括由傳感器捕捉的各種信息或估算結果,包括IMU或GPS原始數據、深度信息和相機模型。SLAM實現估算它們之間的關系,它們之間的連接形成了一個姿勢圖。
地圖點用于表示由幀觀察到的環境,通常由基于特征的方法使用。但是,一個地圖點不僅可以表示一個關鍵點,還可以表示一個GCP(地面控制點)、邊緣線或3D對象。它們與地圖幀的對應關系形成了一個觀察圖,通常被稱為捆綁圖。
5 SLAM實現工具
為了更容易實現一個SLAM系統,GSLAM提供了一個實用類。本節將簡要介紹三個經過優化的模塊,分別是Estimator, Optimizer和Vocabulary。
Estimator
純幾何計算仍然是一個需要強大和準確的實時解決方案的基本問題。傳統的視覺SLAM算法或現代的視覺慣性解決方案都依賴與幾何視覺算法來進行初始化、重定位和回環閉合。OpenCV提供了多個幾何算法,Kneip提供了一個用于幾何視覺的工具箱OpenGV,該工具箱僅限于相機姿態計算。GSLAM的Estimator旨在提供一系列包括所有情況的封閉形式解算器,并使用了魯棒的隨機采樣一致性方法(RANSAC)。
表2列出了Estimator支持的算法。根據給定的觀測數據,它們被分成三類。2D-2D匹配用于估計極線或單應約束,并且可以從中分解相對姿態。2D-3D對應于估計單目或多攝像頭系統的中心或非中心絕對位姿,這是著名的PnP問題。還支持3D幾何函數,如平面擬合,以及估算兩個點云的SIM變換。大多數算法都依賴與開源線性代數庫Eigen,它是一個僅包含頭文件的庫,并且適用于大多數平臺。
Optimizer
非線性優化是現代幾何SLAM系統的核心部分。由于Hessian矩陣的高緯度和稀疏性,圖結構被用來建模SLAM的復雜估計問題。提出了幾種框架,包括Ceres、G2O和GTSAM,用于解決一般的圖優化問題。這些框架在不同的SLAM系統中廣泛使用。ORB-SLAM、SVO使用G2O進行BA和位姿圖優化。OKVIS、VINS使用Ceres進行帶IMU因素的圖優化,滑動窗口用于控制計算復雜性。Forster等人提出了一種基于SVO的視覺初始化方法,并使用GTSAM實現后端。
GSLAM的Optimizer旨在為大多數非線性SLAM問題提供一個統一的接口,如PnP求解器,BA,姿態圖優化。基于Ceres庫實現了這些問題的通用插件。對于特定問題,如BA,還可以提供一些更高效的實現,如PBA和ICE-BA作為插件。使用優化器工具,開發人員可以使用統一的接口訪問不同的實現,特別是用于基于深度學習的SLAM系統。
Vocabulary
地點識別是SLAM系統中最重要的部分之一,用于重新定位和回環檢測。詞袋(BoW)方法在SLAM系統中廣泛使用,因為它高效且性能出色。FabMap提出了一種基于外觀的地點識別的概率方法,該方法用于RSLAM、LSD-SLAM等系統。由于它使用了像SIFT和SURF這樣的浮點描述子,DBoW2為訓練和檢測構建了一個詞匯樹,支持二進制和浮點描述子。Refael提出了DBoW2的兩個改進版本,DBoW3和FBoW,它們簡化了接口并加快了訓練和加載速度。之后,ORB-SLAM采用了ORB描述子,并使用DBoW2進行回環檢測、重定位和快速匹配。隨后,一系列SLAM系統,如ORB-SLAM2、VINS-Mono和LDSO,使用DBoW3進行回環檢測。它已經成為實現SLAM系統地點識別的最流行工具。
受上述工作的啟發,GSLAM對DBoW3詞匯進行了僅包含頭文件的實現,具有以下特點:
- 去除了對OpenCV的依賴,所有函數都在一個僅依賴C++11的頭文件中實現。
- 結合DBoW2/3和FBoW的優點,具有極快的速度和易于使用。提供了類似于DBoW3的接口,并使用SSE和AVX指令加速了二進制和浮點描述子。
- 改進了內存使用和加速了加載、保存或訓練詞匯以及從圖像特征到BoW向量轉換的速度。
表3展示了四個詞袋庫的比較。在實驗中,每個父節點有10個子節點,ORB特征檢測使用ORB-SLAM,SIFT檢測使用SiftGPU。實現結果中使用了ORB詞匯,分別有4級和6級,以及一個SIFT詞匯。FBoW和GSLAM都使用多線程進行詞匯訓練。GSLAM的實現在幾乎所有項目中的表現都優于其他實現,包括加載和保存詞匯、訓練新詞匯、將描述符列表轉換為用于地點識別的BoW向量和用于快速特征匹配的特征向量。此外GSLAM實現使用更少的內存,并分配了更少的動態內存塊,因為DBoW2需要大量內存的主要原因是碎片問題。
6 SLAM評估基準
現有的基準需要用戶下載測試數據集并上傳結果以進行精確性評估,這不足以統一運行環境并評估公平的性能比較。得益于GSLAM的統一接口,SLAM系統的評估變得更加優雅。在GSLAM的幫助下,開發人員只需上傳SLAM插件,便可以在一個使用固定資源的docker化環境中進行速度、計算成本和準確性的各種評估。在本節中,將首先介紹一些數據集和已實現的SLAM插件。然后,對速度、準確性、內存和CPU使用率進行三個代表SLAM實現的評估。此評估旨在展示具有不同SLAM插件的統一SLAM基準實現的可能性。
Datasets
運行SLAM系統通常需要傳感器數據流和相應的配置。為了讓開發人員專注于核心SLAM插件的開發,GSLAM提供了一個標準的數據集接口,開發人員不需要關心SLAM的輸入。通過不同的數據集插件,提供了在線傳感器輸入和離線數據,正確地插件會根據給定的數據集路徑后綴動態加載。數據集的實現應該提供所有請求的傳感器流以及相關配置,因此不需要為不同的數據集進行額外設置。所有不同的傳感器流通過Messenger發布,使用標準的主題名稱和數據格式。
GSLAM已經實現了幾個流行的視覺SLAM數據集插件,如表4所示。用戶也可以非常容易地基于僅包含頭文件的GSLAM核心來實現一個數據集插件,并將其發布為插件并與應用程序一起進行編譯。
SLAM Implementations
圖2展示了一些使用內置Qt可視化器運行的開源SLAM和SfM插件的屏幕截圖。該框架支持不同體系結構的SLAM系統,包括直接法、半直接法、基于特征的方法,甚至SfM方法。DSO實現需要發布結果,例如點云、相機姿勢、軌跡和姿態圖,以便像基于ROS的實現一樣進行可視化。用戶可以使用統一的框架訪問不同的SLAM插件,根據C++、Python和Node-JS接口開發基于SLAM的應用程序非常方便。由于許多研究人員在開發中使用ROS,GSLAM還提供了ROS可視化插件,以無縫傳輸ROS定義的消息,并使開發人員可以利用Rviz進行顯示或繼續開發其他基于ROS的應用程序。
Evaluation
由于大多數現有的基準只提供數據集,或者沒有groundtruth供用戶自行進行評估,GSLAM提供了一個內置插件和一些腳本工具,用于計算性能和精度評估。
論文中使用TUM RGBD數據集中的序列nostructure-texture-near-withloop來演示評估的執行情況。接下來的實驗采用三個開源的單目SLAM插件DSO, SVO和ORB-SLAM。在所有實驗中,使用一臺搭載i7-6700 CPU、GTX 1060 GPU和16GB RAM的計算機,運行64位Ubuntu 16.04。
計算性能評估包括內存使用、分配內存塊數量、CPU使用率以及統計每幀所用的時間,如圖3所示。結果表明,SVO使用的內存和CPU資源最少,并獲得了最快的速度。而且由于SVO只是一個視覺里程計,在實現內部只維護了一個本地地圖,所以成本保持穩定。DSO分配的內存塊數較少,但消耗了100MB以上的內存,且增長較慢。DSO的一個問題是當幀數低于500時,處理時間會急劇增加,此外,關鍵幀的處理時間甚至更長。ORB-SLAM使用了最多的CPU資源,計算時間穩定,但內存使用快速增加,并且它分配和釋放了大量的內存塊,因為其BA使用了G2O庫,沒有使用增量優化方法。
圖4展示了里程計軌跡的評估結果。如圖所示,SVO速度較快,但漂移較大,而ORBSLAM在絕對姿態誤差(APE)方面達到了最高的精度。由于綜合評估是一個可插拔的插件應用程序,可以重新實施更多的評估指標,例如點云的精度。
7 總結
本文介紹了一個名為GSLAM的新型通用SLAM平臺,該平臺提出了從開發、評估到應用的支持。通過這個平臺,常用的工具包以插件形式提供,用戶還可以輕松地開發自己的模塊。為了使平臺易于使用,使接口只依賴于C++11。此外,還提供了Python和JavaScript接口,以更好地集成傳統SLAM和基于深度學習的SLAM,或在Web上進行分布式操作。
在接下來的研究中,會提供更多的SLAM實現、文檔和演示代碼,以便學習和使用。此外,還將提供傳統SLAM和基于深度學習的SLAM的集成,以進一步探索SLAM系統的未知可能性。
這項工作的主頁如下:
GSLAM: Main Page
感覺是可學習SLAM各部分原理的框架~
原文鏈接:https://mp.weixin.qq.com/s/PCxhqhK3t1soN5FI0w9NFw