目的:最近看论文,遇到Rodrigues公式,一直没有怎么推导。因此自己推导一遍。
在理解Rodrigues公式,之前需要理解旋转向量的表达方式。
旋转矩阵的向量表达是基于欧拉定理推导的,它有三个参数。而它可以转化为旋转矩阵。这种转化为旋转矩阵的方式被称为Rodrigues公式。
Rotation Vectors
普通认知中,旋转矩阵是 3 × 3 3\times3 3×3的矩阵。这类矩阵有众多约束,具体哪些约束可以查阅资料(后续自己补上)。它只有三个自由度。只要知道那三个参数,剩下的6个参数能够计算,它的表达容易。在一般优化中,使用 Rotation matrix不方便,矩阵的计算复杂且耗时。
定义的来源:
在几何旋转中,任意一个旋转都可以表达为绕着一根轴旋转一定的角度。因此表达方式可以表示为:一根旋转的向量 u → \overrightarrow{u} u,和其旋转的角度 θ \theta θ。因此它可以用4个参数来决定。
假设向量 r → \overrightarrow{r} r为主轴向量,它的旋转的向量从向量 p → \overrightarrow{p} p,旋转角度为 θ \theta θ。如下图:
因为 o → \overrightarrow{o} o为原点。简化表达 o p → = p → \overrightarrow{op}=\overrightarrow{p} op=p,其它也使用类似的表达。
从图上可以看到,向量 p → \overrightarrow{p} p绕着轴 u → \overrightarrow{u} u旋转的时候,只和垂直于向量 u → \overrightarrow{u} u有关。因此按照向量 u → \overrightarrow{u} u把它拆分为 a → \overrightarrow{a} a, b → \overrightarrow{b} b,它们分别平面于向量 u → \overrightarrow{u} u和垂直于向量 u → \overrightarrow{u} u。拆分了两个向量,需要计算两个向量。假设 u → \overrightarrow{u} u和 p → \overrightarrow{p} p的夹角为 σ \sigma σ,因此可以得到
c o s σ = u → ⋅ p → ∣ u → ∣ ∣ p → ∣ ( 1 ) cos\sigma=\cfrac{\overrightarrow{u} \cdot \overrightarrow{p}}{|\overrightarrow{u}||\overrightarrow{p}|} \space \space\space\space (1) cosσ=∣u∣∣p∣u⋅p (1)
因为 u → \overrightarrow{u} u为单位向量。因此可以得到
a → = u → ∣ p → ∣ c o s σ = u → ⋅ p → ∣ u → ∣ ∣ p → ∣ ∣ p → ∣ u → = ( u → ⋅ p → ) u → = u → ( u → ⋅ p → ) ( 2 ) \overrightarrow{a}=\overrightarrow{u}|\overrightarrow{p}|cos\sigma=\cfrac{\overrightarrow{u} \cdot \overrightarrow{p}}{|\overrightarrow{u}||\overrightarrow{p}|}|\overrightarrow{p}|\overrightarrow{u}=(\overrightarrow{u} \cdot \overrightarrow{p})\overrightarrow{u} =\overrightarrow{u}(\overrightarrow{u} \cdot \overrightarrow{p}) \space \space\space\space(2) a=u∣p∣cosσ=∣u∣∣p∣u⋅p∣p∣u=(u⋅p)u=u(u⋅p) (2)
通过拆开和合并 ( 2 ) (2) (2)写成向量的形式可以得到:
a → = u → ( u → ⋅ p → ) = u → u → T p → ( 3 ) \overrightarrow{a}=\overrightarrow{u}(\overrightarrow{u} \cdot \overrightarrow{p})=\overrightarrow{u}\overrightarrow{u}^T\overrightarrow{p} \space \space\space\space(3) a=u(u⋅p)=uuTp (3)
对于垂直于向量 u → \overrightarrow{u} u的分量 b → \overrightarrow{b} b
b → = p → − a → = ( 1 − u → u → T ) p → ( 4 ) \overrightarrow{b}=\overrightarrow{p}-\overrightarrow{a}=(1-\overrightarrow{u}\overrightarrow{u}^T)\overrightarrow{p} \space \space\space\space(4) b=p−a=(1−uuT)p (4)
因为从向量 b → \overrightarrow{b} b旋转到向量 b ′ → \overrightarrow{b'} b′,需要另一个向量 c → \overrightarrow{c} c,它是垂直于向量 u → \overrightarrow{u} u和向量 p → \overrightarrow{p} p所在的平面,且它的长度和向量 b → \overrightarrow{b} b一样。
满足: ∣ b → ∣ = ∣ c → ∣ |\overrightarrow{b}|=|\overrightarrow{c}| ∣b∣=∣c∣
通过三角行垂直公式得到:
∣ b → ∣ = ∣ u → ∣ ∣ p → ∣ s i n σ ( 5 ) |\overrightarrow{b}|=|\overrightarrow{u}||\overrightarrow{p}|sin\sigma \space \space\space\space(5) ∣b∣=∣u∣∣p∣sinσ (5)
通过叉乘,可以设计向量 c → \overrightarrow{c} c:
c → = u → × p → = ( ∣ u → ∣ ∣ p → ∣ s i n σ ) c → ∣ c → ∣ = ( ∣ u → ∣ ∣ p → ∣ s i n σ ) n → ( 6 ) \overrightarrow{c} = \overrightarrow{u} \times \overrightarrow{p} =(|\overrightarrow{u}|| \overrightarrow{p}|sin\sigma) \cfrac{\overrightarrow{c}}{|\overrightarrow{c}|} = (|\overrightarrow{u}|| \overrightarrow{p}|sin\sigma)\overrightarrow{n} \space \space\space\space(6) c=u×p=(∣u∣∣p∣sinσ)∣c∣c=(∣u∣∣p∣sinσ)n (6)
其中 n → = c → ∣ c → ∣ \overrightarrow{n}=\cfrac{\overrightarrow{c}}{|\overrightarrow{c}|} n=∣c∣c单位向量。因此 ∣ c → ∣ = ∣ u → ∣ ∣ p → ∣ s i n σ |\overrightarrow{c}| =|\overrightarrow{u}||\overrightarrow{p}|sin\sigma ∣c∣=∣u∣∣p∣sinσ
通过计算它们的模,发现它们是相等的。
上面的公式 ( 6 ) (6) (6),将在下一篇blog介绍。后面更新它们的链接
因此可以得到 p → \overrightarrow{p} p旋转后得到的向量 p ′ → \overrightarrow{p'} p′为:
b ′ → = b → c o s θ + c → s i n θ ( 7 ) \overrightarrow{b'}=\overrightarrow{b}cos\theta+\overrightarrow{c}sin\theta \space \space\space\space(7) b′=bcosθ+csinθ (7)
然后通过向量加法
p ′ → = a → + b ′ → = a → + b → c o s θ + c → s i n θ = u → u → T p → + ( 1 − u → u → T ) p → c o s θ + ( u → × p → ) s i n θ = [ I c o s θ + ( 1 − c o s θ ) u → u → T + u → × s i n θ ] p → ( 8 ) \overrightarrow{p'}=\overrightarrow{a} + \overrightarrow{b'}= \overrightarrow{a} + \overrightarrow{b}cos\theta+\overrightarrow{c}sin\theta \\ = \overrightarrow{u}\overrightarrow{u}^T\overrightarrow{p}+(1-\overrightarrow{u}\overrightarrow{u}^T)\overrightarrow{p}cos\theta+(\overrightarrow{u} \times \overrightarrow{p})sin\theta \\ = [Icos\theta+(1-cos\theta)\overrightarrow{u}\overrightarrow{u}^T+\overrightarrow{u} \times sin\theta]\overrightarrow{p} \space \space\space\space(8) p′=a+b′=a+bcosθ+csinθ=uuTp+(1−uuT)pcosθ+(u×p)sinθ=[Icosθ+(1−cosθ)uuT+u×sinθ]p (8)
通过公式 ( 8 ) (8) (8)可以得到一个向量 p → \overrightarrow{p} p围绕向量 u → \overrightarrow{u} u得到旋转 θ \theta θ新的向量 p ′ → \overrightarrow{p'} p′的公式,其中 R = I c o s θ + ( 1 − c o s θ ) u → u → T + u → × s i n θ R=Icos\theta+(1-cos\theta)\overrightarrow{u}\overrightarrow{u}^T+\overrightarrow{u} \times sin\theta R=Icosθ+(1−cosθ)uuT+u×sinθ。它也是Rodrigues公式。
还有一种特殊情况,如果 u → = [ 0 , 0 , 0 ] T \overrightarrow{u}=[0,0,0]^T u=[0,0,0]T,得到的旋转矩阵为 I I I
上面的公式也可以反推(因为它不太常用),后面再补上。
参考资料为:
Vector Representation of rotations的论文。