姿态(Attitude)用来描述两个坐标系之间的相对关系,一个点和一个坐标系没之间没法定义姿态,姿态必须是两个坐标系之间的事情。
姿态的变化通常是通过旋转(Rotation)来实现的,它建立了一个坐标系相对于另一个坐标系的旋转关系,描述物体如何围绕某个轴进行转动的过程。
姿态和旋转的关系可以通过 旋转矩阵、欧拉角、四元数、轴角
等方式来描述,本文将对这些概念进行简要介绍。
旋转矩阵
2D
如下图所示,在座标系 O − X Y O-XY O − X Y 中,已知点 P ( x , y ) P(x, y) P ( x , y ) ,向量 O P OP OP 与 O X OX OX 轴的夹角为
θ \theta θ ,则点 P P P 绕原点 O O O 逆时针旋转 α \alpha α 角度后的坐标为 P ′ ( x ′ , y ′ ) P'(x', y') P ′ ( x ′ , y ′ ) ,点
p p p 、p ′ p' p ′ 在 x x x 轴、y y y 轴上的投影分别为 A A A 、B B B 、C C C 、D D D 。
由于旋转,所以 O P = O P ′ OP = OP' OP = O P ′ ,设其长度为 r r r ,则有:
r = x 2 + y 2 = x ′ 2 + y ′ 2 \begin{aligned}
r = \sqrt{x^2 + y^2} = \sqrt{x'^2 + y'^2}
\end{aligned}
r = x 2 + y 2 = x ′2 + y ′2
在 △ O A P \triangle OAP △ O A P 中,根据三角函数的定义,有:
cos β = x r sin β = y r \begin{aligned}
\cos \beta = \frac{x}{r} \\\\
\sin \beta = \frac{y}{r}
\end{aligned}
cos β = r x sin β = r y
基于上述公式,在 △ O C P ′ \triangle OCP' △ OC P ′ 中,有:
x ′ = r ∗ cos ( α + β ) = r ∗ ( cos α cos β − sin α sin β ) = x cos α − y sin α y ′ = r ∗ sin ( α + β ) = r ∗ ( sin α cos β + cos α sin β ) = x sin α + y cos α \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}
x ′ = r ∗ cos ( α + β ) = r ∗ ( cos α cos β − sin α sin β ) = x cos α − y sin α y ′ = r ∗ sin ( α + β ) = r ∗ ( sin α cos β + cos α sin β ) = x sin α + y cos α
整理成矩阵相乘的形式,有:
[ x ′ y ′ ] = [ cos α − sin α sin α cos α ] [ x y ] \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}
x ′ y ′ = cos α sin α − sin α cos α x y
上述矩阵即为二维旋转矩阵,通过该矩阵可以实现点 P P P 绕原点 O O O 逆时针旋转 α \alpha α
角度后的坐标 P ′ P' P ′ 的计算。
3D
在 3 D 3D 3 D 空间中我们可以通过绕 X X X 轴、Y Y Y 轴、Z Z Z 轴的旋转来实现任意的旋转。在推得 2 D 2D 2 D
旋转矩阵的基础上,我们可以很快的得出 3 D 3D 3 D 旋转矩阵。
绕 Z Z Z 轴旋转
绕 Z Z Z 轴逆时针旋转 α \alpha α 角度,Z Z Z 坐标不变,X X X 、Y Y Y 坐标变化可以根据 2 D 2D 2 D
旋转矩阵直接给出:
[ x ′ y ′ z ′ ] = [ cos α − sin α 0 sin α cos α 0 0 0 1 ] [ x y z ] \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 ′ y ′ z ′ = cos α sin α 0 − sin α cos α 0 0 0 1 x y z
绕 X X X 轴旋转
绕 X X X 轴逆时针旋转 α \alpha α 角度,X X X 坐标不变,Y Y Y 、Z Z Z 坐标变化可以根据 2 D 2D 2 D
旋转矩阵直接给出:
[ x y ′ z ′ ] = [ 1 0 0 0 cos α − sin α 0 sin α cos α ] [ x y z ] \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}
x y ′ z ′ = 1 0 0 0 cos α sin α 0 − sin α cos α x y z
绕 Y Y Y 轴旋转
绕 Y Y Y 轴逆时针旋转 α \alpha α 角度,Y Y Y 坐标不变,X X X 、Z Z Z 坐标变化可以根据 2 D 2D 2 D
旋转矩阵直接给出:
[ x ′ y z ′ ] = [ cos α 0 sin α 0 1 0 − sin α 0 cos α ] [ x y z ] \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}
x ′ y z ′ = cos α 0 − sin α 0 1 0 sin α 0 cos α x y z
据此,我们可以得到 3 D 3D 3 D 坐标下绕各个轴旋转的旋转矩阵:
R X ( α ) = [ 1 0 0 0 cos α − sin α 0 sin α cos α ]
R_X(\alpha) =
\begin{bmatrix}
1 & 0 & 0 \\\\
0 & \cos \alpha & -\sin \alpha \\\\
0 & \sin \alpha & \cos \alpha
\end{bmatrix}
R X ( α ) = 1 0 0 0 cos α sin α 0 − sin α cos α
这里的 α \alpha α 是 roll 角, 绕 X X X 轴旋转的角度,在 Y Z YZ Y Z 平面顺时针为正。
R Y ( α ) = [ cos α 0 sin α 0 1 0 − sin α 0 cos α ]
R_Y(\alpha) =
\begin{bmatrix}
\cos \alpha & 0 & \sin \alpha \\\\
0 & 1 & 0 \\\\
-\sin \alpha & 0 & \cos \alpha
\end{bmatrix}
R Y ( α ) = cos α 0 − sin α 0 1 0 sin α 0 cos α
这里的 α \alpha α 是 pitch 角, 绕 Y Y Y 轴旋转的角度,在 X Z XZ XZ 平面顺时针为正。
R Z ( α ) = [ cos α − sin α 0 sin α cos α 0 0 0 1 ]
R_Z(\alpha) =
\begin{bmatrix}
\cos \alpha & -\sin \alpha & 0 \\\\
\sin \alpha & \cos \alpha & 0 \\\\
0 & 0 & 1
\end{bmatrix}
R Z ( α ) = cos α sin α 0 − sin α cos α 0 0 0 1
这里的 α \alpha α 是 yaw 角, 绕 Z Z Z 轴旋转的角度,在 X Y XY X Y 平面顺时针为正。
任何三维旋转矩阵 M ∈ R 3 × 3 M \in \mathbb{R}^{3 \times 3} M ∈ R 3 × 3 都可以表示为上述三个旋转矩阵的乘积,即
M = R Z ( β ) ⋅ R Y ( α ) ⋅ R X ( γ ) M = R_Z(\beta) \cdot R_Y(\alpha) \cdot R_X(\gamma) M = R Z ( β ) ⋅ R Y ( α ) ⋅ R X ( γ ) 。
欧拉角
欧拉角则提供了一种非常直观的方式来描述旋转——它使用了 3 个分离的转角,把一个旋转分解成 3 次绕不同轴的旋转,人类很容易理解绕单个轴旋转的过程。
但是,由于分解方式有许多种,所以欧拉角也存在着众多不同的、易于混淆的定义方法。比如说,先绕
X X X 轴旋转,再绕 Y Y Y 轴,最后绕 Z Z Z 轴,就得到了一个 X Y Z XYZ X Y Z 轴的旋转。同理,可以定义
Z Y Z ZYZ Z Y Z 、Z Y X ZYX Z Y X
等旋转方式。如果讨论得更细一些,还需要区分每次是绕固定轴旋转的,还是绕旋转之后的轴旋转的,这也会给出不一样的定义方式。
上图所示是航空 中常用的欧拉角定义方式,假设一个刚体的前方(朝向我们的方向)为
X X X 轴,右侧为 Y Y Y 轴,上方为 Z Z Z 轴,先绕 Z Z Z 轴(偏航)、再绕 Y Y Y 轴(俯仰)、最后绕
X X X 轴(滚转),Z Y X ZYX Z Y X 转角相当于把任意旋转分解成以上面三个轴上的转角。
四元数
四元数的定义
一个四元数 q q q 拥有一个实部和三个虚部。
q = q 0 + q 1 i + q 2 j + q 3 k q = q_0 + q_1i + q_2j + q_3k
q = q 0 + q 1 i + q 2 j + q 3 k
其中 i i i 、j j j 、k k k 是虚部,满足以下关系式:
{ i 2 = j 2 = k 2 = i j k = − 1 i j = k , j i = − k j k = i , k j = − i k i = j , i k = − 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}
⎩ ⎨ ⎧ i 2 = j 2 = k 2 = ijk = − 1 ij = k , ji = − k jk = i , kj = − i ki = j , ik = − j
四元数的运算
可类比与复数的运算,具体参见:https://www.youtube.com/watch?v=zGg-j0SIxzY
加法
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 \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}
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
四元数表示旋转
四元数的定义有了,那么如何用四元数表示旋转呢?
如果某次旋转是绕向量 K = ( K x , K y , K z ) K = (K_x, K_y, K_z) K = ( K x , K y , K z ) 进行了角度为 θ \theta θ
的旋转,那么对应的四元数为:
{ q 0 = cos θ 2 q 1 = K x sin θ 2 q 2 = K y sin θ 2 q 3 = K z sin θ 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}
⎩ ⎨ ⎧ q 0 = cos 2 θ q 1 = K x sin 2 θ q 2 = K y sin 2 θ q 3 = K z sin 2 θ
且满足条件
q 0 2 + q 1 2 + q 2 2 + q 3 2 = 1 q_0^2 + q_1^2 + q_2^2 + q_3^2 = 1
q 0 2 + q 1 2 + q 2 2 + q 3 2 = 1
转换关系
欧拉角转换为旋转矩阵
某次旋转是绕 Z Z Z 轴、Y Y Y 轴、X X X 轴分别旋转 α \alpha α 、β \beta β 、γ \gamma γ
角度,那么对应的旋转矩阵为:
R = R Z ( α ) ⋅ R Y ( β ) ⋅ R X ( γ ) = [ 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}
R = R Z ( α ) ⋅ R Y ( β ) ⋅ R X ( γ ) = cos α cos β sin α cos β − sin β cos α sin β sin γ − sin α cos γ sin α sin β sin γ + cos α cos γ cos β sin γ cos α sin β cos γ + sin α sin γ sin α sin β cos γ − cos α sin γ cos β cos γ
欧拉角转换为四元数
某次旋转是绕 Z Z Z 轴、Y Y Y 轴、X X X 轴分别旋转 α \alpha α 、β \beta β 、γ \gamma γ
角度,那么对应的四元数为:
q = [ q 0 q 1 q 2 q 3 ] = [ cos α 2 cos β 2 cos γ 2 + sin α 2 sin β 2 sin γ 2 sin α 2 cos β 2 cos γ 2 − cos α 2 sin β 2 sin γ 2 cos α 2 sin β 2 cos γ 2 + sin α 2 cos β 2 sin γ 2 cos α 2 cos β 2 sin γ 2 − sin α 2 sin β 2 cos γ 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}
q = q 0 q 1 q 2 q 3 = cos 2 α cos 2 β cos 2 γ + sin 2 α sin 2 β sin 2 γ sin 2 α cos 2 β cos 2 γ − cos 2 α sin 2 β sin 2 γ cos 2 α sin 2 β cos 2 γ + sin 2 α cos 2 β sin 2 γ cos 2 α cos 2 β sin 2 γ − sin 2 α sin 2 β cos 2 γ