SLAM概念
SLAM (Simultaneous Localization and Mapping):同步定位與建圖。SLAM問題可以描述為: 機器人在未知環境中從一個未知位置開始移動,在移動過程中根據位置和地圖進行自身定位,同時在自身定位的基礎上建造增量式地圖,實現機器人的自主定位和導航。
假設你是《魯濱孫漂流記》中的主人公,你漂流到一個無人的荒島上時,你需要迅速熟悉周圍環境,尋找食物和水源,躲避野獸,那麼你就需要完成以下事情:
1. 用眼睛觀察周圍的地標,比如一座最高的山峰、一顆造型奇特的石頭、一棵參天大樹等等,並且記住這些地標的特徵——特徵提取。
2. 根據眼睛所觀察到的環境資訊,在腦海裡構建一個包含這些地標的地圖,對它們的方位有一定的掌握——三維建圖。
3. 你開始沿著一條小路往前走,本來在你前方的一棵樹現在變成了在你左側,雖然你和樹的相對位置變化了,但你知道在你左側的這棵樹就是剛才在你前方的那棵——特徵關聯。
4. 透過你和樹相對位置的變化,你可以得到自己的運動軌跡、方向、速度、當前運動狀態——運動估計。
5. 在你前進的過程中,你會遇到新的地標,比如一條小河、一個洞穴等,根據獲取到的它們的方位資訊,校正自己腦海裡的地圖模型——狀態更新。
6. 當你無意中走了很長一段路以後,與腦海中的地標進行匹配,檢視自己是否走回了原路——迴環檢測。
上述你做的這些事情,就是視覺SLAM的幾個重要組成部分。
特徵提取
基於特徵的SLAM演算法是透過兩幀間相關聯的特徵來計算兩幀間相機的相對位姿關係的,因此特徵提取的好壞直接影響SLAM演算法的表現。一個好的特徵應該具有良好的光照不變性和幾何不變性,即無論在何種光照條件和幾何投影下,同一特徵不能有較大變化,否則不同幀圖相間的特徵無法匹配會導致SLAM運動估計失敗。
常用的特徵包括點特徵、直線特徵、邊緣特徵等。由於直線特徵容易被遮擋,而邊緣直線的起始點可能不存在,因此絕大多數研究者使用點特徵,而將直線特徵在結構化環境中作為補充特徵。常用的點特徵一般分為角點特徵和塊特徵兩類。
角點特徵,即兩個或多個區域的交點,檢測速度快、易於計算、易於定位,但差異性較小。
塊特徵一般透過顏色、強度、紋理等資訊來劃分區域,特徵好、能穩定地檢測出來,但檢測速度慢。
一般而言,人工設計的特徵點需要擁有如下性質:
1. 可重複性:相同的特徵可以在不同的影象中找到。
2. 可區別性:不同的特徵有不同的表達。
3. 高效率:統一影象中,特徵點的數量應遠小於畫素的數量。
4. 本地性:特徵僅與一小片影象區域相關。
特徵關聯
兩張影象匹配最簡單的方法就是遍歷影象中所有的特徵點,計算距離,距離最小的作為匹配點。為了防止出現一對多的匹配結果,使用雙向匹配的方法來確定最終結果。但當特種點數量較多時,計算量會非常大,無法實用。
多解析度法:先在低解析度下進行搜尋,找到近似的最優匹配塊之後,再切換至高解析度下進行修正。運算複雜度較高。
透過在第二張影象上期望的區域中來搜尋可能的匹配點來提高匹配效率,期望區域可以透過三維點和建立運動模型的方式來得到,車輛的運動模型可以透過IMU、輪速計、GPS等獲取。
運動估計
SLAM問題的一項核心任務就是對相鄰兩幀影象的運動變化做出估計,從而得到整體的運動軌跡以及當前運動狀態。在得到對應的特徵後,求出兩者之間的空間位置的相對偏移量,得到的相對偏移量就是通常所指的運動向量,得到運動向量的過程被稱為運動估計。
根據使用的匹配特徵點維度的不同,大體上有三種估計方法。
1. 待計算的兩幀影象間的特徵點都用二維影象座標進行表示。
2. 待計算的兩幀影象間的特徵點都用三維影象座標進行表示。
3. 待計算的兩幀影象間,前一張用三維座標表示,後一張用二維座標表示。
因為前一幀影象的特徵點都已經被三角化,即已經知道了這些點的3D位置。那麼新的幀到來後,透過影象匹配就可以得到與那些3D點相對應的2D點,再根據這些3D-2D的對應關係,利用PnP演算法解出當前幀的相機位姿。PnP問題有多種求解方法,包括P3P、直接線性變換(DLT)、EPnP(Efficient PnP)、UPnP等等,而且它們在OpenCV中都有提供。因為三維座標需要根據前面多張照片及運動模型來獲取,不可避免地會引入額外的誤差。
後端最佳化
前端視覺里程計能給出一個短時間內的軌跡和地圖,但不可避免地誤差累積,這個地圖在長時間內是不準確的。要想構建一個尺度,規模更大的最佳化問題,以考慮長時間內的最優軌跡和地圖,這時後端最佳化就出現了。常用最佳化演算法對比如下:
演算法 |
缺點 |
優點 |
KF/EKF |
假設噪聲為高斯分佈,在高維狀態空間時計算效率較低,不適合大規模場景的地圖構建。 |
原理簡單,小場景下收斂性好。 |
PF |
會不可避免出現粒子退化現象,每個粒子需包含整張地圖資訊導致不適合大場景地圖構建。 |
將運動方程表示為一組粒子,通過蒙特卡羅方法求解,能夠處理非線性非高斯噪聲。 |
EM |
計算量大,不能用於大規模場景。 |
有效解決了資料關聯問題。 |
圖最佳化 |
對閉環檢測演算法的要求很嚴格。 |
出現多種圖最佳化框架,能夠有效解決濾波器演算法的缺陷,能用於大規模場景的地圖建立。 |
迴環檢測
迴環檢測,又稱閉環檢測,是指機器人識別曾到達某場景,使得地圖閉環的能力。說得簡單點,就是機器人在建圖的時候能意識到某個地方是“我”曾經來過的,然後把此刻生成的地圖與剛剛生成的地圖做匹配。
迴環檢測之所以能成為一個難點,是因為:如果迴環檢測成功,可以顯著地減小累積誤差,幫助機器人更精準、快速的進行避障導航工作。而錯誤的檢測結果可能使地圖變得很糟糕。因此,迴環檢測在大面積、大場景的地圖構建上是非常有必要的 。
常用的迴環檢測方法有圖最佳化、詞袋模型、相似度計算、決策樹、SVM等。