opencv基础:罗德里格斯旋转公式(Rodrigues' rotation formula)推导 rodrigues()函数原理

参考:1—https://openhome.cc/Gossip/WebGL/Rodrigues.html(比较好的理解流程)
2—https://www.cnblogs.com/wtyuan/p/12324495.html(推导出旋转矩阵R)
建议看原链接!!
具体如下:


        

在〈转换矩阵〉中谈到的旋转,是顶点绕着X、Y或Z轴转动,然而有时会需要绕着指定的特定轴来旋转顶点,轴的部份会使用向量来表示,例如下图,使用u来表示旋转轴,旋转角度为θ:

如果对于3D方面的数学有些涉猎,看到这个需求应该会想到四元数与旋转,就结论来说,可以将这个需求化为一个四元数,然而套用四元数旋转矩阵,就可以达成任务,然而,若你对四元数或其旋转矩阵的导证有兴趣,认识Rodrigues旋转公式的导证,会有所帮助。

首先,旋转时的圆路径构成一个平面,该平面与u 正交,把这个平面置于原点,若未旋转的顶点使用向量v 来表示,可以将之分解为两个向量v1、v2:

v1为v在u上的投影,而v2为v在平面上的投影,a为v1、v2的夹角,根据内积公式u‧v = |u||v| cos(a),若要求得v1可以如下:

实际上对于旋转轴u,只需关心它的方向,不用在意它的大小,因此u 可以用单位向量指定,也就是|u| 会是1,结果就是:

接下来要绕着u 旋转v 得到v',就可以看成是v1 与v2 绕着u 旋转,若旋转后分别得到v1' 与v2',最后得到v' = v1' + v2':

对于v1 来说,因为跟u 平行,旋转后还是相同,也就是v1' = v1,至于v2 的转动,可以分解为平面上的两个向量:

为了能计算v2' 在上图中垂直轴上的投影,必须要有垂直轴的向量w,因为指定的旋转轴u 与v2 正交,那么w 可以由u 与v2 的外积取得,也就是w = ux v2,单位向量为w/|w|,因此v21' 与v22' 会是:

因为|v2'| 就是|v2|,因此:

外积公式a x b = |a||b|sin(a) n,n为与a、b正交的单位向量,在这边a为u,b为v2,而u与v2正交,因此ux v2 = |u||v2| n,n就是w/| w|,因此|w|就是|u||v2|w / (ux v2),u是单位向量,|u|为1,因此|w|为|v2|w / (ux v2),代入上面的式子化简后得到:

因此v2' = v21' + v22' = sin(θ)(ux v2) + cos(θ)v2,其中ux v2 可以是ux (v - v1) = uxv - ux v1,因为u 与v1 平行,ux v1为0,所以ux v2 会是uxv,最后就是v2' = sin(θ)(uxv) + cos(θ)v2。

因为v旋转后得到v' = v1' + v2',前面已导出v1' = v1,而v1 = (u‧v) u,v2 = v - (u‧v) u,因此
v'为(u‧ v) u + sin(θ)(uxv) + cos(θ)(v - (u‧v) u),整理一下可以得到最后的旋转公式:

公式是导出来了,不过看起来复杂,有个轴角(axis–angle)转换矩阵与要转动的向量结合后,等价于此公式,不过矩阵相对于四元数旋转矩阵来说,还是复杂许多,因而比较少见到这个公式的运用或实作。

不过,利用分解向量以及有些向量之间的正交关系,来导证出旋转公式的过程,与导证四元数旋转矩阵的过程会有关联,这之后再来简单聊聊!

你可能感兴趣的:(opencv基础)