1. 旋转矩阵
一个刚体在三维空间中的运动由一次旋转加一次平移组成。本文主要介绍旋转矩阵、欧拉角、四元数的意义,以及他们是如何运算和转化的。
1.1 点和向量、坐标系
在三维空间中,刚体不仅有位置还有姿态。比如相机,我们可以说相机位于世界坐标系的(0, 0, 0)处(位置),朝向正前方(姿态)。
向量(也称为欧几里得向量、几何向量、矢量),指具有大小和方向的量。三维空间中某个向量的坐标可以用
R3
中的3个数来描述。如果确定了坐标系,也就是线性空间的基
(e1,e2,e3)
,那么向量
a⃗
在这组基下的坐标可以表示为:
a⃗ =[e1,e2,e3]⎡⎣⎢a1a2a3⎤⎦⎥=a1⋅e1+a2⋅e2+a3⋅e3.(3.1)
对于
a⃗ ,b⃗ ∈R3
,向量的
内积可以表示为:
a⃗ ⋅b⃗ =a⃗ T⋅b⃗ =∑i=13ai⋅bi=|a|⋅|b|⋅cos<a,b>.(3.2)
内积可以表示向量间的投影关系。
向量的
外积表示为:
a⃗ ×b⃗ =∣∣∣∣∣∣∣∣ia1b1ja2b2ka3b3∣∣∣∣∣∣∣∣=⎡⎣⎢a2⋅b3−a3⋅b2a3⋅b1−a1⋅b3a1⋅b2−a2⋅b1⎤⎦⎥=⎡⎣⎢0a3−a2−a30a1a2−a10⎤⎦⎥⋅b⃗ =a⃗ s⋅b⃗ .(3.3)
外积的方向垂直于上面两个向量,大小为
|a⃗ |⋅|b⃗ |⋅sin<a,b>
。对于外积,本文引入了
a⃗ s
来表示基于
a⃗
的
反对称矩阵。外积只对三维向量存在定义,此外还能使用外积来表示旋转。
反对称矩阵的定义:设
A
为
n
阶方阵,若有
AT=−A
,则称方阵
A
为反对称矩阵。
1.2 坐标系间的欧式变换
我们以旋转加平移来描述两个坐标系之间的变换关系。在刚体的运动过程中,常见的做法是设定一个世界坐标系(或者叫惯性坐标系),可以认为它是固定不动的。同时,刚体则是一个移动坐标系。
刚体运动保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化。其在各个坐标系之间的变换称为欧式变换。欧式变换由一个旋转加一个平移组成。
首先考虑旋转。设某个单位正交基
(e1,e2,e3)
经过一次旋转变成了
(e′1,e′2,e′3)
。那么对于同一个向量
a⃗
(该向量并没有随着坐标系的旋转而发生运动),它在两个坐标系下的坐标为
[a1,a2,a3]T
和
[a′1,a′2,a′3]T
。根据坐标的定义有:
[e1,e2,e3]⎡⎣⎢a1a2a3⎤⎦⎥=(e′1,e′2,e′3)⎡⎣⎢a′1a′2a′3⎤⎦⎥.(3.4)
对上述
3.4
式左右两边同时左乘
⎡⎣⎢e1e2e3⎤⎦⎥
,可得:
⎡⎣⎢a1a2a3⎤⎦⎥=⎡⎣⎢⎢eT1⋅e′1eT2⋅e′1eT3⋅e′1eT1⋅e′2eT2⋅e′2eT3⋅e′2eT1⋅e′3eT2⋅e′3eT3⋅e′3⎤⎦⎥⎥⎡⎣⎢a′1a′2a′3⎤⎦⎥=R⋅a⃗ ′.(3.5)
由式
3.5
可知
R
描述了旋转关系,因此被称为
旋转矩阵。事实上,
R
是一个行列式为1的
正交矩阵(逆为其自身转置的矩阵),反之,行列式为1的正交矩阵也是一个旋转矩阵。综上,旋转矩阵的集合定义如下:
SO(n)={R∈Rn∗n|RRT=I,det(R)=1}.(3.6)
SO(n)
是特殊正交群(Special Orthogonal Group)的意思。特别地,
SO(3)
就是三维空间的旋转了。也就是,旋转矩阵可以描述刚体的旋转。
由于旋转矩阵是正交矩阵,它的逆描述了一个相反的旋转。因此可得:
a⃗ ′=R−1a⃗ =RTa⃗ (3.7)
显然
RT
是一个相反的旋转。
对于欧式变换来说,除了旋转外一般还有平移。我们使用平移向量
t
来表示平移,则一个完整的欧式空间的坐标变换如下:
a⃗ ′=a⃗ =Ra⃗ +t.(3.8)
1.3 变换矩阵与齐次坐标
式
3.8
完整的表达了欧式空间的旋转与平移,但是该变换并不是一个线性变换。假如我们进行了两次变换:
R1,t1
和
R2,t2
,满足:
b⃗ =R1⋅a⃗ +t1→,c⃗ =R2⋅b⃗ +t2→.
则
a
到
c
的变换为:
c⃗ =R2(R1⋅a⃗ +t1→)+t2→.
在经过多次变换后上式会显得非常复杂。因此,本文引入齐次坐标和变换矩阵重写式
(3.8)
:
[a′→1]=[R0Tt⃗ 1][a⃗ 1]=T[a⃗ 1].(3.9)
如式
(3.9)
所示,我们在每一个三维向量的末尾添加1,将其变为四维向量,称为
齐次坐标。其中矩阵
T
称为
变换矩阵(Transform Matrix),变换矩阵左上角为旋转矩阵,右侧为平移向量,左下角为
0
向量,右下角为1。我们暂时用
a¯¯¯⃗
表示
a⃗
的齐次坐标。由齐次坐标和变换矩阵可得:
b¯¯⃗ =T1⋅a¯¯¯⃗ ,c¯¯⃗ =T2⋅b¯¯⃗ =T2⋅T1⋅a¯¯¯⃗ .(3.10)
此外由式
(3.9)
表示的变换矩阵
T
又称为
特殊欧式群(Special Euclidean Group):
SE(3)={T=[R0Tt⃗ 1]∈R4∗4|R∈SO(3),t⃗ ∈R3}.(3.11)
2. 旋转向量和欧拉角
SO(3)
的旋转矩阵有9个量,但是一次旋转只有3个自由度。同样,变换矩阵用16个量来表示6个自由度(旋转加平移)的变换。因此这种方式是冗余的。此外旋转矩阵和变换矩阵都带了其他一些额外约束。
2.1 旋转向量
对于坐标系的旋转,可以用一个旋转轴和一个旋转角来刻画。于是,我们使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这样的向量称为旋转向量(或轴角)。
对于变换矩阵,我们使用一个旋转向量和一个平移向量即可表达一次变换。假设有一个旋转轴为
n
,角度为
θ
的旋转,那么它对应的旋转向量为
θn
。
从旋转向量到旋转矩阵的转换过程由罗德里格斯公式表明,如下为转换结果:
R=cosθ⋅I⃗ +(1−cosθ)⋅nnT+sinθ⋅ns(3.12)
符号
s
是向量到反对称的转换符。
对于转角
θ
,有:
θ=arccos(tr(R)−1/2)(3.13)
关于转轴
n
,由于旋转轴上的向量在旋转后不发生改变,有以下:
R⋅n=n(3.14)
由此可见,转轴
n
是矩阵
R
特征值为1对顶的特征向量。
2.2 欧拉角
欧拉角提供了一种直观的方式来描述旋转,它使用3个分离的转角,把一个旋转分解成3次绕不同的轴的旋转。欧拉角当中比较常用的一种便是用“偏航-俯仰-滚转(yaw-pitch-roll)”3个角度来描述一个旋转的,该旋转等价于ZYX轴的旋转。ZYX转角相当于把任意旋转分解成以下3个轴上的轴角:
1. 绕物体的Z轴旋转,得到偏航角yaw;
2. 绕旋转之后的Y轴旋转,得到俯仰角pitch;
3. 绕旋转之后的X轴旋转,得到滚转角roll;
欧拉角的一个重大确定是会碰到著名的万向锁问题:当俯仰角为
±90。
时,第一次旋转与第三次旋转将使用同一个轴,这会导致系统丢失一个自由度。
2.3 四元数
关于四元数的定义以及运算可参考如下两篇博客:
1. 中文版 https://www.qiujiawei.com/understanding-quaternions/
2. 英文版 https://www.3dgep.com/understanding-quaternions/
2.3.1 用四元数表示旋转
我们可以用四元数表达对一个点的旋转。假设一个空间三维点
p=[x,y,z]∈R3
,以及一个轴角
n,θ
指定的旋转。三维点
p
经过旋转之后变为
p′
。使用四元数来描述这个旋转。首先,将三维空间点用一个虚四元数来表示:
p=[0,x,y,z]=[0,v].
然后用四元数
q
来表示这个旋转:
q=[cosθ2,n⋅sinθ2]
那么,旋转后的
p′
即可表示为如下式:
p′=qpq−1(3.15)
可以验证。式
(3.15)
计算得出的结果为
0
,故为纯虚四元数。其虚部的3个分量表示旋转后3D点的坐标。
2.3.2 四元数到旋转矩阵的转换
设四元数
q=q0+q1⋅i+q2⋅j+q3⋅k
,则对应的旋转矩阵
R
为
R=⎡⎣⎢⎢1−2q22−2q232q1q2+2q0q32q1q3−2q0q22q1q2−2q0q31−2q21−2q232q2q3+2q0q12q1q3+2q0q22q2q3−2q0q11−2q21−2q22⎤⎦⎥⎥(3.16)
反之,由旋转矩阵到四元数的转换如下。假设矩阵
R=mij,i,j∈[1,2,3]
,其对应的四元数
q
由下式给出:
q0=tr(R)+1−−−−−−−−√2,q1=m23−m324q0,q2=m31−m134q0,q3=m12−m214q0(3.17)