三维空间刚体运动2:旋转向量表示旋转


本篇继续参照高翔老师《视觉SLAM十四讲从理论到实践》,讲解三维空间刚体运动。博文将原第三讲分为四部分来讲解:1、旋转矩阵和变换矩阵;2、旋转向量表示旋转;3、欧拉角表示旋转;4、四元数表示变换。本文相对于原文会适当精简,同时为便于理解,会加入一些注解和补充知识点,本篇为第二部分:旋转向量表示旋转,另外三部分请参照博主的其他博文。

1.定义

对于矩阵表示方式至少有以下两个缺点:
1.SO(3)SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度,因此这种表达方式是冗余的,同理SE(4)SE(4)也是。那么,是否有更紧凑的表示呢?
2.旋转矩阵和变换矩阵自身带有约束:它必须是正交矩阵且行列式为。当想估计或优化一个旋转矩阵或变换矩阵时,这些约束会使得求解变的更困难。
因此,希望有一种方式能够紧凑的描述旋转和平移。

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

2.罗德里格斯公式

2.1 定义

罗德里格斯公式:旋转向量和旋转矩阵有什么联系吗?事实上,从旋转向量到旋转矩阵的转换过程由罗德里格斯公式(Rodrigues’s Formula)表示。因为任意旋转都可以由一个旋转轴nn和一个旋转角Θ\Theta刻画,故罗德里格斯公式具体形式如下:R=cosθI+(1cosθ)nnT+sinθn(1.1)R= \cos \theta I+(1-\cos \theta )nn^{T}+\sin \theta n^{\wedge }\tag{1.1}
符号^{\wedge }是向量到反对称矩阵的转换符,见第一篇博客的公式(1.4)。

2.2 推导

