本篇继续参照高翔老师《视觉SLAM十四讲从理论到实践》,讲解三维空间刚体运动。博文将原第三讲分为四部分来讲解:1、旋转矩阵和变换矩阵;2、旋转向量表示旋转;3、欧拉角表示旋转;4、四元数表示变换。本文相对于原文会适当精简,同时为便于理解,会加入一些注解和补充知识点,本篇为第二部分:旋转向量表示旋转,另外三部分请参照博主的其他博文。
1.定义
对于矩阵表示方式至少有以下两个缺点:
1.SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度,因此这种表达方式是冗余的,同理SE(4)也是。那么,是否有更紧凑的表示呢?
2.旋转矩阵和变换矩阵自身带有约束:它必须是正交矩阵且行列式为。当想估计或优化一个旋转矩阵或变换矩阵时,这些约束会使得求解变的更困难。
因此,希望有一种方式能够紧凑的描述旋转和平移。
旋转向量:事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画,于是,我们可以使用一个向量,其方向n与旋转轴一致,其长度等于旋转角Θ,那么向量Θn也可以描述这个旋转,这种向量称为旋转向量(或轴角/角轴,Axis-Angle),只需一个三维向量即可描述旋转。同样,对于变换矩阵,使用一个旋转向量和一个平移向量即可表达一次变换,此时变量维数正好是六维。
2.罗德里格斯公式
2.1 定义
罗德里格斯公式:旋转向量和旋转矩阵有什么联系吗?事实上,从旋转向量到旋转矩阵的转换过程由罗德里格斯公式(Rodrigues’s Formula)表示。因为任意旋转都可以由一个旋转轴n和一个旋转角Θ刻画,故罗德里格斯公式具体形式如下:R=cosθI+(1−cosθ)nnT+sinθn∧(1.1)
符号∧是向量到反对称矩阵的转换符,见第一篇博客的公式(1.4)。
2.2 推导
首先,理解图1。定义向量k是旋转轴的单位矢量,为表示方便,使用k代表n。图中初始向量v以k为轴旋转角θ得到vrot。向量w为k×v的方向上的单位向量,向量v⊥和vrot⊥分别是v和vrot的垂直于平面的向量。向量a和b分别是vrot在w和v⊥方向上的分量。
图1.1:旋转向量3D图(推荐数学绘图软件:geogebra)
所谓推导旋转方程,实则求出一个旋转矩阵,使得Vrot=Rv,所以我们要做的就是找出vrot与v,并用矩阵来表示。
此公式有2种形式,故而也有2种推导方法,两者推导方法的不同主要在v⊥的表示上。具体推导过程如下。
2.2.1 推导一
推导一使用单位向量k表示,推导过程如下:
-
对v进行向量分解:v=v⊥+v∣∣
-
根据向量减法可得:v⊥=v−v∣∣
-
由旋转过程平行向量不变得:vrot∣∣=v∣∣
-
v∣∣其实就是v在u上的正交投影(Orthogonal Projection),根据正交投影公式:v∣∣=projk(v)=k⋅kk⋅vk=∣∣k∣∣2k⋅vk=(k⋅v)k
其中u⋅k=∣∣k∣∣2,∣∣k∣∣=1,(v⋅k)为标量,所以再乘向量k得到一个矢量
-
为计算方便,对vrot⊥ 进行向量分解:vrot⊥=a+b
-
由图中的向量关系经推导可得:a=sinθk×v,b=cosθv⊥,a,b的推导在后边
-
综上可得:
vrot=vrot⊥+vrot∣∣
=a+b+v∣∣
=sinθk×v+cosθv⊥+(v⋅k)k
=sinθk×v+cosθ(v−v∣∣)+(v⋅k)k
=sinθk×v+cosθ(v−(v⋅k)k)+(v⋅k)k
=cosθv+(1−cosθ)(v⋅k)k+sinθk×v
显然:到此步,我们还无法将其用矩阵来表示,所以需要对(v⋅k)k 和 k×v 进行矩阵转换,由点积的交换律和结合律得:(v⋅k)k=k⋅(v⋅k)=k⋅(kTv)=k⋅kTv其中的向量都是列向量,点积展开规则为:x⋅y=[x,y]=xTy。
对于k×v可用叉乘矩阵来化简为Kv:⎣⎡(k×v)x(k×v)y(k×v)z⎦⎤=⎣⎡kyvz−kzvykzvx−kxvzkxvy−kyvx⎦⎤=⎣⎡0kzky−kz0kxky−kx0⎦⎤⎣⎡vxvyvz⎦⎤=Kv
故vrot=cosθv+(1−cosθ)(v⋅k)k+sinθk×v
=cosθv+(1−cosθ)kkTv+sinθKv
=(cosθI+(1−cosθ)kkT+sinθK)v
故旋转矩阵R=cosθI+(1−cosθ)kkT+sinθK.(1.2)其中I为单位矩阵。
2.2.2 推导二
与推导一相比,推导二的不同主要在于用叉乘去表示一些数据。用叉乘来表示v⊥可得:v⊥=−k×(k×v)。
所以联立推导一中各式得:
vrot=vrot⊥+vrot∣∣
=a+b+v∣∣
=sinθk×v+cosθv⊥+v−v⊥
=sinθk×v−cosθk×(k×v)+v+k×(k×v)
=v+(1−cosθ)k×(k×v)+sinθk×v
=v+(1−cosθ)K2v+sinθKv(叉乘矩阵表示)
=(I+(1−cosθ)K2+sinθK)v
=Rv
从而得出第二种表达式R=I+(1−cosθ)K2+sinθK.(1.3)显然,第二种表达式更为简便,在计算的过程中涉及的参数更少,所以这也是在进行旋转操作时常用的公式。
2.2.3 推导a
向量a和b是由vrot⊥正交分解得到的矢量,既有大小又有方向,所以在求解时,我们要对其大小和方向分别求解。
大小
设θ1=π−θ,θ2是向量v和k的夹角,k为单位向量,则对于a的大小∣a∣有:
∣a∣=sinθ1∣vrot⊥∣=sinθ1∣v⊥∣
=sin(π−θ)∣v⊥∣=sinθ∣v⊥∣
=sinθsinθ2∣v∣
=sinθsinθ2∣v∣∣k∣
=sinθ∣k×v∣
由公式∣a×b∣=sinθ∣a∣∣b∣知sinθ2∣v∣∣k∣=∣k×v∣,所以:
∣a∣=sinθ∣k×v∣
方向
由叉乘方向可得a的单位方向向量为:k×v/∣k×v∣,综上可得:
a=(k×v/∣k×v∣)∣a∣
=(k×v/∣k×v∣)sinθ∣k×v∣
=sinθk×v
2.2.4 推导b
大小
由图得,θ1为b和vrot⊥的夹角,则:
∣b∣=cosθ1∣vrot⊥∣=cos(π−θ)∣v⊥∣=−cosθ∣v⊥∣
方向
由于b的方向与v⊥方向相反,可得b的单位方向向量为:−v⊥/∣v⊥∣,综上可得:
b=(−v⊥/∣v⊥∣)∣b∣
=cosθv⊥
至此,罗德里格斯公式的证明全部结束。此外,如果读者希望获得关于Oxyz座标系的旋转变换关系,可以参考这篇博客:图形变换之旋转变换公式推导。
罗德里格斯公式反应的是旋转向量到旋转矩阵的转换关系,如果已知旋转矩阵R,如果推导旋转向量v呢?下边给出旋转矩阵到旋转向量的反向转换关系。
3.旋转矩阵到向量
这里计算从一个旋转矩阵到旋转向量的转换。对于旋转角θ,取旋转矩阵R两边的迹,有:tr(R)=cosθtr(I)+(1−cosθ)tr(nnT)+sinθtr(n∧)=3cosθ+(1−cosθ)=1+2cosθ.(1.4)因此:θ=arccos2tr(R)−1.(1.5)关于转轴n,旋转轴上的向量在旋转后不发生改变,说明:Rn=n.(1.6)因此,转轴n是矩阵R特征值1对应的特征向量。求解此方程,再归一化,就得到了旋转轴n。由v=θn得到旋转向量v。
至此,推导结束。实践部分代码放到第三部分一起演示。
参考:
1.《视觉SLAM十四讲:从理论到实践》,高翔、张涛等著,中国工信出版社
2. 罗德里格斯公式推导