ICP算法公式推導和PCL源碼解析

ICP算法可以使用SVD或者非線性優化的方法進行求解。因爲PCL源碼中對ICP的求解就是使用SVD,所以這裏對其進行一些探究。

1.公式推導

  • 1.首先對第ii個點構建誤差項:
    ei=pi(Rpi+t) e_{i}=p_{i}-\left(\boldsymbol{R} \boldsymbol{p}_{i}^{\prime}+\boldsymbol{t}\right)

  • 2.構建最小二乘問題:求得使得目標函數最小的未知量R,tR,t
    minR,tJ=12i=1n(pi(Rpi+t))22 \min _{\boldsymbol{R}, t} J=\frac{1}{2} \sum_{i=1}^{n}\left\|\left(\boldsymbol{p}_{i}-\left(\boldsymbol{R} \boldsymbol{p}_{i}^{\prime}+\boldsymbol{t}\right)\right)\right\|_{2}^{2}
    接下來定義一些需要用的變量:

    首先定義兩組點雲的質心:

p=1ni=1n(pi),p=1ni=1n(pi) \boldsymbol{p}=\frac{1}{n} \sum_{i=1}^{n}\left(\boldsymbol{p}_{i}\right), \quad \boldsymbol{p}^{\prime}=\frac{1}{n} \sum_{i=1}^{n}\left(\boldsymbol{p}_{i}^{\prime}\right)

  • 4.在誤差函數中添加質心,進行配平
    12i=1npi(Rpi+t)2=12i=1npiRpitp+Rp+pRp2=12i=1n(pipR(pip))+(pRpt)2=12i=1n(pipR(pip)2+pRpt2+2(pipR(pip))T(pRpt)) \begin{aligned}\frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{p}_{i}-\left(\boldsymbol{R} \boldsymbol{p}_{i}^{\prime}+\boldsymbol{t}\right)\right\|^{2} &=\frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{p}_{i}-\boldsymbol{R} \boldsymbol{p}_{i}^{\prime}-\boldsymbol{t}-\boldsymbol{p}+\boldsymbol{R} \boldsymbol{p}^{\prime}+\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}\right\|^{2} \\&=\frac{1}{2} \sum_{i=1}^{n}\left\|\left(\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}^{\prime}-\boldsymbol{p}^{\prime}\right)\right)+\left(\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right)\right\|^{2} \\&=\frac{1}{2} \sum_{i=1}^{n}\left(\left\|\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}^{\prime}-\boldsymbol{p}^{\prime}\right)\right\|^{2}+\left\|\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right\|^{2}+\right.\\&\left.2\left(\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}^{\prime}-\boldsymbol{p}^{\prime}\right)\right)^{T}\left(\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right)\right)\end{aligned}
    注意到交叉項部分中,(pipR(pip))\left(\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}^{\prime}-\boldsymbol{p}^{\prime}\right)\right)在求和之後是爲0的,因此目標優化函數可以進行化簡,變成:
    minR,tJ=12i=1npipR(pip)2+pRpt2 \min _{\boldsymbol{R}, \boldsymbol{t}} J=\frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{p}_{i}-\boldsymbol{p}-\boldsymbol{R}\left(\boldsymbol{p}_{i}^{\prime}-\boldsymbol{p}^{\prime}\right)\right\|^{2}+\left\|\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}-\boldsymbol{t}\right\|^{2}

  • 5.仔細觀察左右兩項,我們發現左邊只和旋轉矩陣 RR 相關,而右邊既有 $R 也有 $t,但 只和質心相關。只要我們獲得了 RR,令第二項爲零就能得到 tt。於是,ICP 可以分爲以下 三個步驟求解:

    • 5.1 計算兩組點的質心位置 p,pp, p′,然後計算每個點的去質心座標:
      qi=pip,qi=pip \boldsymbol{q}_{i}=\boldsymbol{p}_{i}-\boldsymbol{p}, \quad \boldsymbol{q}_{i}^{\prime}=\boldsymbol{p}_{i}^{\prime}-\boldsymbol{p}^{\prime}

    • 5.2 根據以下優化問題計算旋轉矩陣:
      R=argminR12i=1nqiRqi2 \boldsymbol{R}^{*}=\arg \min _{\boldsymbol{R}} \frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{q}_{i}-\boldsymbol{R} \boldsymbol{q}_{i}^{\prime}\right\|^{2}

    • 5.3 根據第二步的 RR,計算$ t$:
      t=pRp \boldsymbol{t}^{*}=\boldsymbol{p}-\boldsymbol{R} \boldsymbol{p}^{\prime}

  • 6.根據以上推導,我們重點需要求出旋轉量RR,求得之後代入自然可以獲得tt。對公式(6)進行展開:

