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文件,只包含了对应的头文件。个人理解主要是为了编译生成可调用的库文件。

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