关于罗德里格斯公式[Rodrigues’sFormula]的详细推导过程

  • 1 旋转向量
  • 2 罗德里格斯公式
    • 2.1 罗德里格斯公式定义
    • 2.2 罗德里格斯公式推导
  • 3 旋转矩阵到旋转向量的转换

1 旋转向量

实际上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。我们可以使用一个向量 uuu,其方向与旋转轴一致,其长度等于旋转角 θ\thetaθ,那么向量 θ u\theta uθu就可以描述这个旋转,这种向量称为旋转向量(或轴角/角轴,Axis-Angle),只需一个三维向量即可描述旋转。同样,对于一个变换矩阵,使用一个旋转向量和一个平移向量即可表达一次变换,此时变量维数正好是六维。

2 罗德里格斯公式

2.1 罗德里格斯公式定义

维基百科给出的罗德里格斯旋转公式(Rodrigues’ rotation formula)定义如下:
如果 vvv R3 \mathbb{R}^3R3中的向量,并且 kkk是描述旋转轴的单位向量,根据右手法则 vvv围绕该轴旋转角度 θ\thetaθ,则旋转向量 v r o t v_{rot}vrot的罗德里格斯公式为 v rot =vcosθ+(k×v)sinθ+k(k⋅v)(1−cosθ).v_{rot}=vcos\theta+(k \times v)sin \theta +k(k\cdot v)(1-cos\theta). vrot=vcosθ+(k×v)sinθ+k(kv)(1cosθ).视觉SLAM十四讲中给出的用罗德里格斯公式转换的结果为:R=cosθI+(1−cosθ)n n T+sinθ n ∧R=cos\theta I+(1-cos\theta)nn^T+sin\theta n^{\land} R=cosθI+(1cosθ)nnT+sinθn其中, RRR表示一个旋转,单位长度的向量 nnn为一个假设的旋转轴,角度为 θ\thetaθ,符号∧ ^\land是向量到反对称矩阵的转换符,具体含义见文章:[视觉SLAM十四讲]学习笔记1-刚体运动之旋转矩阵与变换矩阵。
我们可以看出,原始的定义和书中给出的转换结果形似,这说明这两个公式有一定的关系,下一节将通过推导过程来展示这个关系的转换。

2.2 罗德里格斯公式推导

我们可以通过三维空间中的旋转和旋转分解来进行罗德里格斯公式的推导。
首先,我们给出一些定义:令 kkk为定义旋转轴的单位向量,令 vvv为围绕 kkk旋转角度 θ\thetaθ的任意向量(遵循右手法则,图中为逆时针方向)。
在图中,向量 vvv围绕 kkk旋转 θ\thetaθ度得到向量 v r o t v_{rot}vrot,将向量 vvv分解为平行于旋转轴 kkk的向量 v ∣ ∣ v_{||}v∣∣和正交于(垂直)旋转轴 kkk的向量 v⊥ v_{⊥}v v = v ∣ ∣+ v⊥ v=v_{||}+v_{⊥}v=v∣∣+v
简单来说,根据2.1中的转换结果和下图可知, v r o t= R vv_{rot}=Rvvrot=Rv,为了求解出转换关系即 RRR我们只需要找到 v r o t v_{rot}vrot的表达式即可。

根据下图,我们可以看出,向量 v r o t v_{rot}vrot同样被分解成了两个向量 v ∣ ∣ r o t v_{||rot}v∣∣rot v ⊥ r o t v_{⊥rot}vrot,但这幅图不便于我们进行公式的推导和观察,我们可以换一种分解方式,类似于第一个图,这时向量 v ∣ ∣ v_{||}v∣∣和向量 v ∣ ∣ r o t v_{||rot}v∣∣rot将平行(重合)于旋转轴 kkk

1. v ∣∣ v_{||} v∣∣的旋转及 v rot∣∣ v_{rot||} vrot∣∣的表示
首先我们看一下向量 vvv的分解示意图(图中 uuu为旋转轴):

通过上图,我们可以看到, v ∣ ∣ v_{||}v∣∣其实就是 vvv uuu上的正交投影(Orthogonal Projection),根据正交投影的公式,我们可以得出: v ∣∣ =pro j u(v)= u⋅vu⋅u u= u⋅v∥u ∥ 2 u=(u⋅v)uv_{||}=proj_{u}(v)=\frac{u\cdot v}{u \cdot u}u=\frac{u\cdot v}{\Vert u \Vert^2}u=(u\cdot v)u v∣∣=proju(v)=uuuvu=u2uvu=(uv)u这里, ∥ u ∥2= u ⋅ u , ∥ u ∥ = 1\Vert u \Vert^2=u \cdot u,\Vert u \Vert=1u2=uuu=1,从而由 v = v ∣ ∣+ v⊥ v=v_{||}+v_{⊥}v=v∣∣+v,我们可以得到 v⊥= v − v ∣ ∣= v − ( u ⋅ v ) uv_{⊥}=v-v_{||}=v-(u\cdot v)uv=vv∣∣=v(uv)u,,所以 v⊥= v − v ∣ ∣= v − ( u ⋅ v ) uv_{⊥}=v-v_{||}=v-(u\cdot v)uv=vv∣∣=v(uv)u
从之前的图中我们可以看到, v ∣ ∣ v_{||}v∣∣其实没有被旋转,仍然与旋转轴 uuu重合,所以: v ∣ ∣= v ∣ ∣ r o t v_{||}=v_{||rot}v∣∣=v∣∣rot
2. v ⊥v_{⊥} v的旋转及 v ⊥rot v_{⊥rot} vrot的表示
通过之前的图,我们可以看出因向量 v⊥ v_{⊥}v正交于向量 uuu,这个旋转可以看做是平面内的一个旋转。因为旋转不改变 v⊥ v_{⊥}v的长度,所以路径是一个圆。通过下图我们可以清晰的看到旋转的情况(第一个图为旋转情况,第二个图为旋转情况的俯视图):