12i=1nqiRqi2=12i=1nqiTqi+qiTRTRqi2qiTRqi \frac{1}{2} \sum_{i=1}^{n}\left\|\boldsymbol{q}_{i}-\boldsymbol{R} \boldsymbol{q}_{i}^{\prime}\right\|^{2}=\frac{1}{2} \sum_{i=1}^{n} \boldsymbol{q}_{i}^{T} \boldsymbol{q}_{i}+\boldsymbol{q}_{i}^{\prime T} \boldsymbol{R}^{T} \boldsymbol{R} \boldsymbol{q}_{i}^{\prime}-2 \boldsymbol{q}_{i}^{T} \boldsymbol{R} \boldsymbol{q}_{i}^{\prime}

​ 注意到第一項和 RR 無關,第二項由於 RTR=IR^TR = I,亦與 RR 無關。因此,實際上優化 目標函數變爲:
i=1nqiTRqi=i=1ntr(RqiqiT)=tr(Ri=1nqiqiT) \sum_{i=1}^{n}-\boldsymbol{q}_{i}^{T} \boldsymbol{R} \boldsymbol{q}_{i}^{\prime}=\sum_{i=1}^{n}-\operatorname{tr}\left(\boldsymbol{R} \boldsymbol{q}_{i}^{\prime} \boldsymbol{q}_{i}^{T}\right)=-\operatorname{tr}\left(\boldsymbol{R} \sum_{i=1}^{n} \boldsymbol{q}_{i}^{\prime} \boldsymbol{q}_{i}^{T}\right)
​ 其實就是31133*1 * 1*3的矩陣,自然只有對角線上的數據表示兩個點之間的有效數據。

  • 7.對這個優化函數的求解,則使用SVD來完成。定義矩陣:
    W=i=1nqiqiT \boldsymbol{W}=\sum_{i=1}^{n} \boldsymbol{q}_{i} \boldsymbol{q}_{i}^{\prime T}
    WW 是一個 3 × 3 的矩陣,對 WW 進行 SVD 分解,得:
    W=UΣVT \boldsymbol{W}=\boldsymbol{U} \boldsymbol{\Sigma} \boldsymbol{V}^{T}
    其中,ΣΣ 爲奇異值組成的對角矩陣,對角線元素從大到小排列,而 UUVV 爲正交矩 陣。當 WW 滿秩時,RR 爲:
    R=UVT \boldsymbol{R}=\boldsymbol{U} \boldsymbol{V}^{T}
    求得結果後,根據公式(7)即可獲得tt的結果。

2.PCL源碼閱讀

在這裏插入圖片描述
整個源碼從align函數開始,調用關係如上圖所示。
需要注意的是,PCL中根據算法的分類,對所有的代碼進行歸類。比如pcl屬於Registration類,那麼所有的匹配算法都統一放在Registration文件夾下。
其中h文件是定義好的函數接口,一些簡單的函數直接在裏面通過內聯函數的形式進行了完善。
impl(implement)文件夾下的hpp文件則是對h文件中定義的複雜文件的實現。
src文件夾則是一個空的.cpp文件,只包含了對應的頭文件。個人理解主要是爲了編譯生成可調用的庫文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章