突然發現了一篇19年的論文
GSLAM:A General SLAM Framework and Benchmark
開源程式碼:https://github.com/zdzhaoyong/GSLAM
#直接上全文,感受這項工作的品質吧~
SLAM技術最近取得了許多成功,並吸引了高科技公司的關注。然而,如何同一現有或新興演算法的介面,一級有效地進行關於速度、穩健性和可移植性的基準測試仍然是問題。本文,提出了一個名為GSLAM的新型SLAM平台,它不僅提供評估功能,也為研究人員提供了快速開發自己的SLAM系統的有用工具。 GSLAM的核心貢獻是一個通用的。跨平台的、完全開源的SLAM接口,旨在處理輸入資料集、SLAM實現、可視化和應用程式的統一框架中的互動。透過這個平台,使用者可以以插件形式實現自己的功能,以提高SLAM的效能,並進一步將SLAM的應用推向實際應用。
自1980年代以來,同時定位與地圖建構(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系統的實際應用。總而言之,本文的主要貢獻如下:
下面首先介紹GSLAM框架的接口,並解釋GSLAM的工作原理。其次,介紹三個實用元件,即Estimator, Optimizer和Vocabulary。然後,使用幾個典型的公共資料集,使用GSLAM框架來評估不同流行的SLAM實作。最後,總結這些工作,並展望未來的研究方向。
SLAM技術用於在未知環境中建立地圖,並將感測器在地圖中進行定位,主要側重於即時操作。早期的SLAM主要基於擴展卡爾曼濾波(EKF)。將6自由度的運動參數和3D地標以機率方式表示為單一狀態向量。經典EKF的複雜度隨著地標數量的增加呈二次增長,限制了其可拓展性。近年來,SLAM技術已經快速發展,提出了許多單目視覺SLAM系統,包括基於特徵點、直接法和半直接方法。然而,單目SLAM系統缺乏尺度訊息,無法處理純旋轉情況,因此一些其他多感測器SLAM系統,包括RGBD,雙眼和慣性輔助方法出現,以提高穩健性和精度。
儘管提出了大量的SLAM系統,但在統一這些演算法的介面方面幾乎沒有工作,也沒有對它們的性能進行全面的比較。此外,這些SLAM演算法的實作通常以獨立的可執行檔的形式發布,而不是以庫的形式,而且往往不符合任何標準結構。
最近,基於深度學習的有監督和無監督的視覺里程計(VO)與傳統的基於幾何的方法相比,提出了新穎的思路。但是,進一步優化多個關鍵影格的一致性仍然不容易。 GSLAM提供的工具可以幫助獲得更好的全域一致性。透過該框架,更容易可視化或評估結果,並進一步應用於各種行業領域。
在機器人技術和電腦領域,機器人系統(ROS)提供了節點之間非常便捷的通訊方式,受到大多數機器人研究人員的青睞。許多SLAM實作提供了ROS包裝器,以訂閱感測器資料並發布視覺化結果。但它並未統一SLAM實現的輸入與輸出,難以進一步評估不同SLAM系統。
受ROS訊息架構的啟發,GSLAM實作了一個類似的進程間通訊實用類,稱為Messenger。這為替代SLAM實現內部的ROS提供了另一種選擇,並保持了相容性,也就是說,該框架內支援所有ROS定義的訊息,並自然地實現了ROS包裝器。由於採用了進程內設計,訊息傳遞時沒有序列化和資料傳輸,訊息可以無延遲和額外成本地發送。同時,訊息的有效載荷不僅限於ROS定義的訊息,還可以是任何可複製的資料結構。此外,不僅提供評估功能,還為研究人員提供了有用的工具,以快速開發和整合自己的SLAM演算法。
目前有幾個SLAM基準測試系統,包括KITTI基準測試、TUM RGB-D基準測試和ICL-NUIM RGB-D基準資料集,這些系統僅提供評估功能。此外,SLAMBench2將這些基準測試擴展為演算法和資料集,要求使用者將已發布的實作與SLAMBench2相容,以進行評估,這難以擴展到更多應用領域。與這些系統不同,本文提出的GSLAM平台提供了一個解決方案,可為SLAM實現的整個生命週期提供服務,從開發、評估到應用。為研究人員提供了有用的工具,以快速開發自己的SLAM系統,並進一步基於統一介面開發視覺化、評估和應用程式。
GSLAM的架構如圖所示。總的來說,介面旨在處理三個部分的互動。
該框架被設計為與各種不同類型的SLAM實現相容,包括但不限於單目、雙眼、RGBD和多相機視覺慣性里程計與多感測器融合。現代深度學習平台和開發人員更喜歡使用Python進行編碼,因此GSLAM提供了Python綁定,開發人員能夠使用Python實現SLAM,並使用GSLAM呼叫它,或使用Python呼叫基於C 的SLAM實作。此外,也支援JavaScript用於基於Web的用途。
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物件。它們與地圖幀的對應關係形成了一個觀察圖,通常被稱為捆綁圖。
為了更容易實作一個SLAM系統,GSLAM提供了一個實用類別。本節將簡單介紹三個經過最佳化的模組,分別是Estimator, Optimizer和Vocabulary。
純幾何計算仍然是需要強大且準確的即時解決方案的基本問題。傳統的視覺SLAM演算法或現代的視覺慣性解決方案都依賴幾何視覺演算法來進行初始化、重定位和回環閉合。 OpenCV提供了多個幾何演算法,Kneip提供了一個用於幾何視覺的工具箱OpenGV,該工具箱僅限於相機姿態計算。 GSLAM的Estimator旨在提供一系列包含所有情況的封閉形式解算器,並使用了穩健的隨機取樣一致性方法(RANSAC)。
表2列出了Estimator支援的演算法。根據給定的觀測數據,它們被分成三類。 2D-2D匹配用於估計極線或單應約束,並且可以從中分解相對姿態。 2D-3D對應於估計單目或多攝影機系統的中心或非中心絕對位姿,這是著名的PnP問題。也支援3D幾何函數,如平面擬合,以及估算兩個點雲的SIM變換。大多數演算法都依賴與開源線性代數庫Eigen,它是一個僅包含頭文件的庫,並且適用於大多數平台。
非線性最佳化是現代幾何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系統。
地點辨識是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詞彙進行了僅包含頭檔的實現,具有以下特點:
表3展示了四個詞袋庫的比較。在實驗中,每個父節點有10個子節點,ORB特徵偵測使用ORB-SLAM,SIFT偵測使用SiftGPU。實現結果中使用了ORB詞彙,分別有4級和6級,以及一個SIFT詞彙。 FBoW和GSLAM都使用多執行緒進行詞彙訓練。 GSLAM的實現在幾乎所有項目中的表現都優於其他實現,包括載入和保存詞彙、訓練新詞彙、將描述符列表轉換為用於地點識別的BoW向量和用於快速特徵匹配的特徵向量。此外GSLAM實現使用更少的內存,並分配了更少的動態內存塊,因為DBoW2需要大量內存的主要原因是碎片問題。
現有的基準需要使用者下載測試資料集並上傳結果以進行精確性評估,這不足以統一運行環境並評估公平的性能比較。得益於GSLAM的統一接口,SLAM系統的評估變得更加優雅。在GSLAM的幫助下,開發人員只需上傳SLAM插件,便可以在一個使用固定資源的docker化環境中進行速度、運算成本和準確性的各種評估。在本節中,將首先介紹一些資料集和已實現的SLAM插件。然後,對速度、準確性、記憶體和CPU使用率進行三個代表SLAM實現的評估。此評估旨在展示具有不同SLAM插件的統一SLAM基準實現的可能性。
運行SLAM系統通常需要感測器資料流和對應的配置。為了讓開發人員專注於核心SLAM插件的開發,GSLAM提供了一個標準的資料集接口,開發人員不需要關心SLAM的輸入。透過不同的數據集插件,提供了線上感測器輸入和離線數據,正確地插件會根據給定的數據集路徑後綴動態載入。資料集的實作應該提供所有請求的感測器流以及相關配置,因此不需要為不同的資料集進行額外設定。所有不同的感測器串流透過Messenger發布,使用標準的主題名稱和資料格式。
GSLAM已經實現了幾個流行的視覺SLAM資料集插件,如表4所示。用戶也可以非常輕鬆地基於僅包含頭檔的GSLAM核心來實現一個資料集插件,並將其發佈為插件並與應用程式一起進行編譯。
#圖2展示了一些使用內建Qt視覺化器運行的開源SLAM和SfM插件的螢幕截圖。此框架支援不同體系結構的SLAM系統,包括直接法、半直接法、基於特徵的方法,甚至SfM方法。 DSO實現需要發布結果,例如點雲、相機姿勢、軌跡和姿態圖,以便像基於ROS的實現一樣進行視覺化。使用者可以使用統一的框架存取不同的SLAM插件,根據C 、Python和Node-JS介面開發基於SLAM的應用程式非常方便。由於許多研究人員在開發中使用ROS,GSLAM還提供了ROS視覺化插件,以無縫傳輸ROS定義的訊息,並使開發人員可以利用Rviz進行顯示或繼續開發其他基於ROS的應用程式。
由於大多數現有的基準只提供資料集,或者沒有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)方面達到了最高的精度。由於綜合評估是一個可插拔的插件應用程序,可以重新實施更多的評估指標,例如點雲的精確度。
#本文介紹了一個名為GSLAM的新通用SLAM平台,該平台提出了從開發、評估到應用的支持。透過這個平台,常用的工具包以插件形式提供,使用者還可以輕鬆地開發自己的模組。為了使平台易於使用,使介面只依賴C 11。此外,還提供了Python和JavaScript接口,以更好地整合傳統SLAM和基於深度學習的SLAM,或在Web上進行分散式操作。
在接下來的研究中,會提供更多的SLAM實作、文件和簡報程式碼,以便學習和使用。此外,還將提供傳統SLAM和基於深度學習的SLAM的集成,以進一步探索SLAM系統的未知可能性。
這項工作的首頁如下:
GSLAM: Main Page
感覺是可學習SLAM各部分原理的框架~
原文連結:https://mp.weixin.qq.com/s/PCxhqhK3t1soN5FI0w9NFw
以上是GSLAM | 一個通用的SLAM架構和基準的詳細內容。更多資訊請關注PHP中文網其他相關文章!