天天看點

SLAM:使用G2O-ORB-SLAM(編譯)

前言:

         沒有新雪,看看自己所做的事情,有沒有前人做過。果然,EKF_SLAM的版本出現了Android版本的OpenEKFMonoSLAM, G2O-ORB SLAM也出現了VS2012版本。

一、SLAM 問題:

        機器人需要在自身位置不确定的條件下,在完全未知環境中建立地圖,同時利用地圖進行自主定位和導航。這就是移動機器人的同時定位與地圖建立(SLAM) 問題,最先是由Smith Self 和Cheeseman 在1988年提出來的,被認為是實作真正全自主移動機器人的關鍵。 由 Smith, R.C. and P. Cheeseman, 提出的論文:On the Representation and Estimation of Spatial Uncertainty. 《International Journal of Robotics Research》, 1986. 5(4): p. 56 -- 68. 以濾波的形式表示SLAM問題。

       随後的時間裡,Se, S., D. Lowe and J. Little,的論文: Mobile robot localization and mapping with uncertainty using scale-invariant visual landmarks. 《The international Journal of robotics Research》, 2002. 21(8): p. 735--758.中使用了卡爾曼濾波的方法。

       使用EKF的方法是一段時間内的SLAM主流方法。

       SLAM問題描述為:機器人在未知環境中從一個未知位置開始移動,在移動過程中根據位置估計和傳感器資料進行自身定位,同時建造增量式地圖。在SLAM中,機器人利用自身攜帶的傳感器識别未知環境中的特征标志,然後根據機器人與特征标志之間的相對位置和裡程計的讀數估計機器人和特征标志的全局坐标。這種線上的定位與地圖建立需要保持機器人與特征标志之間的詳細資訊。近幾年來,SLAM的研究取得了很大的進展,并已應用于各種不同的環境,如:室内環境、水下、室外環境。

二、圖計算的問題

         另外一條路徑:SLAM問題本質上是場景重建,主要方式是幀間比對建構三維場景,即建構增量式地圖。主要三維建構方法是BA ,直覺上可以使用的計算機科學算法為圖優化。

        直到21世紀初,卡爾曼濾波器仍在SLAM系統占據最主要的地位,Davison經典的單目SLAM:Divide and Conquer: EKF SLAM in O(n), Paz Lina M et al., 《IEEE Transaction on Robotics》, 2008即是用EKF做的。由于濾波器方法存儲n個路标要消耗n平方的空間,在計算量上有點難以控制。盡管08年有人提出分治法的濾波器能把複雜度弄到O(n) ,但實作手段比較複雜。

        後來,出現了基于圖優化的SLAM方法: Visual SLAM: Why filter? Strasdat et. al.,《 Image and Vision Computing》, 2012.,漸漸有取而代之的地位。根本原因是計算能力的提高,可以在圖優化的計算上達到要求。

       圖優化實際上是解一種非線性最小二乘問題,主要用于離線的slam優化,也有用在線上的方式的。 最小二乘解決的就是偏差全局最小的問題,再在原基礎量上疊加最小偏差量即為最優量。 圖優化将問題全部抽象成 node(點)與edge(邊)的問題。

       g2o:http://www.openslam.org/g2o.html,就是對圖優化問題的一個求解器。它原理上是一個通用的求解器,并不限定于某些SLAM問題。你可以用它來求SLAM,也可以用ICP, PnP以及其他你能想到的可以用圖來表達的優化問題。g2o是一個平台,你可以加入你自己的線性方程求解器,編寫自己的優化目标函數,确定更新的方式。g2o的作者說Guassian-Newton和Levenberg-Marquardt方法比較naive,但是g2o的本質就是這些算法的實作。事實上,g2o iSAM SPA和 sSPA等非線性優化算法隻是在非線性問題線性化時處理得不一樣,線上性化後要求解線性方程都是利用了已有的linear solver庫來求解,如 CSparse CHOLMOD PCG等,他們都需要依靠Eigen這個線性代數庫。

三、ORB_SLAM的方法

       ORB_SLAM:https://github.com/raulmur/ORB_SLAM 的創新點為使用了ORB特征,但主要建構地圖架構為圖優化,整個工程有用于建構地圖的g2o庫、用于回環檢測的DBoW2、用于點雲處理的PCL庫及第三方庫、以及用于圖像處理的ORB特征提取器和預處理算法等。

四、編譯問題

          可以直接使用工程檔案附帶的g2o的源代碼編譯,不需要其他的輔助編譯工作。

        源代碼出現了編譯問題。

        問題一:

               沒有仔細閱讀源代碼,發現工程自帶的G2O庫找不到使用的函數:

                    Optimizer.cpp使用的函數: g2o::EdgeSE3ProjectXYZ* e = new g2o::EdgeSE3ProjectXYZ();

                                 read()及write()函數都出現連結錯誤。

              使用最新的Git版本,仍然出現找不到函數這種連結錯誤。最後,終于發現問題,項目所帶的源代碼相對于工程是正确的,而Git最新版本進行了大量的修改,是以使用項目自帶的源代碼進行重新編譯。

               可以進行編譯并生成一些lib檔案,有一些編譯失敗,但不影響程式的運作。

        問題二:

               出現:error LNK2019: 無法解析的外部符号 __imp___  此種連結錯誤,修改方法為:                             所在的項目點右鍵,選擇“屬性” ->  “配置屬性”-> “C/C++”-> “預處理器”-> “預處理定義” 移除_DENUG或将 _DENUG改為 NDENUG

        項目可以運作了。

繼續閱讀