姿态、旋转、欧拉角和四元数

  • 姿态(Attitude)用来描述两个坐标系之间的相对关系,一个点和一个坐标系没之间没法定义姿态,姿态必须是两个坐标系之间的事情。
  • 姿态的变化通常是通过旋转(Rotation)来实现的,它建立了一个坐标系相对于另一个坐标系的旋转关系,描述物体如何围绕某个轴进行转动的过程。
  • 姿态和旋转的关系可以通过 旋转矩阵欧拉角四元数轴角 等方式来描述,本文将对这些概念进行简要介绍。

旋转矩阵

2D

如下图所示,在座标系 OXYO-XY 中,已知点 P(x,y)P(x, y),向量 OPOPOXOX 轴的夹角为 θ\theta,则点 PP 绕原点 OO 逆时针旋转 α\alpha 角度后的坐标为 P(x,y)P'(x', y'),点 pppp'xx 轴、yy 轴上的投影分别为 AABBCCDD

由于旋转,所以 OP=OPOP = OP',设其长度为 rr,则有:

r=x2+y2=x2+y2\begin{aligned} r = \sqrt{x^2 + y^2} = \sqrt{x'^2 + y'^2} \end{aligned}

OAP\triangle OAP 中,根据三角函数的定义,有:

cosβ=xrsinβ=yr\begin{aligned} \cos \beta = \frac{x}{r} \\\\ \sin \beta = \frac{y}{r} \end{aligned}

基于上述公式,在 OCP\triangle OCP' 中,有:

x=rcos(α+β)=r(cosαcosβsinαsinβ)=xcosαysinαy=rsin(α+β)=r(sinαcosβ+cosαsinβ)=xsinα+ycosα\begin{aligned} x' = r * \cos(\alpha + \beta) = r * (\cos \alpha \cos \beta - \sin \alpha \sin \beta) = x \cos \alpha - y \sin \alpha \\\\ y' = r * \sin(\alpha + \beta) = r * (\sin \alpha \cos \beta + \cos \alpha \sin \beta) = x \sin \alpha + y \cos \alpha \end{aligned}

整理成矩阵相乘的形式,有:

[xy]=[cosαsinαsinαcosα][xy]\begin{aligned} \begin{bmatrix} x' \\\\ y' \end{bmatrix} = \begin{bmatrix} \cos \alpha & -\sin \alpha \\\\ \sin \alpha & \cos \alpha \end{bmatrix} \begin{bmatrix} x \\\\ y \end{bmatrix} \end{aligned}

上述矩阵即为二维旋转矩阵,通过该矩阵可以实现点 PP 绕原点 OO 逆时针旋转 α\alpha 角度后的坐标 PP' 的计算。

3D

3D3D 空间中我们可以通过绕 XX 轴、YY 轴、ZZ 轴的旋转来实现任意的旋转。在推得 2D2D 旋转矩阵的基础上,我们可以很快的得出 3D3D 旋转矩阵。

ZZ 轴旋转

ZZ 轴逆时针旋转 α\alpha 角度,ZZ 坐标不变,XXYY 坐标变化可以根据 2D2D 旋转矩阵直接给出:

[xyz]=[cosαsinα0sinαcosα0001][xyz]\begin{aligned} \begin{bmatrix} x' \\\\ y' \\\\ z' \end{bmatrix} = \begin{bmatrix} \cos \alpha & -\sin \alpha & 0 \\\\ \sin \alpha & \cos \alpha & 0 \\\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\\\ y \\\\ z \end{bmatrix} \end{aligned}

XX 轴旋转

XX 轴逆时针旋转 α\alpha 角度,XX 坐标不变,YYZZ 坐标变化可以根据 2D2D 旋转矩阵直接给出:

[xyz]=[1000cosαsinα0sinαcosα][xyz]\begin{aligned} \begin{bmatrix} x \\\\ y' \\\\ z' \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\\\ 0 & \cos \alpha & -\sin \alpha \\\\ 0 & \sin \alpha & \cos \alpha \end{bmatrix} \begin{bmatrix} x \\\\ y \\\\ z \end{bmatrix} \end{aligned}

