下面介绍的方法比较自娱自乐,更高效的方法可以参考这里。
问题分析
所谓的刚体变换,是线性变换的一种特例,它在变换前后不改变任意两点之间的相互距离,可以认为是一种没有图像扭曲的变换。
三维空间中点和向量的线性变换可以由一个4*4的具有12个自由元的仿射变换矩阵表示;刚体变换则在此基础上有一些额外的要求。这里要解决的问题是,求得一组三维点云到另一组三维点云的一个最接近的刚体变换矩阵。我们假设点的对应关系是已知的,即是由两个4*V的三维坐标矩阵P和Q,求一个最接近的4*4的刚体变换矩阵A,使得P中的点能够映射得到Q中的点,即
这里点采用齐次坐标表示,即P和Q的前3行分别为XYZ坐标,而第4行为1表示顶点;A等效于一个3*3的旋转变换矩阵加上平移变换,即
而三维空间中任意旋转变换矩阵的具体表示如下(来源见水印),可以看出是绕x、y、z轴的三个矩阵的乘积。但愿这哥们没有乘错,否则后面的推导就阿西吧了。
可以看出刚体变换矩阵包含了6个变量——yaw、pitch、roll、tx、ty、tz。接下来,我们可以通过常规的数值优化方法求得这6个变量。
能量
考察P经过刚体变换A后,点坐标与Q中对应点坐标的差异,我们可以定义一个能量用于优化。例如,取坐标差的平方和作为能量时,记和为对应矩阵的第i列,则我们可以定义
从元素角度来讲,记,那么可以得到
展开可以得到
梯度
接下来我们对能量E分别求它对6个变量——yaw、pitch、roll、tx、ty、tz——的偏导,从而得到取倒数的负方向作为梯度。
为此,我们先计算u、v、w对这6个变量共计18个偏导,因为根据链式求导法则,这是迟早的事情。这里中间只涉及到了sin和cos的求导,即是由
可以得到下列18个偏导数(滑稽):
于是乎,得到上面18个偏导后,能量E对6个变量偏导,根据链式求导规则可统一记为
这个式子也就是能量对刚体变换6个变量——yaw、pitch、roll、tx、ty、tz——的梯度了。取梯度负方向的迭代更新6个变量,即可通过简单的梯度下降法求得P到Q最接近的刚体变换。