姿态(Attitude)用来描述两个坐标系之间的相对关系,一个点和一个坐标系没之间没法定义姿态,姿态必须是两个坐标系之间的事情。- 姿态的变化通常是通过
旋转(Rotation)来实现的,它建立了一个坐标系相对于另一个坐标系的旋转关系,描述物体如何围绕某个轴进行转动的过程。 - 姿态和旋转的关系可以通过
旋转矩阵、欧拉角、四元数、轴角等方式来描述,本文将对这些概念进行简要介绍。
旋转矩阵
2D
如下图所示,在座标系 $O-XY$ 中,已知点 $P(x, y)$,向量 $OP$ 与 $OX$ 轴的夹角为 $\theta$,则点 $P$ 绕原点 $O$ 逆时针旋转 $\alpha$ 角度后的坐标为 $P’(x’, y’)$,点 $p$、$p’$ 在 $x$ 轴、$y$ 轴上的投影分别为 $A$、$B$、$C$、$D$。
由于旋转,所以 $OP = OP’$,设其长度为 $r$,则有:
$$
\begin{aligned}
r = \sqrt{x^2 + y^2} = \sqrt{x’^2 + y’^2}
\end{aligned}
$$
在 $\triangle OAP$ 中,根据三角函数的定义,有:
$$
\begin{aligned}
\cos \beta = \frac{x}{r} \\
\sin \beta = \frac{y}{r}
\end{aligned}
$$
基于上述公式,在 $\triangle OCP’$ 中,有:
$$
\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}
$$
整理成矩阵相乘的形式,有:
$$
\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}
$$
上述矩阵即为二维旋转矩阵,通过该矩阵可以实现点 $P$ 绕原点 $O$ 逆时针旋转 $\alpha$ 角度后的坐标 $P’$ 的计算。
3D
在 $3D$ 空间中我们可以通过绕 $X$ 轴、$Y$ 轴、$Z$ 轴的旋转来实现任意的旋转。在推得 $2D$ 旋转矩阵的基础上,我们可以很快的得出 $3D$ 旋转矩阵。
绕 $Z$ 轴旋转
绕 $Z$ 轴逆时针旋转 $\alpha$ 角度,$Z$ 坐标不变,$X$、$Y$ 坐标变化可以根据 $2D$ 旋转矩阵直接给出:
$$
\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}
$$
绕 $X$ 轴旋转
绕 $X$ 轴逆时针旋转 $\alpha$ 角度,$X$ 坐标不变,$Y$、$Z$ 坐标变化可以根据 $2D$ 旋转矩阵直接给出:
$$
\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}
$$
绕 $Y$ 轴旋转
绕 $Y$ 轴逆时针旋转 $\alpha$ 角度,$Y$ 坐标不变,$X$、$Z$ 坐标变化可以根据 $2D$ 旋转矩阵直接给出:
$$
\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}
$$
据此,我们可以得到 $3D$ 坐标下绕各个轴旋转的旋转矩阵:
$
R_X(\alpha) =
\begin{bmatrix}
1 & 0 & 0 \\
0 & \cos \alpha & -\sin \alpha \\
0 & \sin \alpha & \cos \alpha
\end{bmatrix}
$这里的 $\alpha$ 是 roll 角, 绕 $X$ 轴旋转的角度,在$YZ$平面顺时针为正。
$
R_Y(\alpha) =
\begin{bmatrix}
\cos \alpha & 0 & \sin \alpha \\
0 & 1 & 0 \\
-\sin \alpha & 0 & \cos \alpha
\end{bmatrix}
$这里的 $\alpha$ 是 pitch 角, 绕 $Y$ 轴旋转的角度,在$XZ$平面顺时针为正。
$
R_Z(\alpha) =
\begin{bmatrix}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\
0 & 0 & 1
\end{bmatrix}
$这里的 $\alpha$ 是 yaw 角, 绕 $Z$ 轴旋转的角度,在$XY$平面顺时针为正。
任何三维旋转矩阵 $M \in \mathbb{R}^{3 \times 3}$ 都可以表示为上述三个旋转矩阵的乘积,即 $M = R_Z(\beta) \cdot R_Y(\alpha) \cdot R_X(\gamma)$。
欧拉角
欧拉角则提供了一种非常直观的方式来描述旋转——它使用了 3 个分离的转角,把一个旋转分解成 3 次绕不同轴的旋转,人类很容易理解绕单个轴旋转的过程。
但是,由于分解方式有许多种,所以欧拉角也存在着众多不同的、易于混淆的定义方法。
比如说,先绕 $X$ 轴旋转,再绕 $Y$ 轴,最后绕 $Z$ 轴,就得到了一个 $XYZ$ 轴的旋转。同理,可以定义 $ZYZ$、$ZYX$ 等旋转方式。如果讨论得更细一些,还需要区分每次是绕固定轴旋转的,还是绕旋转之后的轴旋转的,这也会给出不一样的定义方式。

上图所示是航空中常用的欧拉角定义方式,假设一个刚体的前方(朝向我们的方向)为 $X$ 轴,右侧为 $Y$ 轴,上方为 $Z$ 轴,先绕 $Z$ 轴(偏航)、再绕 $Y$ 轴(俯仰)、最后绕 $X$ 轴(滚转),$ZYX$ 转角相当于把任意旋转分解成以上面三个轴上的转角。
四元数
四元数的定义
一个四元数 $q$ 拥有一个实部和三个虚部。
$$
q = q_0 + q_1i + q_2j + q_3k
$$
其中 $i$、$j$、$k$ 是虚部,满足以下关系式:
$$
\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
加法
$$
\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 = (K_x, K_y, K_z)$ 进行了角度为 $\theta$ 的旋转,那么对应的四元数为:
$$
\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}
$$
且满足条件
$$
q_0^2 + q_1^2 + q_2^2 + q_3^2 = 1
$$
转换关系
欧拉角转换为旋转矩阵
某次旋转是绕 $Z$ 轴、$Y$ 轴、$X$ 轴分别旋转 $\alpha$、$\beta$、$\gamma$ 角度,那么对应的旋转矩阵为:
$$
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}
$$
欧拉角转换为四元数
某次旋转是绕 $Z$ 轴、$Y$ 轴、$X$ 轴分别旋转 $\alpha$、$\beta$、$\gamma$ 角度,那么对应的四元数为:
$$
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}
$$