Kabsch-algorithm
Kabsch-algorithm 是一种用于计算两个几何体(点集)之间的最佳对齐的算法。
目标
两个集合体 P,Q∈RN×3,找到一个SE(3)变换使得,P和Q的距离最小。
默认所有向量都为列向量
R,tminl(R,t)=i=1∑N∥pi−(Rqi+t)∥2=(pi−(Rqi+t))T(pi−(Rqi+t)),t∈R3,R∈SO(3)
l∂t∂l=i=1∑N∥pi∥2+∥(Rqi+t)∥2−2piT(Rqi+t)=i=1∑N∥pi∥2+∥Rqi∥2+∥t∥2+2tT(Rqi)−2piT(Rqi+t)=i=1∑N∥pi∥2+∥Rqi∥2+∥t∥2+2tT(Rqi−2pi)−2piTRqi=i=1∑N∥pi∥2+i=1∑N∥Rqi∥2+N∥t∥2+2tTi=1∑N(Rqi−2pi)−2i=1∑NpiTRqi=2Nt+2i=1∑N(Rqi−2pi)=0⇒t=N1i=1∑N(pi−Rqi)=N1i=1∑Npi−N1i=1∑NRqi=N1i=1∑Npi−RN1i=1∑Nqi
因此原问题可以先将两个点集的质心对齐,然后计算旋转矩阵。
A=P−N1∑i=1Npi
B=Q−N1∑i=1Nqi
最小化目标转化为
Rminl(R)=i=1∑N∥pi′−Rqi′∥2⟺Rmin∥A−(RBT)T∥F2
为了简化记号,
∥A−(RBT)T∥F2=∥A−BRT∥F2=Tr((A−BRT)T(A−BRT))=Tr(ATA−RBTA−ATBRT+RBTBRT)=Tr(ATA)+Tr(BTB)−2Tr(ATBRT)
因此原问题等价于最大化
RmaxTr(ATBRT)=RmaxTr(RBTA)
C:=BTA=USVT (SVD分解)
Tr(RC)=Tr(RUSVT)=Tr(VTRUS)
令 M=VTRU,则有:
Tr(RC)=Tr(MS)
最大化迹的形式
- M 仍然是正交矩阵,因为 VTRU 保持正交性。
- S 是对角矩阵,奇异值为 s1,s2,s3。
根据迹的性质:
Tr(MS)=i=1∑3Miisi
此时,我们需要最大化 Miisi 的和。
利用性质取最大值
由于 M 是正交矩阵,满足:
−1≤Mii≤1
为了最大化 Tr(MS),我们需要 Mii=1。最优选择是使得:
M=I⟹VTRU=I⟹R=VUT
修正旋转矩阵的行列式
旋转矩阵必须满足 det(R)=1。然而 det(VUT) 的行列式可能为 -1。为了修正这一点,引入一个校正矩阵 F:
F=diag(1,1,det(VUT))
这样可以确保:
det(VFUT)=det(V)⋅det(F)⋅det(UT)=1
最终最优解为:
R=VFUT