有了旋转情况的俯视图,我们就可以通过平面上的旋转来分析三维旋转的情况了,为了表示旋转,我们可以构造一个同时正交于 uuu v⊥ v_{⊥}v的向量 www,通过外积(叉乘),我们可以表示出来w=u× v ⊥w=u \times v_{⊥} w=u×v,由于我们一直使用的是右手坐标系统,所以在表示时要注意叉乘顺序。按照右手定则,新定义的向量 www指向的是 v⊥ v_{⊥}v逆时针旋转 π / 2\pi /2π/2后的方向,同时和 v⊥ v_{⊥}v一样位于正交于 uuu的平面内,由 ∥ u ∥ = 1\Vert u \Vert=1u=1,我们可以得到以下关系:∥w∥=∥u× v ⊥∥=∥u∥⋅∥ v ⊥∥⋅sin(π/2)=∥ v ⊥∥.\Vert w \Vert=\Vert u \times v_{⊥}\Vert=\Vert u\Vert \cdot \Vert v_{⊥}\Vert \cdot sin(\pi/2)=\Vert v_{⊥}\Vert. w=u×v=uvsin(π/2)=v∥.这里 π / 2\pi/2π/2 uuu v⊥ v_{⊥}v的夹角,同时我们可以看出, www v⊥ v_{⊥}v具有相同的模长,即 www也位于这个圆上, www v⊥ v_{⊥}v即成为了一个平面上的两个坐标轴。这样,我们就可以把 v ⊥ r o t v_{⊥rot}vrot投影到 www v⊥ v_{⊥}v上,我们可以将 v ⊥ r o t v_{⊥rot}vrot分解为 v r w v_{rw}vrw v r v v_{rv}vrv,通过三角函数的一些知识,我们可以得到以下关系: v ⊥rot = v rv + v rw =cos(θ) v ⊥+sin(θ)w=cos(θ) v ⊥+sin(θ)(u× v ⊥)v_{⊥rot}=v_{rv}+v_{rw}=cos(\theta)v_{⊥}+sin(\theta)w=cos(\theta)v_{⊥}+sin(\theta)(u \times v_{⊥}) vrot=vrv+vrw=cos(θ)v+sin(θ)w=cos(θ)v+sin(θ)(u×v)
3. v rot v_{rot} vrot的表示
通过1和2得到的结果,我们可以得到 v r o t v_{rot}vrot的表达式为: v rot = v rot∣∣ + v rot⊥ = v ∣∣ +cos(θ) v ⊥+sin(θ)(u× v ⊥)v_{rot}=v_{rot||}+v_{rot⊥}=v_{||}+cos(\theta)v_{⊥}+sin(\theta)(u \times v_{⊥}) vrot=vrot∣∣+vrot=v∣∣+cos(θ)v+sin(θ)(u×v)对于 u × v⊥ u \times v_{⊥}u×v,我们可以采用分配律进行变形u× v ⊥=u×(v− v ∣∣ )=u×v−u× v ∣∣ =u×vu \times v_{⊥}=u \times (v-v_{||})=u \times v-u \times v_{||}=u \times v u×v=u×(vv∣∣)=u×vu×v∣∣=u×v这里 uuu v ∣ ∣ v_{||}v∣∣平行,所以 u × v ∣ ∣= 0u \times v_{||}=0u×v∣∣=0
最后代入 v ∣ ∣= ( u ⋅ v ) uv_{||}=(u \cdot v)uv∣∣=(uv)u v⊥= v − ( u ⋅ v ) uv_{⊥}=v-(u \cdot v)uv=v(uv)u,得到下面的结果 v rot =(u⋅v)u+cos(θ)(v−(u⋅v)u)+sin(θ)(u×v)v_{rot}=(u \cdot v)u+cos(\theta)(v-(u \cdot v)u)+sin(\theta)(u \times v) vrot=(uv)u+cos(θ)(v(uv)u)+sin(θ)(u×v)=vcos(θ)+(u×v)sin(θ)+(u⋅v)u(1−cos(θ))=vcos(\theta)+(u \times v)sin(\theta)+(u \cdot v)u(1-cos(\theta)) =vcos(θ)+(u×v)sin(θ)+(uv)u(1cos(θ))这样,我们就得到了3D空间中任意一个向量 vvv沿着单位向量(旋转轴) uuu旋转 θ\thetaθ角度之后的 v r o t v_{rot}vrot
到这里,我们推导出了罗德里格斯公式的基本形式,但显然,书中给出的旋转 RRR是矩阵形式,接下来我们要将内积和外积的运算进行变形,用矩阵形式表示。
对于 ( u ⋅ v ) u(u \cdot v)u(uv)u,通过内积的展开规则 x ⋅ y = [ x , y ] = xTyx \cdot y=[x,y]=x^Tyxy=[x,y]=xTy及交换律可以得到(u⋅v)u=(u⋅u)v=(u⋅ u T)v=u u Tv(u \cdot v)u=(u \cdot u)v=(u \cdot u^T)v=uu^Tv (uv)u=(uu)v=(uuT)v=uuTv同时, u × vu \times vu×v可以通过之前在:[视觉SLAM十四讲]学习笔记1-刚体运动之旋转矩阵与变换矩阵中介绍的叉乘矩阵的形式,即为u×v= [ (u×v ) x(u×v ) y(u×v ) z]= [u y v z− u z v y u z v x− u x v z u x v y− u y v x]= [ 0 − k zkykz0 − k x− k ykx0 ] [ vxvyvz]=Uvu \times v=\begin{bmatrix}(u \times v)_x \\ (u \times v)_y \\ (u \times v)_z \end{bmatrix}=\begin{bmatrix}u_yv_z-u_zv_y \\u_zv_x-u_xv_z \\u_xv_y-u_yv_x \end{bmatrix}=\begin{bmatrix}0&-k_z&k_y \\ k_z&0&-k_x \\ -k_y&k_x&0\end{bmatrix}\begin{bmatrix}v_x \\ v_y \\ v_z \end{bmatrix}=Uv u×v= (u×v)x(u×v)y(u×v)z = uyvzuzvyuzvxuxvzuxvyuyvx = 0kzkykz0kxkykx0 vxvyvz =Uv这里U= u ∧= [ 0 − k zkykz0 − k x− k ykx0 ]U=u^{\land}=\begin{bmatrix}0&-k_z&k_y \\ k_z&0&-k_x \\ -k_y&k_x&0\end{bmatrix} U=u= 0kzkykz0kxkykx0 将转换后的 ( u ⋅ v ) u(u \cdot v)u(uv)u u × vu \times vu×v矩阵形式带入推导的结果,变形结果如下: v rot =vcos(θ)+(u×v)sin(θ)+(u⋅v)u(1−cos(θ))v_{rot}=vcos(\theta)+(u \times v)sin(\theta)+(u \cdot v)u(1-cos(\theta)) vrot=vcos(θ)+(u×v)sin(θ)+(uv)u(1cos(θ))=vcos(θ)+(1−cos(θ))u u Tv+sin(θ) u ∧v=vcos(\theta)+(1-cos(\theta))uu^Tv+sin(\theta)u^{\land}v =vcos(θ)+(1cos(θ))uuTv+sin(θ)uv=(cos(θ)I+(1−cos(θ))u u T+sin(θ) u ∧)v=(cos(\theta)I+(1-cos(\theta))uu^T+sin(\theta)u^{\land})v =(cos(θ)I+(1cos(θ))uuT+sin(θ)u)v则旋转矩阵为R=cos(θ)I+(1−cos(θ))u u T+sin(θ) u ∧R=cos(\theta)I+(1-cos(\theta))uu^T+sin(\theta)u^{\land} R=cos(θ)I+(1cos(θ))uuT+sin(θ)u III为单位矩阵,证毕。