首先,理解图1。定义向量kk是旋转轴的单位矢量,为表示方便,使用kk代表nn。图中初始向量vvkk为轴旋转角θ\theta得到vrotv_{rot}。向量wwk×vk\times v的方向上的单位向量,向量vv_{\perp }vrotv_{rot\perp }分别是vvvrotv_{rot}的垂直于平面的向量。向量aabb分别是vrotv_{rot}wwvv_{\perp }方向上的分量。
图1.1:旋转向量3D图(推荐数学绘图软件:geogebra
旋转向量3D图
所谓推导旋转方程,实则求出一个旋转矩阵,使得Vrot=RvV_{rot}=Rv,所以我们要做的就是找出vrotv_{rot}vv,并用矩阵来表示。
此公式有2种形式,故而也有2种推导方法,两者推导方法的不同主要在vv_{\perp }的表示上。具体推导过程如下。

2.2.1 推导一

推导一使用单位向量kk表示,推导过程如下:

  1. vv进行向量分解:v=v+vv = v_{\perp } + v_{||}

  2. 根据向量减法可得:v=vvv_{\perp } = v - v_{||}

  3. 由旋转过程平行向量不变得:vrot=vv_{rot||} = v_{||}

  4. vv_{||}其实就是vvuu上的正交投影(Orthogonal Projection),根据正交投影公式:v=projk(v)=kvkkk=kvk2k=(kv)k\begin{aligned} v_{||} &= proj_{k}(v) &= \frac{k\cdot v}{k\cdot k}k &= \frac{k\cdot v}{||k||^{2}}k &= (k\cdot v)k \end{aligned}
    其中uk=k2,k=1,(vk)u\cdot k=||k||^{2}, ||k||=1,(v\cdot k)为标量,所以再乘向量kk得到一个矢量

  5. 为计算方便,对vrotv_{rot\perp} 进行向量分解:vrot=a+bv_{rot\perp} =a+b

  6. 由图中的向量关系经推导可得:a=sinθk×v,b=cosθva=\sin \theta k\times v,b=\cos \theta v_{\perp }a,ba,b的推导在后边

  7. 综上可得:
    vrot=vrot+vrotv_{rot}=v_{rot\perp}+v_{rot||}
            =a+b+v=a+b+v_{||}
            =sinθk×v+cosθv+(vk)k=\sin \theta k\times v +\cos \theta v_{\perp } + (v\cdot k)k
            =sinθk×v+cosθ(vv)+(vk)k=\sin \theta k\times v +\cos \theta (v - v_{||}) + (v\cdot k)k
            =sinθk×v+cosθ(v(vk)k)+(vk)k=\sin \theta k\times v +\cos \theta (v - (v\cdot k)k ) + (v\cdot k)k
            =cosθv+(1cosθ)(vk)k+sinθk×v=\cos \theta v+(1-\cos \theta )(v\cdot k)k + \sin \theta k\times v
    显然:到此步,我们还无法将其用矩阵来表示,所以需要对(vk)k(v\cdot k)kk×vk\times v 进行矩阵转换,由点积的交换律和结合律得:(vk)k=k(vk)=k(kTv)=kkTv(v\cdot k)k=k\cdot(v\cdot k)=k\cdot (k^{T} v)=k\cdot k^{T} v其中的向量都是列向量,点积展开规则为:xy=[x,y]=xTyx\cdot y = [x, y] =x^{T}y
    对于k×vk\times v可用叉乘矩阵来化简为KvKv[(k×v)x(k×v)y(k×v)z]=[kyvzkzvykzvxkxvzkxvykyvx]=[0kzkykz0kxkykx0][vxvyvz]=Kv\begin{bmatrix} (k\times v)_{x}\\ (k\times v)_{y}\\ (k\times v)_{z} \end{bmatrix}= \begin{bmatrix} k_{y}v_{z}- k_{z}v_{y}\\ k_{z}v_{x}- k_{x}v_{z}\\ k_{x}v_{y}- k_{y}v_{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}= Kv
    vrot=cosθv+(1cosθ)(vk)k+sinθk×vv_{rot}=\cos \theta v+(1-\cos \theta )(v\cdot k)k + \sin \theta k\times v
               =cosθv+(1cosθ)kkTv+sinθKv=\cos \theta v+(1-\cos \theta )kk^{T}v + \sin \theta K v
               =(cosθI+(1cosθ)kkT+sinθK)v=(\cos \theta I +(1-\cos \theta )kk^{T} + \sin \theta K )v
    故旋转矩阵R=cosθI+(1cosθ)kkT+sinθK.(1.2)R= \cos \theta I +(1-\cos \theta )kk^{T} + \sin \theta K. \tag{1.2} 其中II为单位矩阵。

2.2.2 推导二

与推导一相比,推导二的不同主要在于用叉乘去表示一些数据。用叉乘来表示v⊥可得:v=k×(k×v)v_{\perp } =-k\times (k\times v)
所以联立推导一中各式得:
vrot=vrot+vrotv_{rot}=v_{rot\perp}+v_{rot||}
        =a+b+v=a+b+v_{||}
        =sinθk×v+cosθv+vv=\sin \theta k\times v +\cos \theta v_{\perp } + v-v_{\perp }
        =sinθk×vcosθk×(k×v)+v+k×(k×v)=\sin \theta k\times v -\cos \theta k\times (k\times v) + v + k\times (k\times v)
        =v+(1cosθ)k×(k×v)+sinθk×v=v + (1 - \cos \theta )k\times (k\times v) + \sin \theta k\times v
        =v+(1cosθ)K2v+sinθKv=v + (1 - \cos \theta )K^{2}v+ \sin \theta Kv(叉乘矩阵表示)
        =(I+(1cosθ)K2+sinθK)v=(I + (1 - \cos \theta )K^{2}+ \sin \theta K)v
        =Rv=Rv
从而得出第二种表达式R=I+(1cosθ)K2+sinθK.(1.3)R= I +(1-\cos \theta )K^{2} + \sin \theta K. \tag{1.3}显然,第二种表达式更为简便,在计算的过程中涉及的参数更少,所以这也是在进行旋转操作时常用的公式。

2.2.3 推导aa

向量aabb是由vrotv_{rot\perp }正交分解得到的矢量,既有大小又有方向,所以在求解时,我们要对其大小和方向分别求解。
大小
θ1=πθ\theta_{1}= \pi -\thetaθ2\theta_{2}是向量vvkk的夹角,kk为单位向量,则对于aa的大小a|a|有:
a=sinθ1vrot=sinθ1v|a|=\sin \theta_{1}|v_{rot\perp }|=\sin \theta_{1}|v_{\perp }|
      =sin(πθ)v=sinθv=\sin (\pi -\theta)|v_{\perp }|=\sin \theta|v_{\perp }|
      =sinθsinθ2v=\sin \theta \sin \theta_{2}|v|
      =sinθsinθ2vk=\sin \theta \sin \theta_{2}|v||k|
      =sinθk×v=\sin \theta |k \times v|
由公式a×b=sinθab|a\times b| = \sin \theta |a||b|sinθ2vk=k×v\sin \theta_{2}|v||k|=|k\times v|,所以:
a=sinθk×v|a|=\sin \theta |k \times v|

方向
由叉乘方向可得aa的单位方向向量为:k×v/k×vk\times v /|k \times v|,综上可得:
a=(k×v/k×v)aa=(k\times v /|k \times v|)|a|
    =(k×v/k×v)sinθk×v=(k\times v /|k \times v|)\sin \theta |k \times v|
    =sinθk×v=\sin \theta k\times v

2.2.4 推导bb

大小
由图得,θ1\theta_{1}bbvrotv_{rot\perp }的夹角,则:
b=cosθ1vrot=cos(πθ)v=cosθv|b|=\cos \theta_{1}|v_{rot\perp }|=\cos (\pi -\theta)|v_{\perp }|= -\cos \theta|v_{\perp }|

方向
由于bb的方向与vv_{\perp }方向相反,可得bb的单位方向向量为:v/v-v_{\perp }/|v_{\perp }|,综上可得:
b=(v/v)bb=(-v_{\perp }/|v_{\perp }|)|b|
    =cosθv=\cos \theta v_{\perp }

至此,罗德里格斯公式的证明全部结束。此外,如果读者希望获得关于Oxyz座标系的旋转变换关系,可以参考这篇博客:图形变换之旋转变换公式推导
罗德里格斯公式反应的是旋转向量到旋转矩阵的转换关系,如果已知旋转矩阵RR,如果推导旋转向量vv呢?下边给出旋转矩阵到旋转向量的反向转换关系。

3.旋转矩阵到向量

这里计算从一个旋转矩阵到旋转向量的转换。对于旋转角θ\theta,取旋转矩阵RR两边的迹,有:tr(R)=cosθtr(I)+(1cosθ)tr(nnT)+sinθtr(n)=3cosθ+(1cosθ)=1+2cosθ.(1.4)\begin{aligned} tr(R) &= \cos \theta tr(I)+(1-\cos \theta )tr(nn^{T})+\sin \theta tr(n^{\wedge })\\ &=3\cos \theta + (1- \cos \theta) \\ &=1+2\cos \theta. \tag{1.4} \end{aligned}因此:θ=arccostr(R)12.(1.5)\theta = \arccos \frac{tr(R)-1}{2} .\tag{1.5}关于转轴nn,旋转轴上的向量在旋转后不发生改变,说明:Rn=n.(1.6)Rn=n.\tag{1.6}因此,转轴nn是矩阵RR特征值1对应的特征向量。求解此方程,再归一化,就得到了旋转轴nn。由v=θnv=\theta n得到旋转向量vv

至此,推导结束。实践部分代码放到第三部分一起演示。

参考:
1.《视觉SLAM十四讲:从理论到实践》,高翔、张涛等著,中国工信出版社
2. 罗德里格斯公式推导

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章