攻角、侧滑角、倾侧角与欧拉角的关系

摘要 攻角与俯仰角对应,侧滑角与偏航角对应,倾侧角与横滚角对应,但它们并不完全一样。攻角、侧滑角、倾侧角好像没有统一的名字,本文为了方便起见称它们为气动角。欧拉角定义在世界坐标系上,气动角定义在速度坐标系上。除了坐标系定义的区别以外还有细节上的不同,假如世界系与速度系重合,两者也并不完全一样。

欧拉角和气动角定义

  关于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= cosysiny0sinycosy0001 cosp0sinp010sinp0cosp 1000cosrsinr0sinrcosr = 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= 1000cosbsinb0sinbcosb coss,sins,0sinscoss0001 cosa0sina010sina0cosa = 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次旋转均为正角度。
在这里插入图片描述

补充一个特殊姿态的欧拉角

  利用前文中旋转矩阵转欧拉角的公式可以构造出一个特殊的姿态,见下面两个图。第一个是我要描述的姿态,第二个是欧拉角都为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的参考姿态,右边是这个特殊姿态。
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于MATLAB的BEM计算风机功率和载荷的模型实例。 首先,需要准备的数据和信息有: - 风机叶片的几何信息,包括叶片数、叶片长度、叶片弦长、叶片扭转、叶片翼型等; - 风机的运行参数,包括进口风速、转速、气密度等。 接着,可以按照以下步骤进行BEM计算: 1. 根据叶片几何信息,生成叶片的网格模型,并计算叶片表面上的法向量和切向量。 2. 将叶片网格划分为若干个小面元,每个面元的大小可以根据需要调整。 3. 对于每个面元,根据当前的进口风速和叶片的位置(包括了叶片扭转和转速),计算该面元的流速和迎。 4. 根据叶片翼型的数据,计算每个面元的升力系数和阻力系数。 5. 根据叶片位置和进口风速,计算该位置的风速分量和气密度。 6. 对于每个面元,根据当前位置的风速分量和气密度,计算该面元的升力和阻力。 7. 将所有面元的升力和阻力进行叠加,得到叶片的总升力和总阻力。 8. 根据当前的转速和总升力,计算风机的扭矩和功率。 9. 根据当前的进口风速和总升力,计算风机的载荷。 下面是一个简单的MATLAB代码示例,可以作为BEM计算的参考: ```matlab % 风机叶片几何信息 numBlades = 3; % 叶片数 bladeLength = 10; % 叶片长度 chordLength = 1; % 叶片弦长 twistAngle = 10; % 叶片扭转 % 风机运行参数 windSpeed = 10; % 进口风速 rotationalSpeed = 100; % 转速 density = 1.225; % 气密度 % 计算叶片的网格模型和法向量、切向量 [bladeMesh, bladeNormals, bladeTangents] = generateBladeMesh(numBlades, bladeLength, chordLength, twistAngle); % 对每个面元进行BEM计算 for i = 1:size(bladeMesh, 1) % 计算流速和迎 [flowSpeed, angleOfAttack] = calculateFlowSpeedAndAngleOfAttack(windSpeed, rotationalSpeed, bladeMesh(i,:), bladeTangents(i,:)); % 计算升力系数和阻力系数 [cl, cd] = calculateLiftAndDragCoefficients(angleOfAttack); % 计算该面元的升力和阻力 [lift, drag] = calculateLiftAndDrag(cl, cd, flowSpeed, chordLength, density); % 将升力和阻力投影到法向量和切向量上 normalForce = dot(lift, bladeNormals(i,:)); tangentialForce = dot(drag, bladeTangents(i,:)); % 统计总升力和总阻力 totalNormalForce = totalNormalForce + normalForce; totalTangentialForce = totalTangentialForce + tangentialForce; end % 计算扭矩和功率 torque = totalTangentialForce * bladeLength / numBlades; power = torque * rotationalSpeed * 2 * pi / 60; % 计算载荷 load = totalNormalForce / bladeLength; ``` 需要注意的是,这只是一个简单的示例代码,实际的BEM计算还需要考虑更多的因素,例如叶片的变形、风机的气动噪声等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值