3 旋转矩阵到旋转向量的转换

有了上节的推导和转换结果,我们可以在转换公式的基础上,进行旋转矩阵到旋转向量的转换。
首先对转换公式两边取迹,得tr(R)=cos(θ)tr(I)+(1−cos(θ))tr(u u T)+sin(θ)tr( u ∧)tr(R)=cos(\theta)tr(I)+(1-cos(\theta))tr(uu^T)+sin(\theta)tr(u^{\land}) tr(R)=cos(θ)tr(I)+(1cos(θ))tr(uuT)+sin(θ)tr(u)=3cos(θ)+(1−cos(θ)=3cos(\theta)+(1-cos(\theta) =3cos(θ)+(1cos(θ)=1+2cos(θ)=1+2cos(\theta) =1+2cos(θ)因此:θ=arccos tr(R)−12\theta =arccos\frac{tr(R)-1}{2} θ=arccos2tr(R)1对于旋转轴 uuu和之前的图及结果,我们可以知道,旋转轴上的向量在旋转后不会发生改变,说明:Ru=uRu=u Ru=u显然,旋转轴 uuu是旋转矩阵 RRR特征值 III对应的特征向量。求解这个方程,进行归一化,就可以得到旋转轴。


创作不易,希望大家支持,多多点赞收藏!!!!非常感谢!!!!

参考资料:
视觉SLAM十四讲:从理论到实践(第2版)(ISBN:9787121369421)
维基百科-罗德里格斯的旋转公式
四元数与三维旋转