今天讲一篇关于利用SVD方法求解ICP问题的文献《Least-Squares Rigid Motion Using SVD》,这篇文章非常精彩地推导出将3D点对齐问题的解析解,同时总结了求解该问题的统一范式。
问题描述
已知P={p1,p2,…,pn}以及Q={q1,q2,…,qn}是空间中(文中说的更加普适,pi,qi∈Rd,可以表示d维空间)的匹配点集,我们试图找到这样的旋转矩阵R和平移向量t最小化如下对齐误差(即ICP问题的形式):
(R,t)=R∈SO(d),t∈Rdargmini=1∑nwi∣(Rpi+t)−qi∣2(1)
接下来文章分别推导了平移向量t以及旋转矩阵R的解析解。
计算平移量
此时假定旋转矩阵R是固定的,令
F(t)=i=1∑nwi∣(Rpi+t)−qi∣2
我们可以通过F对t求导的方式得到平移量的最优解,如下:
0=∂t∂F=i=1∑n2wi(Rpi+t−qi)=2t(i=1∑nwi)+2R(i=1∑nwipi)−2i=1∑nwiqi(2)
令:
p=∑i=1nwi∑i=1nwipi,q=∑i=1nwi∑i=1nwiqi(3)
于是我们得到t的解:
t=q−Rp(4)
从上式看出最优的平移量t将P点集的加权中心映射到了Q点集的中心。接下来将上式带入优化方程,得:
i=1∑nwi∣(Rpi+t)−qi∣2=i=1∑nwi∣Rpi+q−Rp−qi∣2=i=1∑nwi∣R(pi−p)−(qi−q)∣2(5)
由此我们将原问题转换成了无平移量的优化问题,令:
xi:=pi−p,yi:=qi−q(6)
我们把问题简写成如下形式:
R=R∈SO(d)argmini=1∑nwi∣Rxi−yi∣2(7)
计算旋转量
简化上式:
∣Rxi−yi∣2=(Rxi−yi)T(Rxi−yi)=(xiTRT−yiT)(Rxi−yi)=xiTRTRxi−xiTRTyi−yiTRxi+yiTyi(8)
又因为旋转矩阵的正交性:RTR=I;另外xiTRTyi是标量:xi维度为1×d,RT维度为d×d,yi维度为d×1。于是有下式:
xiTRTyi=(xiTRTyi)T=yiTRxi(9)
得:
∣Rxi−yi∣2=xiTxi−2yiTRxi+yiTyi(10)
将整理好的上式带入简化后的R优化问题,得:
==R∈SO(d)argmini=1∑nwi∣Rxi−yi∣2=R∈SO(d)argmini=1∑nwi(xi⊤xi−2yi⊤Rxi+yi⊤yi)R∈SO(d)argmin(i=1∑nwixi⊤xi−2i=1∑nwiyi⊤Rxi+i=1∑nwiyi⊤yi)argminR∈SO(d)(−2i=1∑nwiyi⊤Rxi)(11)
接下来将要利用到如下关于迹的技巧:
w1w1⋱wn————y1Ty2T⋮ynT————R∣x1∣∣x2∣∣…∣∣xn∣=————w1y1Tw2y2T⋮wnynT————∣Rx1∣∣Rx2∣∣…∣∣Rxn∣=w1y1TRx1∗w2y2TRx2⋱∗wnynTRxn
上式就是对
i=1∑nwiyi⊤Rxi=tr(WYTRX)
的完美解释。
利用上式,式(11)可以整理得:
R∈SO(d)argmin(−2i=1∑nwiyi⊤Rxi)=R∈SO(d)argmax(i=1∑nwiyi⊤Rxi)=R∈SO(d)argmaxtr(WYTRX)(12)
这里说明一下维度:W=diag(w1,w2,...,wn)维度为n×n,YT维度为n×d,R维度为d×d,X维度为d×n。
接下来回顾一下迹的性质:tr(AB)=tr(BA),因此有下式:
tr(WYTRX)=tr((WYT)(RX))=tr(RXWYT)(13)
令d×d的”covariance”矩阵S=XWYT,求S的SVD分解:
S=UΣVT(14)
于是式(13)变为:
tr(WYTRX)=tr(RS)=tr(RUΣVT)=tr(ΣVTRU)(15)
由于V,U,R均为正交矩阵,因此M=VTRU也是正交阵,也就是说M的列向量mj是互相正交的单位向量,即:
mjTmj=1
于是:
1=mj⊤mj=i=1∑dmij2⇒mij2≤1⇒∣mij∣≤1(16)
由于SVD分解的性质可知σ的元素均为非负数:σ1,σ2,...,σd≥0,于是式(17)变为如下形式:
tr(ΣM)=σ1σ2⋱σdm11m21⋮md1m12m22⋮md2……⋮…m1dm2d⋮mdd=i=1∑dσimii≤i=1∑dσi(17)
可见,当迹最大时mii=1,又由于M是正交阵,这使得M为单位阵!
I=M=VTRU⇒R=VUT(18)
看到没,R的解析解竟然如此简单,并且与SVD分解产生了联系,让人感觉到了数学的美妙。不过到这里还没完,后面作者进行了一步方向矫正,大意是这样的:利用公式(18)得到的矩阵并不一定是一个旋转矩阵,也可能为反射矩阵,此时可以通过验证VUT的行列式来判断到底是旋转(行列式 = 1)还是反射(行列式 = -1)。但我们要求的是旋转矩阵,这时需要对公式(18)进行一步处理。
假设det(VUT)=−1,则限制R为旋转就意味着M=VTRU为反射矩阵,于是我们试图找到一个反射矩阵M最大化下式:
tr(ΣM)=σ1m11+σ2m22+...+σdmdd:=f(m11,m22,...,mdd)(19)
即f是以m11,m22,...,mdd为变量的线性函数,由于mii∈[−1,1],其极大值肯定在其定义域的边界处。于是当∀i,mii=1时,f取得极大值,但是此时的R为反射矩阵,所以并不能这样取值。然后我们看第二个极大值点(1,1,...,−1),有:
f=tr(ΣM)=σ1+σ2+...+σd−1−σd(20)
这个值大于任何其它的自变量取值(±1,±1,...,±1)的组合(除了(1,1,...,1)),因为奇异值是经过排序的,σd是最小的一个奇异值。
综上,为了将解转换为旋转矩阵要进行如下处理:
R=V1⋱1det(VU⊤)U⊤(21)
可以总结的套路
为了得到ICP问题的最优解,我们可以采取如下套路:
step1. 计算两组匹配点的加权中心:
p=∑i=1nwi∑i=1nwipi,q=∑i=1nwi∑i=1nwiqi
step2. 得到去中心化的点集:
xi:=pi−p,yi:=qi−q,i=1,2...n
step3. 计算d×d的covariance矩阵:
S=XWYT
其中,X,Y为d×n的矩阵,xi,yi分别是它们的列元素,另外W=diag(w1,w2,...,wn)。
step4. 对S进行SVD分解S=UΣVT,得到旋转矩阵:
R=V1⋱1det(VU⊤)U⊤
step5. 计算平移量:
t=q−Rp