[LIDAR-SLAM] Iterative Closest Point (ICP)簡單實現
迭代最近點演算法(ICP)演算法是Lidar SLAM中常用的點雲配準方法,可以求解兩組點雲之間的相對位姿。
本文對最基本的ICP演算法進行了介紹和簡單實現,並集成為一個簡化版的Odometry。
1 原理
1.1 問題:給定兩組點雲
求解兩組點雲之間的先對位姿 。問題的特殊性在於:1)兩組點雲之間的匹配關係是未知的;2)兩組點雲中點的數量不相同。
下面,首先給出已知匹配,且點個數相同的求解方方法。之後再給出未知匹配,且點數量不同的情況的求解方法:ICP。
1.2 已知匹配的解法
此時,兩組點雲是已經匹配好的(通過下標一一對應),且數量相等( )。可通過最小化下式求解
這個式子可以獲得一個解析解,具體步驟如下。
step 1. 去掉兩組點雲的質心
兩組點雲的質心分別為 。
兩組點雲去掉質心後的坐標為
step 2. 計算
step 3. 計算旋轉矩陣R
對 進行SVD分解,有 。當 滿秩的時候,有唯一解
step 4. 計算平移t
平移為
1.3 ICP求解方法
實際情況下,點雲之間的匹配關係是不知道,且點的數量不相等的。為此,ICP演算法採用迭代求解的方法。具體的迭代如下步驟。
step 1. 從兩組點雲中選擇匹配的點對,形成匹配兩組點雲;
step 2. 利用1.2節中的方法求解 ;step 3. 如果相對於上一次迭代誤差 的減少量 || 超過最大迭代次數 ||結束迭代。否則以本次迭代為初值繼續迭代。
第2、3步都比較簡單,關鍵的是第一步,如何構建匹配點。最基本的做法是對於 中的一個點 選擇 中與其歐式距離最近的點最為匹配點(可以用KD-Tree加速)。如此,對於 中的每一個點,都可以在 中找到一個對應點。這樣就形成了兩組已知匹配的點雲,並且點數相等。
還有一個問題,有一些匹配時錯誤的,這些錯誤的匹配的表現是匹配點之間的距離過大。一般會用一個N倍平均距離的閾值 去掉那些錯誤匹配。這裡的平均閾值可以使用上一次迭代的值。
2 實現
全部實現,請見
ydsf16/lidar_slam我們利用TUM提供的RGB-D數據進行測試,只使用了其中的Depth數據生成點雲。通過ICP計算相鄰兩幀之間的位姿變換,串接形成一個Odometry。利用rgbd_dataset_freiburg1_xyz這組數據形成的軌跡如下。