本篇继续参照高翔老师《视觉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⋅k)k,其中
(v⋅k)为标量,所以再乘向量
k得到一个矢量
- 根据向量减法可得:
v⊥=v−v∣∣
- 由旋转过程平行向量不变得:
vrot∣∣=v∣∣
- 为计算方便,对
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. 罗德里格斯公式推导