目的:最近看论文,遇到Rodrigues公式,一直没有怎么推导。因此自己推导一遍。

在理解Rodrigues公式,之前需要理解旋转向量的表达方式。
旋转矩阵的向量表达是基于欧拉定理推导的,它有三个参数。而它可以转化为旋转矩阵。这种转化为旋转矩阵的方式被称为Rodrigues公式。

Rotation Vectors
普通认知中,旋转矩阵是旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习的矩阵。这类矩阵有众多约束,具体哪些约束可以查阅资料(后续自己补上)。它只有三个自由度。只要知道那三个参数,剩下的6个参数能够计算,它的表达容易。在一般优化中,使用 Rotation matrix不方便,矩阵的计算复杂且耗时。

定义的来源
在几何旋转中,任意一个旋转都可以表达为绕着一根轴旋转一定的角度。因此表达方式可以表示为:一根旋转的向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02,和其旋转的角度旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_03。因此它可以用4个参数来决定。
假设向量旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_04为主轴向量,它的旋转的向量从向量旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_05,旋转角度为旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_03。如下图:

旋转90度的旋转向量3维 python 旋转向量怎么表示_线性代数_07


因为旋转90度的旋转向量3维 python 旋转向量怎么表示_线性代数_08为原点。简化表达旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转90度的旋转向量3维 python_09,其它也使用类似的表达。

从图上可以看到,向量旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_05绕着轴旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02旋转的时候,只和垂直于向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02有关。因此按照向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02把它拆分为旋转90度的旋转向量3维 python 旋转向量怎么表示_线性代数_14,旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_15,它们分别平面于向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02和垂直于向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02。拆分了两个向量,需要计算两个向量。假设旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_05的夹角为旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_20,因此可以得到
旋转90度的旋转向量3维 python 旋转向量怎么表示_线性代数_21
因为旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02为单位向量。因此可以得到
旋转90度的旋转向量3维 python 旋转向量怎么表示_线性代数_23
通过拆开和合并旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_24写成向量的形式可以得到:
旋转90度的旋转向量3维 python 旋转向量怎么表示_线性代数_25

对于垂直于向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02的分量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_15
旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_28

因为从向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_15旋转到向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_30,需要另一个向量旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_31,它是垂直于向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02和向量旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_05所在的平面,且它的长度和向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_15一样。
满足:旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_35
通过三角行垂直公式得到:
旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_36
通过叉乘,可以设计向量旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_31:
旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_38
其中旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_39单位向量。因此旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_40
通过计算它们的模,发现它们是相等的。
上面的公式旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_41,将在下一篇blog介绍。后面更新它们的链接

因此可以得到旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_05旋转后得到的向量旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_43为:
旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_44
然后通过向量加法
旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_45

通过公式旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转90度的旋转向量3维 python_46可以得到一个向量旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_05围绕向量旋转90度的旋转向量3维 python 旋转向量怎么表示_矩阵_02得到旋转旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_03新的向量旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_43的公式,其中旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转矩阵_51。它也是Rodrigues公式。
还有一种特殊情况,如果旋转90度的旋转向量3维 python 旋转向量怎么表示_机器学习_52,得到的旋转矩阵为旋转90度的旋转向量3维 python 旋转向量怎么表示_旋转90度的旋转向量3维 python_53

上面的公式也可以反推(因为它不太常用),后面再补上。

参考资料为:
Vector Representation of rotations的论文。