摘要 攻角与俯仰角对应,侧滑角与偏航角对应,倾侧角与横滚角对应,但它们并不完全一样。攻角、侧滑角、倾侧角好像没有统一的名字,本文为了方便起见称它们为气动角。欧拉角定义在世界坐标系上,气动角定义在速度坐标系上。除了坐标系定义的区别以外还有细节上的不同,假如世界系与速度系重合,两者也并不完全一样。
欧拉角和气动角定义
关于3个坐标轴的方向,本文使用传统的坐标系定义,也就是xyz轴分别朝后右上,但航空航天相关的专业书中在讲气动角时,为了让x轴与速度向量重合,用的坐标系是xyz轴分别朝前上右,甚至还有用前右下的,但好在都是右手系。书上在讲原理时为了能解释更清楚方便采用了x轴朝前的定义,但在写程序时,常见的旋转矩阵转欧拉角的代码又是用的传统坐标系定义x轴朝后,我因为要写程序所以本文统一采用传统定义。
先说欧拉角的定义。欧拉角有12种,也就是说同样是描述同一个姿态,四元数和旋转矩阵都是唯一的(四元数默认取旋转角<180°那个),但它的横滚角可能既是10°也是11°又是12°。本文使用ZYX转序的欧拉角。
!以下内容待核对↓
- 横滚角 ϕ \phi ϕ 定义为本体系x轴所在铅垂面和本体系纵向对称面之间的夹角,沿x轴看去逆时针为正,也就是左倾为正。
- 俯仰角 θ \theta θ 定义为本体系x轴与世界系水平面(XOY平面)之间的夹角,沿y轴看去逆时针为正,也就是抬头为正。
- 偏航角 ψ \psi ψ 定义为本体系x轴在世界系水平面上的投影与世界系x轴之间夹角,沿z轴看去逆时针为正,也就是左偏为正。
再说气动角的定义,这里要引入跟速度相关的两个坐标系。半速度系和速度系的x轴都与飞行器速度方向相反,两个系的z轴分别位于世界系的铅垂面内朝上和本体系的纵向对称面内朝上,y轴都朝右。当飞行器速度方向始终朝前保持不变时,半速度系与世界系重合(只看方向不看原点坐标)。
- 攻角 α \alpha α 定义为速度方向在本体系纵向对称面(XOZ平面)上的投影与速度方向之间的夹角;
- 侧滑角 β \beta β 定义为速度方向与本体系纵向对称面之间的夹角;
- 倾侧角 σ \sigma σ 定义为半速度系和速度系的z轴之间的夹角,又称为速度滚转角。
- 有些场景还有总攻角的概念,总攻角定义为本体系和速度系的两个x轴之间的夹角,两个x轴所在的平面称作总攻角平面。
!以上内容待核对↑
只从定义上难以看出欧拉角和气动角的区别,举个例子,当横滚角左偏90°的时候,此时飞机再抬头 α \alpha α,则此时的攻角就是 α \alpha α, 但因为机头仍然在水平面上,所以俯仰角仍然是0°。另一方面,侧滑角和和俯仰角都是向量和平面的夹角,而攻角和偏航角都有向量到平面的投影,只是向量和平面各不同。
欧拉角/气动角和旋转矩阵的转换
下面列出的公式都是主流的通用公式,要遵循两个条件:xyz轴分别朝后右上,以及欧拉角为ZYX转序。
欧拉角转旋转矩阵公式如下
R
=
R
z
R
y
R
x
=
[
cos
y
−
sin
y
0
sin
y
cos
y
0
0
0
1
]
[
cos
p
0
sin
p
0
1
0
−
sin
p
0
cos
p
]
[
1
0
0
0
cos
r
−
sin
r
0
sin
r
cos
r
]
=
[
cos
α
cos
β
sin
α
sin
σ
cos
β
−
sin
β
cos
σ
sin
α
cos
β
cos
σ
+
sin
β
sin
σ
sin
β
cos
α
sin
α
sin
β
sin
σ
+
cos
β
cos
σ
sin
α
sin
β
cos
σ
−
sin
σ
cos
β
−
sin
α
sin
σ
cos
α
cos
α
cos
σ
]
R=R_zR_yR_x=\begin{bmatrix} \cos y & -\sin y & 0 \\ \sin y & \cos y & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} \cos p & 0 & \sin p \\ 0 & 1 & 0 \\ -\sin p & 0 & \cos p \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos r & -\sin r \\ 0 & \sin r & \cos r \\ \end{bmatrix} \\ =\begin{bmatrix} \cos\alpha\cos\beta&\sin\alpha\sin\sigma\cos\beta-\sin\beta\cos\sigma&\sin\alpha\cos\beta\cos\sigma+\sin\beta\sin\sigma\\ \sin\beta\cos\alpha&\sin\alpha\sin\beta\sin\sigma+\cos\beta\cos\sigma&\sin\alpha\sin\beta\cos\sigma-\sin\sigma\cos\beta\\ -\sin\alpha&\sin\sigma\cos\alpha&\cos\alpha\cos\sigma\end{bmatrix}
R=RzRyRx=
cosysiny0−sinycosy0001
cosp0−sinp010sinp0cosp
1000cosrsinr0−sinrcosr
=
cosαcosβsinβcosα−sinαsinαsinσcosβ−sinβcosσsinαsinβsinσ+cosβcosσsinσcosαsinαcosβcosσ+sinβsinσsinαsinβcosσ−sinσcosβcosαcosσ
气动角转旋转矩阵公式如下
R
=
R
x
R
z
R
y
=
[
1
0
0
0
cos
b
−
sin
b
0
sin
b
cos
b
]
[
cos
s
,
−
sin
s
0
sin
s
,
cos
s
0
0
0
1
]
[
cos
a
0
sin
a
0
1
0
−
sin
a
0
cos
a
]
=
[
cos
α
cos
β
−
sin
β
sin
α
cos
β
sin
α
sin
σ
+
sin
β
cos
α
cos
σ
cos
β
cos
σ
sin
α
sin
β
cos
σ
−
sin
σ
cos
α
−
sin
α
cos
(
σ
)
+
sin
β
sin
σ
cos
α
sin
σ
cos
β
sin
α
sin
β
sin
σ
+
cos
α
cos
σ
]
R=R_xR_zR_y=\begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos b & -\sin b \\ 0 & \sin b & \cos b \\ \end{bmatrix} \begin{bmatrix} \cos s, & -\sin s & 0 \\ \sin s, & \cos s & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} \cos a & 0 & \sin a \\ 0 & 1 & 0 \\ -\sin a & 0 & \cos a \\ \end{bmatrix} \\ =\begin{bmatrix} \cos\alpha\cos\beta&-\sin\beta&\sin\alpha\cos\beta\\ \sin\alpha\sin\sigma+\sin\beta\cos\alpha \cos\sigma&\cos\beta\cos\sigma&\sin\alpha\sin\beta\cos\sigma-\sin\sigma\cos\alpha\\ -\sin\alpha\cos{\left(\sigma \right)}+\sin\beta\sin\sigma\cos\alpha&\sin\sigma\cos\beta&\sin\alpha\sin\beta\sin\sigma+\cos\alpha\cos\sigma \end{bmatrix}
R=RxRzRy=
1000cosbsinb0−sinbcosb
coss,sins,0−sinscoss0001
cosa0−sina010sina0cosa
=
cosαcosβsinαsinσ+sinβcosαcosσ−sinαcos(σ)+sinβsinσcosα−sinβcosβcosσsinσcosβsinαcosβsinαsinβcosσ−sinσcosαsinαsinβsinσ+cosαcosσ
已知本体系到世界系的旋转矩阵,求欧拉角的公式为
rol=arctan2(r32, r33); // 横滚角φ
pit=arcsin(-r31); // 俯仰角θ
yaw=arctan2(r21, r11); // 偏航角ψ
已知本体系到半速度系的旋转矩阵,求气动角的公式为
bank = arctan2(r32,r22) // 倾侧角σ
attack = arctan2(r13, r11) // 攻角α
sideslip = -arcsin(r12) // 侧滑角β
气动角的旋转顺序是,先绕本体系z轴旋转侧滑角,再绕本体系y轴旋转攻角,再绕世界系x轴旋转倾侧角,所以
R
=
R
x
R
z
R
y
R=R_xR_zR_y
R=RxRzRy。旋转顺序如图所示,图中3次旋转均为正角度。
3D仿真代码见 https://gitee.com/xd15zhn/areoforce3d,可执行文件在发行版里,编译和使用说明待补充。
补充一个特殊姿态的欧拉角
利用前文中旋转矩阵转欧拉角的公式可以构造出一个特殊的姿态,见下面两个图。第一个是我要描述的姿态,第二个是欧拉角都为0的参考姿态。
构造这个姿态的python代码
import numpy as np
ry = np.array([0, np.cos(0.15), np.sin(0.15)]) # 让旋转矩阵中y轴的z坐标很小
rz = np.array([np.cos(0.15), 0, np.sin(0.15)]) # 让旋转矩阵中z轴的z坐标也很小
e0 = 0.1
R = np.array([ # 另外构造旋转矩阵来旋转z轴
[1, 0, 0],
[0, np.cos(e0), -np.sin(e0)],
[0, np.sin(e0), np.cos(e0)],
])
rz = R @ rz # 旋转z轴使其与y轴垂直
rx = np.cross(ry, rz) # 右手坐标系构造x轴
R = np.array([rx, ry, rz]).T # xyz三轴组合成姿态旋转矩阵
roll = np.arctan2(R[2,1], R[2,2]) # 横滚角
print(roll)
这个姿态的横滚、俯仰、偏航角分别为
[
0.78790233
,
1.35906361
,
0.78037729
]
[0.78790233,\ 1.35906361,\ 0.78037729]
[0.78790233, 1.35906361, 0.78037729],但是直观上的欧拉角应该大致是
[
1
0
∘
,
8
0
∘
,
1
0
∘
]
[10^\circ,\ 80^\circ,\ 10^\circ]
[10∘, 80∘, 10∘]。这也从侧面反映了欧拉角的万向节死锁现象。
再附一个纯坐标图,图中红绿蓝三条线分别代表本体系的XYZ轴。左边是欧拉角为0的参考姿态,右边是这个特殊姿态。