Sim3变化比较难,主要用于SLAM回环检测匹配时的尺度校正。
1. 概述
常见的欧式变换由6个自由度($R,T$各三个),在SLAM问题中,可能会存在尺度的改变,因此自由度就变成了7个,见下图:
Sim3(Similarity Transformation)的提出就是为了解决两个坐标系之间的相似变换问题,只要我们能得到3对匹配好的点在两个坐标系下的坐标,我们就能解出相似变换。
从几何上理解:在欧式变换中,我们只需要两对匹配的点就可以求解,因为两个点构成向量,通过比较向量在两个空间的平移量和旋转量,就可以得到欧式变换的结果。而在相似变换中,通过增加一个点,三个点构成三角形,通过法向量能计算旋转量,通过面积相似性能计算尺度变化,利用$R,s$将两个面平行,通过计算面距离得到平移量。
从代数上理解:两组三维点,能构成6个方程,解6个未知数;三组三维点,构成9个方程,超定方程解7个未知数。
在SLAM中主要用于回环检测,因为回环过程中会产生尺度的漂移,需要计算当前帧和候选帧之间的sim3变换。
2. 算法
2.1 坐标系
假设3个点在左右两个坐标系下的坐标分别是$r{l,1},r{l,2},r{l,3}$和$r{r,1},r{r,2},r{r,3}$,令$r{l,1}$和$r{r,1}$分别为左右两个坐标系的原点,则我们可以算出这两个坐标系的$x,y,z$轴方向的单位向量:
$X$方向:$xl=r{l,2}-r_{l,1}$,则单位向量$\hat x_l=x_l/|x_l|$
$Y$方向:$yl=(r{l,3}-r{l,1})-[(r{l,3}-r_{l,1})·\hat x_l]\hat x_l$ ,则单位向量$\hat y_l=y_l/|y_l|$
上面式子中$(r{l,3}-r{l,1})·\hat xl$大小为$r{l,3}-r_{l,1}$在$x$轴的投影(没有方向),再乘以$\hat x_l$得到了方向。做差后得到了与$x$轴垂直的方向。
$Z$方向:$\hat z_l=\hat x_l \times \hat y_l$
根据所得的坐标系单位向量,可以得到左右两侧坐标系的各个方向单位向量构成的基底矩阵:
假设左边坐标系有一个向量 $r_l$ ,那么: $M_l^Tr_l$ 是 $r_l$ 在 $M_l$ 基底下的坐标,左乘 $M_r$ 变成右坐标系: $r_r=M_rM_l^Tr_l$变换为: $R=M_rM_l^T$
2.2 计算平移量
设有n个点,在左右坐标系中分别表示为 ${r{l,i}}$ 和 ${r{r,j}}$ ,我们的目的是找到如下的变换形式: $r_r=sR(r_l)+r_0$,其中$r_0$为平移偏移量。
实际当中,两个坐标系之间的变换不会那么容易计算出精确的变换向量,一般使用最小二乘法来求解。此时,这里的误差为:
那么,求解的最小二乘问题变成了求解:
首先计算左右两个坐标系所有点的质心:
则每一个点距离质心的距离为:
由此得出:
优化函数变为:
最后一项明显不为负,所以当最后一项等于0时最小,由此可以计算出平移量$t$:
2.3 尺度计算
旋转尺度不变性: $|R(r{l,i}’)|^2=|r{l,i}’|^2$ ,对误差式展开得:
将上式写成:
进一步拆分成:
上面的式子只有第一项与s有关,所以当第一项等于0时达到最小,即 $s=D/S_l$ :
在误差模型中除一个根号s:
我们只是求误差的最小值,除以一个系数是没关系的,这样做的好处是最后求得的s与旋转因子无关,并且便于后面求解。
最后得到:
因此只有在D取得最大的情况下,误差才会最小,现在就把问题变为了求D的过程。
引入四元数qq表示旋转(具体推导见三维刚体运动那一部分):
左边等于:
右边等于:
所以又可以表达为:
为了求解$N$,先引入一个$M$矩阵:
则$N$矩阵就可以表示为:
引出$M$来就是为了让其中的量来表示$N$,如上式。将$N$进行特征分解,求得最大特征值对应的特征向量为四元数表示的旋转。之后平移和尺度关系也能相应求解。