YY 轴旋转

YY 轴逆时针旋转 α\alpha 角度,YY 坐标不变,XXZZ 坐标变化可以根据 2D2D 旋转矩阵直接给出:

[xyz]=[cosα0sinα010sinα0cosα][xyz]\begin{aligned} \begin{bmatrix} x' \\\\ y \\\\ z' \end{bmatrix} = \begin{bmatrix} \cos \alpha & 0 & \sin \alpha \\\\ 0 & 1 & 0 \\\\ -\sin \alpha & 0 & \cos \alpha \end{bmatrix} \begin{bmatrix} x \\\\ y \\\\ z \end{bmatrix} \end{aligned}


据此,我们可以得到 3D3D 坐标下绕各个轴旋转的旋转矩阵:

RX(α)=[1000cosαsinα0sinαcosα] R_X(\alpha) = \begin{bmatrix} 1 & 0 & 0 \\\\ 0 & \cos \alpha & -\sin \alpha \\\\ 0 & \sin \alpha & \cos \alpha \end{bmatrix}

这里的 α\alpha 是 roll 角, 绕 XX 轴旋转的角度,在 YZYZ 平面顺时针为正。

RY(α)=[cosα0sinα010sinα0cosα] R_Y(\alpha) = \begin{bmatrix} \cos \alpha & 0 & \sin \alpha \\\\ 0 & 1 & 0 \\\\ -\sin \alpha & 0 & \cos \alpha \end{bmatrix}

这里的 α\alpha 是 pitch 角, 绕 YY 轴旋转的角度,在 XZXZ 平面顺时针为正。

RZ(α)=[cosαsinα0sinαcosα0001] R_Z(\alpha) = \begin{bmatrix} \cos \alpha & -\sin \alpha & 0 \\\\ \sin \alpha & \cos \alpha & 0 \\\\ 0 & 0 & 1 \end{bmatrix}

这里的 α\alpha 是 yaw 角, 绕 ZZ 轴旋转的角度,在 XYXY 平面顺时针为正。

任何三维旋转矩阵 MR3×3M \in \mathbb{R}^{3 \times 3} 都可以表示为上述三个旋转矩阵的乘积,即 M=RZ(β)RY(α)RX(γ)M = R_Z(\beta) \cdot R_Y(\alpha) \cdot R_X(\gamma)


欧拉角

欧拉角则提供了一种非常直观的方式来描述旋转——它使用了 3 个分离的转角,把一个旋转分解成 3 次绕不同轴的旋转,人类很容易理解绕单个轴旋转的过程。

但是,由于分解方式有许多种,所以欧拉角也存在着众多不同的、易于混淆的定义方法。比如说,先绕 XX 轴旋转,再绕 YY 轴,最后绕 ZZ 轴,就得到了一个 XYZXYZ 轴的旋转。同理,可以定义 ZYZZYZZYXZYX 等旋转方式。如果讨论得更细一些,还需要区分每次是绕固定轴旋转的,还是绕旋转之后的轴旋转的,这也会给出不一样的定义方式。

偏航 − 俯仰 − 滚转(yaw-pitch-roll) 上图所示是航空中常用的欧拉角定义方式,假设一个刚体的前方(朝向我们的方向)为 XX 轴,右侧为 YY 轴,上方为 ZZ 轴,先绕 ZZ 轴(偏航)、再绕 YY 轴(俯仰)、最后绕 XX 轴(滚转),ZYXZYX 转角相当于把任意旋转分解成以上面三个轴上的转角。

四元数

四元数的定义

一个四元数 qq 拥有一个实部和三个虚部。

q=q0+q1i+q2j+q3kq = q_0 + q_1i + q_2j + q_3k

其中 iijjkk 是虚部,满足以下关系式:

{i2=j2=k2=ijk=1ij=k,ji=kjk=i,kj=iki=j,ik=j\begin{cases} i^2 = j^2 = k^2 = ijk = -1 \\\\ ij = k, ji = -k \\\\ jk = i, kj = -i \\\\ ki = j, ik = -j \end{cases}

四元数的运算

可类比与复数的运算,具体参见:https://www.youtube.com/watch?v=zGg-j0SIxzY

加法

q1+q2=(q10+q20)+(q11+q21)i+(q12+q22)j+(q13+q23)k\begin{aligned} q_1 + q_2 = (q_{1_0} + q_{2_0}) + (q_{1_1} + q_{2_1})i + (q_{1_2} + q_{2_2})j + (q_{1_3} + q_{2_3})k \end{aligned}

四元数表示旋转

四元数的定义有了,那么如何用四元数表示旋转呢?

如果某次旋转是绕向量 K=(Kx,Ky,Kz)K = (K_x, K_y, K_z) 进行了角度为 θ\theta 的旋转,那么对应的四元数为:

{q0=cosθ2q1=Kxsinθ2q2=Kysinθ2q3=Kzsinθ2\begin{cases} q_0 = \cos \frac{\theta}{2} \\\\ q_1 = K_x \sin \frac{\theta}{2} \\\\ q_2 = K_y \sin \frac{\theta}{2} \\\\ q_3 = K_z \sin \frac{\theta}{2} \end{cases}

且满足条件

q02+q12+q22+q32=1q_0^2 + q_1^2 + q_2^2 + q_3^2 = 1

转换关系

欧拉角转换为旋转矩阵

某次旋转是绕 ZZ 轴、YY 轴、XX 轴分别旋转 α\alphaβ\betaγ\gamma 角度,那么对应的旋转矩阵为:

R=RZ(α)RY(β)RX(γ)=[cosαcosβcosαsinβsinγsinαcosγcosαsinβcosγ+sinαsinγsinαcosβsinαsinβsinγ+cosαcosγsinαsinβcosγcosαsinγsinβcosβsinγcosβcosγ]R = R_Z(\alpha) \cdot R_Y(\beta) \cdot R_X(\gamma) = \begin{bmatrix} \cos \alpha \cos \beta & \cos \alpha \sin \beta \sin \gamma - \sin \alpha \cos \gamma & \cos \alpha \sin \beta \cos \gamma + \sin \alpha \sin \gamma \\\\ \sin \alpha \cos \beta & \sin \alpha \sin \beta \sin \gamma + \cos \alpha \cos \gamma & \sin \alpha \sin \beta \cos \gamma - \cos \alpha \sin \gamma \\\\ -\sin \beta & \cos \beta \sin \gamma & \cos \beta \cos \gamma \end{bmatrix}

欧拉角转换为四元数

某次旋转是绕 ZZ 轴、YY 轴、XX 轴分别旋转 α\alphaβ\betaγ\gamma 角度,那么对应的四元数为:

q=[q0q1q2q3]=[cosα2cosβ2cosγ2+sinα2sinβ2sinγ2sinα2cosβ2cosγ2cosα2sinβ2sinγ2cosα2sinβ2cosγ2+sinα2cosβ2sinγ2cosα2cosβ2sinγ2sinα2sinβ2cosγ2]q = \begin{bmatrix} q_0 \\\\ q_1 \\\\ q_2 \\\\ q_3 \end{bmatrix} = \begin{bmatrix} \cos \frac{\alpha}{2} \cos \frac{\beta}{2} \cos \frac{\gamma}{2} + \sin \frac{\alpha}{2} \sin \frac{\beta}{2} \sin \frac{\gamma}{2} \\\\ \sin \frac{\alpha}{2} \cos \frac{\beta}{2} \cos \frac{\gamma}{2} - \cos \frac{\alpha}{2} \sin \frac{\beta}{2} \sin \frac{\gamma}{2} \\\\ \cos \frac{\alpha}{2} \sin \frac{\beta}{2} \cos \frac{\gamma}{2} + \sin \frac{\alpha}{2} \cos \frac{\beta}{2} \sin \frac{\gamma}{2} \\\\ \cos \frac{\alpha}{2} \cos \frac{\beta}{2} \sin \frac{\gamma}{2} - \sin \frac{\alpha}{2} \sin \frac{\beta}{2} \cos \frac{\gamma}{2} \end{bmatrix}