引言
掃描匹配(Scan Matching)是同步定位與地圖構建(SLAM)系統中的核心組件,它通過對齊連續的傳感器觀測數據來估計機器人的運動。本文將深入探討2D和3D SLAM中的各種掃描匹配算法,包括數學原理、實現細節以及實際應用中的性能對比,特別關注激光雷達SLAM中的典型方法。
一、掃描匹配數學基礎與核心原理
1.1 剛體變換的數學表示
掃描匹配的核心是求解剛體變換,在2D和3D空間中有不同的數學表示:
2D剛體變換:
由旋轉矩陣R和平移向量t組成,可表示為:
T = [ cos ? θ ? sin ? θ t x sin ? θ cos ? θ t y 0 0 1 ] T = \begin{bmatrix} \cos\theta & -\sin\theta & t_x \\ \sin\theta & \cos\theta & t_y \\ 0 & 0 & 1 \end{bmatrix} T= ?cosθsinθ0??sinθcosθ0?tx?ty?1? ?
其中 θ θ θ 為旋轉角度, ( t x , t y ) (t_x, t_y) (tx?,ty?) 為平移量。
3D剛體變換:
使用齊次坐標表示:
T = [ R 3 × 3 t 3 × 1 0 1 × 3 1 ] T = \begin{bmatrix} R_{3×3} & t_{3×1} \\ 0_{1×3} & 1 \end{bmatrix} T=[R3×3?01×3??t3×1?1?]
其中 R ∈ S O ( 3 ) R∈SO(3) R∈SO(3) 為旋轉矩陣, t ∈ R 3 t∈?3 t∈R3 為平移向量。
1.2 優化問題的構建
掃描匹配本質上是非線性最小二乘問題:
min ? T ∑ i ρ ( ∥ T ° p i ? q i ∥ 2 ) \min_T \sum_i \rho( \| T \circ p_i - q_i \|^2 ) Tmin?i∑?ρ(∥T°pi??qi?∥2)
其中 ρ ρ ρ 為魯棒核函數(如Huber、Tukey),用于抑制異常值影響。
目標函數線性化:
通過一階泰勒展開近似:
e ( x + Δ x ) ≈ e ( x ) + J ( x ) Δ x e(x+\Delta x) ≈ e(x) + J(x)\Delta x e(x+Δx)≈e(x)+J(x)Δx
其中 J J J 為雅可比矩陣, Δ x Δx Δx 為參數增量。
二、2D掃描匹配算法原理詳解
2.1 點到點ICP的數學推導
誤差函數:
對于單個點對 ( p i , q i ) (p_i, q_i) (pi?,qi?),誤差為:
e i = R p i + t ? q i e_i = R p_i + t - q_i ei?=Rpi?+t?qi?
雅可比矩陣計算:
對2D變換參數 x = [ t x , t y , θ ] T x=[t_x, t_y, θ]^T x=[tx?,ty?,θ]T 求導:
J i = ? e i ? x = [ 1 0 ? p i x sin ? θ ? p i y cos ? θ 0 1 p i x cos ? θ ? p i y sin ? θ ] J_i = \frac{\partial e_i}{\partial x} = \begin{bmatrix} 1 & 0 & -p_i^x \sin\theta - p_i^y \cos\theta \\ 0 & 1 & p_i^x \cos\theta - p_i^y \sin\theta \end{bmatrix} Ji?=?x?ei??=[10?01??pix?sinθ?piy?cosθpix?cosθ?piy?sinθ?]
高斯牛頓法更新:
通過求解正規方程獲得參數更新:
( J T J ) Δ x = ? J T e (J^T J) \Delta x = -J^T e (JTJ)Δx=?JTe
2.2 點到線ICP的幾何原理
線段表示:
目標掃描中的線段由兩點 q 1 q? q1?, q 2 q? q2? 確定,其直線方程為:
( q 2 ? q 1 ) × ( p ? q 1 ) = 0 (q?-q?) \times (p - q?) = 0 (q2??q1?)×(p?q1?)=0
距離計算:
點 p p p 到線段的距離:
d = ∣ ( q 2 ? q 1 ) × ( p ? q 1 ) ∣ ∣ q 2 ? q 1 ∣ d = \frac{| (q?-q?) \times (p-q?) |}{| q?-q? |} d=∣q2??q1?∣∣(q2??q1?)×(p?q1?)∣?
誤差函數:
e i = ( q 2 ? q 1 ) × ( R p i + t ? q 1 ) ∣ q 2 ? q 1 ∣ e_i = \frac{(q?-q?) \times (R p_i + t - q?)}{| q?-q? |} ei?=∣q2??q1?∣(q2??q1?)×(Rpi?+t?q1?)?
雅可比矩陣:
對旋轉角度 θ θ θ 的導數為:
? e i ? θ = ( q 2 ? q 1 ) × ( ? R ? θ p i ) ∣ q 2 ? q 1 ∣ \frac{\partial e_i}{\partial \theta} = \frac{(q?-q?) \times ( \frac{\partial R}{\partial \theta} p_i )}{| q?-q? |} ?θ?ei??=∣q2??q1?∣(q2??q1?)×(?θ?R?pi?)?
2.3 似然場法的概率解釋
似然場構建:
- 將目標掃描轉換為二值柵格地圖
- 對每個柵格計算到最近障礙物的距離 d d d
- 定義概率場:
P ( p ) = exp ? ( ? d 2 2 σ 2 ) P(p) = \exp(-\frac{d^2}{2\sigma^2}) P(p)=exp(?2σ2d2?)
優化目標:
最大化源掃描點在似然場中的總概率:
max ? T ∏ i P ( T ° p i ) \max_T \prod_i P(T \circ p_i) Tmax?i∏?P(T°pi?)
取負對數后轉化為最小化問題:
min ? T ∑ i d ( T ° p i ) 2 2 σ 2 \min_T \sum_i \frac{d(T \circ p_i)^2}{2\sigma^2} Tmin?i∑?2σ2d(T°pi?)2?
三、3D掃描匹配算法
3.1 3D點到點ICP
原理延續性:
3D點到點ICP是2D版本的直接擴展,核心思想完全一致:
- 建立點對點對應關系(最近鄰搜索)
- 最小化對應點間的歐氏距離
- 通過SVD或非線性優化求解剛體變換
數學形式擴展:
- 旋轉矩陣 R ∈ S O ( 3 ) R ∈ SO(3) R∈SO(3)(從2D的 θ θ θ 擴展為3D旋轉)
- 平移向量 t ∈ R 3 t ∈ ?3 t∈R3( z z z 方向擴展)
- 誤差函數: e i = R p i + t ? q i e_i = R p_i + t - q_i ei?=Rpi?+t?qi?
關鍵差異:
-
最近鄰搜索復雜度:
- 2D:可用KD-tree或柵格搜索(O(n log n))
- 3D:必須使用KD-tree/Octree(O(n log n)但常數項更大)
-
變換求解方法:
-
2D:可直接解析求解或高斯牛頓法
-
3D:通常采用SVD分解(更穩定):
W = ∑ ( p i ? p ˉ ) ( q i ? q ˉ ) T W = \sum (p_i - \bar{p})(q_i - \bar{q})^T W=∑(pi??pˉ?)(qi??qˉ?)T
U Σ V T = SVD ( W ) UΣV^T = \text{SVD}(W) UΣVT=SVD(W)
R = V U T , t = q ˉ ? R p ˉ R = V U^T, \quad t = \bar{q} - R \bar{p} R=VUT,t=qˉ??Rpˉ?
-
PCL實現示例:
pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(source_cloud);
icp.setMaxCorrespondenceDistance(0.05); // 比2D更小的距離閾值
icp.align(output_cloud);
3.2 3D點到線ICP
原理延續性:
與2D點到線ICP思想相同,但:
- 3D中的"線"通常來自邊緣特征提取
- 距離計算使用3D空間中的點線距離公式
數學形式:
給定目標掃描中的直線(方向向量 v v v,通過點 q q q ):
d = ∥ ( R p i + t ? q ) × v ∥ / ∥ v ∥ d = \| (R p_i + t - q) \times v \| / \| v \| d=∥(Rpi?+t?q)×v∥/∥v∥
實現關鍵點:
-
線特征提取:
pcl::PointCloud<pcl::PointXYZ>::Ptr edge_points(new pcl::PointCloud<pcl::PointXYZ>); pcl::extractEdgePoints(source_cloud, edge_points); // 基于曲率或PCA方法
-
誤差雅可比:
J = ? d ? [ t , ω ] = v × ∥ v ∥ ? [ I 3 × 3 , ? [ R p i ] × ] J = \frac{\partial d}{\partial [t, \omega]} = \frac{v \times}{\|v\|} \cdot [I_{3×3}, -[R p_i]_\times] J=?[t,ω]?d?=∥v∥v×??[I3×3?,?[Rpi?]×?]
(其中 ω ω ω 為角速度的李代數表示)
適用場景:
- 室內結構化環境(門框、桌腿等)
- 激光SLAM中的邊緣跟蹤(如LOAM)
3.3 3D點到面ICP
平面表示:
目標點云中的平面由點 q q q 和法向量 n n n 確定,平面方程為:
n T ( p ? q ) = 0 n^T (p - q) = 0 nT(p?q)=0
誤差函數:
e i = n j T ( R p i + t ? q j ) e_i = n_j^T (R p_i + t - q_j) ei?=njT?(Rpi?+t?qj?)
雅可比矩陣:
對旋轉部分采用李代數 s o ( 3 ) so(3) so(3) 參數化:
? e i ? ξ = ? n j T [ R p i ] × \frac{\partial e_i}{\partial \xi} = -n_j^T [ R p_i ]_\times ?ξ?ei??=?njT?[Rpi?]×?
其中 [ ? ] × [·]× [?]× 表示向量的叉積矩陣, ξ ∈ s o ( 3 ) ξ∈so(3) ξ∈so(3) 為旋轉的李代數表示。
3.4 NDT算法的統計原理
體素劃分:
將目標點云劃分為體素網格,對每個體素內的點 q k {q_k} qk? 計算:
- 均值: μ = ( 1 / n ) ∑ q k μ = (1/n)∑q_k μ=(1/n)∑qk?
- 協方差: Σ = ( 1 / n ) ∑ ( q k ? μ ) ( q k ? μ ) T Σ = (1/n)∑(q_k-μ)(q_k-μ)^T Σ=(1/n)∑(qk??μ)(qk??μ)T
概率密度函數:
p ( p ) = exp ? ( ? ( p ? μ ) T Σ ? 1 ( p ? μ ) 2 ) p(p) = \exp \left( -\frac{(p-μ)^T Σ^{-1} (p-μ)}{2} \right) p(p)=exp(?2(p?μ)TΣ?1(p?μ)?)
優化目標:
最大化源點云在NDT場中的總概率:
min ? T ∑ i ( T p i ? μ i ) T Σ i ? 1 ( T p i ? μ i ) \min_T \sum_i (T p_i - μ_i)^T Σ_i^{-1} (T p_i - μ_i) Tmin?i∑?(Tpi??μi?)TΣi?1?(Tpi??μi?)
Hessian矩陣計算:
NDT的高效實現依賴于精確計算Hessian矩陣:
H = J T Σ ? 1 J H = J^T Σ^{-1} J H=JTΣ?1J
四、PCL算法實現原理對比
4.1 點到面ICP的實現優化
PCL中的pcl::IterativeClosestPointWithNormals
通過以下優化提升性能:
-
法線估計加速:
- 使用KD-tree近鄰搜索
- 基于PCA計算法向量
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; ne.setInputCloud(cloud); ne.setSearchMethod(tree); ne.setKSearch(30); // 使用30個最近鄰計算法線
-
對應點篩選策略:
- 法線夾角閾值過濾
- 距離閾值過濾
4.2 GICP的協方差傳播
廣義ICP(GICP)通過考慮局部幾何結構提升精度:
源點協方差:
Σ i s r c = R Σ i s r c , l o c a l R T Σ_i^{src} = R Σ_i^{src,local} R^T Σisrc?=RΣisrc,local?RT
目標點協方差:
Σ i t g t = Σ i t g t , l o c a l Σ_i^{tgt} = Σ_i^{tgt,local} Σitgt?=Σitgt,local?
馬氏距離:
d i = ( T p i ? q i ) T ( Σ i t g t + Σ i s r c ) ? 1 ( T p i ? q i ) d_i = (T p_i - q_i)^T (Σ_i^{tgt} + Σ_i^{src})^{-1} (T p_i - q_i) di?=(Tpi??qi?)T(Σitgt?+Σisrc?)?1(Tpi??qi?)
4.3 NDT的多分辨率策略
PCL中的NDT實現采用多分辨率加速:
- 初始使用大體素進行粗配準
- 逐步縮小體素尺寸提高精度
ndt.setResolution(2.0); // 初始分辨率
ndt.setStepSize(0.1); // 步長控制
ndt.setOulierRatio(0.55);// 異常值比例
4.4 對比總結
方法類型 | PCL類名 | 優點 | 缺點 | 適用場景 |
---|---|---|---|---|
點到點ICP | pcl::IterativeClosestPoint | 實現簡單,通用性強 | 收斂慢,對初始位置敏感 | 通用3D配準 |
點到面ICP | pcl::IterativeClosestPointWithNormals | 收斂快,精度高 | 需要法線計算 | 結構化環境 |
GICP | pcl::GeneralizedIterativeClosestPoint | 結合點和面信息,更魯棒 | 計算復雜度高 | 復雜環境 |
NDT | pcl::NormalDistributionsTransform | 對初始位置不敏感,效率高 | 依賴網格分辨率設置 | 大場景,自動駕駛 |
Feature-based | pcl::SampleConsensusInitialAlignment | 利用特征,全局配準 | 依賴特征提取質量 | 無初始猜測的情況 |
五、算法選擇的數學依據
5.1 收斂性分析
方法 | 收斂半徑 | 收斂速度 | 數學特性 |
---|---|---|---|
點到點ICP | 小(~1m) | 線性 | 非凸,局部極值多 |
點到面ICP | 中等(~3m) | 超線性 | 利用幾何約束,更凸 |
NDT | 大(~10m) | 二次 | 平滑概率場,全局性更好 |
5.2 計算復雜度比較
算法時間復雜度分析:
- ICP類算法: O ( n m k ) O(nmk) O(nmk),其中 n n n 為源點數, m m m 為目標點數, k k k 為迭代次數
- NDT: O ( n + v ) O(n + v) O(n+v), v v v 為體素數量,預處理階段 O ( m ) O(m) O(m)
- 特征匹配: O ( n + m + f ) O(n + m + f) O(n+m+f), f f f 為特征匹配耗時
這部分的內容還是很重要的,我之前學得很淺,然后到后面實際應用的時候總是搞不明白掃描匹配這一步,所以還是回過頭來重新學了。