不少刚接触无人机飞行动力学建模的朋友问过我:想做仿真,第一步到底该干什么?我的回答从来都一样——先搞到一套靠谱的飞机参数。型号不用多,重要的是参数全、能对上、经得起验证。我自己用得最多的基准机型就是 Aerosonde。这架小型无人机早年被设计为气象探测用途,长期飞行能力不错,后来它的物理参数和气动系数被若干飞行控制教材收录,慢慢成了飞行动力学建模和控制器验证里的“标准答案”。无论你想验证 PID、LQR、还是非线性控制,拿 Aerosonde 参数搭一套六自由度仿真模型,都是很省心的起点。
这篇文章我会把 Aerosonde 的质量、转动惯量、几何尺寸、气动系数怎么取、怎么用、怎么代入动力学方程,一并拆开讲清楚。如果你手头正好要做无人机仿真或者飞行动力学建模,这篇文章可以直接当参考手册用。
1. 为什么是 Aerosonde?先把建模对象的底细摸清楚
1.1 一架被当作“标准答案”的小型无人机
Aerosonde 是一型小型固定翼无人机,经常在气象观测和海洋监测任务里出现。很多刚入门的人会问:现在无人机型号这么多,为什么建模仿真都爱用这一架?原因很实际:它的气动和物理参数在公开文献里非常完整,而且结构相对简单,属于中小型固定翼无人机里最典型的一类布局——常规尾翼、单发动机、前拉螺旋桨。
工程项目里做建模最怕的就是“数据黑盒”。很多无人机厂家给的参数表里只有重量、翼展这种大路货,转动机惯量、气动导数这些真正影响动态响应的数据一概没有。Aerosonde 不一样,因为它在《Small Unmanned Aircraft: Theory and Practice》这类教材中被当作标准算例,质量、转动惯量、几何尺寸、升力阻力力矩系数、舵面效率都能查到。这意味着你可以在不同论文、不同仿真框架之间横着对比,不会出现“同一个飞机,两组参数打架”的尴尬。
1.2 参数来源与适用范围
我这里说的 Aerosonde 参数,参考的是公开文献中最常被引用的那套数值。它适用于固定翼无人机在中等攻角范围内的纵向和横航向线性化建模,也适合非线性六自由度仿真。需要提醒的是,不同版本文献给出的参数会有些许出入,比如质量有取 13.5 kg 的,也有取 25 kg 的,这取决于是否带载荷、用哪一代样机。如果你只是做算法验证,选一套参数后保持全流程一致,比纠结零点几千克的差异更重要。
这套参数适合用来做飞行控制器设计、状态估计器调参、编队算法仿真、故障注入实验等。因为它的线化方程足够稳定,你能够快速验证“算法本身”的效果,而不是花大量时间在调模型发散上。但如果你想做高精度试飞级仿真,就需要结合风洞数据和实测数据重新标定,不能只靠教材参数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 物理参数:质量、转动惯量、几何尺寸,一个都不能漏
2.1 质量与参考坐标系:重心位置决定一切
建模第一步是定坐标。通常我们取机体坐标系的原点在飞机重心位置,x 轴指向前,y 轴指向右机翼,z 轴指向下。Aerosonde 的整机质量一般取 13.5 kg,这个数值在很多论文中都出现过。这里有个容易忽略的细节:建模用的转动惯量必须相对于重心,而不是相对于机头或者其他结构参考点。如果你的输入数据里给的是相对某点的转动惯量,必须先用平行轴定理换算。
重心位置在建模中也很关键。在力和力矩方程里,气动力作用点、发动机推力线、重力作用点都会变化。如果只给质量和惯量,没有给重心坐标,你在做舵面力矩分配时会出问题。Aerosonde 的参数里重心通常位于平均气动弦长的某个百分比位置,大概是四分之一弦线附近。实际建模时,先保证状态量定义在重心系下,否则后面所有力矩都会出偏差。
2.2 转动惯量:Jx、Jy、Jz、Jxz,为什么缺一不可
小型无人机做全量六自由度仿真时,转动惯量不能只给主对角线三个数。Aerosonde 的惯性张量里,除了 Jx、Jy、Jz,还有一个比较小的 Jxz 交叉项。很多新手为了简化,会把 Jxz 直接设成 0,这在某些特殊对称布局里可能还凑合,但对常规固定翼飞机来说,这项虽然数值小,却会影响滚转和偏航之间的耦合,尤其在做横航向仿真或者螺旋桨滑流影响研究时,跳过它会导致明显的偏差。
参考值大致是:Jx = 0.824 kg·m²,Jy = 1.135 kg·m²,Jz = 1.759 kg·m²,Jxz = 0.12 kg·m²。这里的单位是 kg·m²。有了这四组数,你才能把角速度变化率完整算出来。很多开源飞行仿真框架里,惯性矩阵要求填一个 3×3 对称矩阵,你直接把上面的数填进去就行。需要注意的是,不同坐标系定义下 Jxz 的符号可能不同,如果你是从某篇论文搬的惯量数据,一定要确认它的坐标轴方向和你的定义一致,这点我后面会再吐槽。
2.3 几何尺寸:翼展、机翼面积、弦长怎么用
气动力和力矩的公式里都带着机翼面积 S、翼展 b、平均气动弦长 c。这三个几何参数决定了“参考面积”和“参考长度”。Aerosonde 的翼展大约 2.9 米,机翼面积大约 0.55 平方米,平均气动弦长约 0.19 米。为什么要用平均气动弦长?因为整机气动力矩的参考点通常选在重心位置,而力矩系数里需要把俯仰力矩用弦长无量纲化,偏航力矩和滚转力矩用翼展无量纲化。
如果你自己画过飞机,会知道这些几何量从三维模型里可以测出来。但要注意,机翼面积不是简单的主翼平面积,还包括机身升力贡献吗?不同文献定义不一样。Aerosonde 的参数里用的是一套统一的参考面积,所有气动系数都用它计算。建模时保持同一套 S、b、c 从头到尾不换,就不会产生比例错误。
这里给出一张常用的参数取值表,方便你建模时直接抄:
| 参数 | 符号 | 参考值 | 单位 |
|---|---|---|---|
| 质量 | m | 13.5 | kg |
| 翼展 | b | 2.9 | m |
| 机翼面积 | S | 0.55 | m² |
| 平均气动弦长 | c | 0.19 | m |
| 绕 x 轴转动惯量 | Jx | 0.824 | kg·m² |
| 绕 y 轴转动惯量 | Jy | 1.135 | kg·m² |
| 绕 z 轴转动惯量 | Jz | 1.759 | kg·m² |
| 交叉惯量 | Jxz | 0.12 | kg·m² |
3. 气动系数:升力、阻力、力矩系数的含义与取值
3.1 升力系数与阻力系数:飞机“往上走”和“往前走”的代价
固定翼无人机的气动力建模最常用的做法是把力和力矩写成量纲为一系数的形式。升力系数一般写成零攻角升力加上随攻角变化的部分,再加一些动态导数项。Aerosonde 的典型参考值里,零攻角升力系数 CL0 大约在 0.23 到 0.28 之间,升力线斜率 CLa 大约在 5 到 6 每弧度。这些数值放到公式里,攻角一变化,升力马上跟着变。
阻力系数就不太一样了。阻力往往不是攻角的线性函数,更常用的是极曲线表达:Cd = Cd0 + k * Cl²。Aerosonde 的零升阻力系数 Cd0 大约在 0.03 左右,加上诱导阻力项后,在小攻角范围内阻力变化相对平缓,但一到大攻角,阻力会显著增大。如果建模时把阻力全程当常量,仿真结果会在高速巡航和爬升段偏离真实。
3.2 力矩系数:俯仰、滚转、偏航里面的门道
力矩系数分纵向和横航向。俯仰力矩系数 Cm 通常关注两方面:一个是随攻角的静稳定性导数 Cma,一个是随俯仰角速度的阻尼导数 Cmq。Aerosonde 的 Cma 一般是负值,约在 -2 到 -3 每弧度。负号很关键,代表飞机有静稳定性——攻角增加时产生低头力矩,让飞机自动恢复。Cmq 也是负的,用于衰减俯仰振荡。
横航向包括滚转力矩系数 Cl 和偏航力矩系数 Cn。滚转力矩系数里,C_l_beta(关于侧滑角的导数,通常叫 dihedral effect)一般是负值,保证侧滑后产生恢复滚转;C_n_beta 一般是正值,保证偏航稳定性。这些系数数值往往很小,0.1 量级,但放在仿真里影响很大。Aerosonde 的横航向导数在教材里都能查到,我用的时候最深的感触是,这些系数对方向舵、副翼的控制响应非常敏感,稍有不慎就会让荷兰滚模态不稳定。
3.3 控制导数与舵面效率
除了飞机本身的稳定性导数,建模还必须包含舵面的控制效率导数。升降舵效率 CLde、Cmde,副翼效率 Clda,方向舵效率 Cnda、Cndr。这些参数决定了同样的舵偏角会产生多大的力和力矩变化。Aerosonde 的量级大概是:升降舵引起的升力系数变化 0.1 到 0.2 每弧度,引起的俯仰力矩系数变化约 -1 左右;副翼效率在滚转通道大约 -0.2 到 -0.3;方向舵效率在偏航通道大约 0.09 到 0.15。
这些值听起来不大,但控制律设计时全靠它们。你在仿真里给升降舵一个 1 度的阶跃,如果升力系数增量太小,飞机抬头就慢,控制器积分项就会越积越大。这也是为什么我建议大家拿到任何飞机参数后,先在开环仿真里分别给升降舵、副翼、方向舵一个阶跃信号,看看响应方向对不对、量级是否合理,再开始设计控制器。
下面这张表整理了几组常用气动系数的参考范围,方便你对比:
| 气动系数 | 含义 | 典型参考范围 |
|---|---|---|
| CL0 | 零攻角升力系数 | 0.2 ~ 0.3 |
| CLa | 升力线斜率 / rad | 5 ~ 6 |
| CD0 | 零升阻力系数 | 0.025 ~ 0.045 |
| Cma | 俯仰静稳定导数 / rad | -3 ~ -2 |
| Cmq | 俯仰阻尼导数 / rad | -12 ~ -8 |
| Cl_beta | 滚转静稳定导数 / rad | -0.15 ~ -0.05 |
| Cn_beta | 偏航静稳定导数 / rad | 0.08 ~ 0.2 |
4. 从参数到动力学方程:六自由度建模实操
4.1 坐标系、状态量与常用假设
建模之前先明确状态量。Aerosonde 的六自由度模型里,我习惯用 NED 地面坐标系作为惯性坐标系,用机体坐标系来写动力学方程。状态量通常包括位置(北、东、下)、姿态(滚转角、俯仰角、偏航角)、速度(机体坐标系下的 u、v、w)和角速度(p、q、r)。
做标准刚体建模时,有两个约定俗成的假设:一是把飞机看成刚体,忽略弹性形变;二是假设质量不随时间变化。Aerosonde 这种小飞机在仿真里不需要考虑燃油消耗带来的质量变化,所以这两个假设完全够用。如果不做特别说明,重力加速度取 9.81 m/s²,大气密度根据飞行高度查国际标准大气模型。
4.2 刚体运动方程:力和力矩怎么变成加速度
在机体坐标系下,牛顿方程可以写成:
F = m * (dot(V) + omega × V)
其中 V 是速度向量,omega 是角速度向量。意思是总合力一部分体现在线加速度上,一部分体现在向心加速度上。角运动方程则是:
M = J * dot(omega) + omega × (J * omega)
这里的 J 就是前面说的转动惯量矩阵。如果 J 的非对角项都是零,方程会简单很多,但 Aerosonde 有 Jxz,所以计算时不能只做对角阵简化,否则滚转和偏航之间的耦合就丢了。
4.3 气动力与力矩的完整计算流程
气动力计算需要先根据速度向量求空速、攻角和侧滑角。空速是速度向量的模,攻角 α 等于 atan2(w, u),侧滑角 β 等于 asin(v / V)。然后气动力用动压 q_dyn = 0.5 * rho * V² 乘以参考面积和对应系数来算。
升力的表达式是 L = q_dyn * S * CL,阻力是 D = q_dyn * S * CD,侧力是 Y = q_dyn * S * CY。注意,这几个力是在气流坐标系里定义的,要转换到机体坐标系才能代进动力学方程里。转换时用攻角和侧滑角做两次旋转,即从气流系到机体系。很多人建模发散的根源就在这里:把升力直接当成了机体 z 向力。
气动力矩类似,滚转力矩 L_aero = q_dyn * S * b * Cl,俯仰力矩 M_aero = q_dyn * S * c * Cm,偏航力矩 N_aero = q_dyn * S * b * Cn。这里的 Cl、Cm、Cn 都是全量系数,它们由静态导数、动态导数和舵面贡献相加得到。
4.4 用 Python 跑一个最简单的开环仿真
有了参数和方程,就可以开始写仿真代码。下面给一个非常简化的 Python 框架,重点演示参数怎么代入、状态怎么更新。这里用的是欧拉积分,只适合入门,实际项目建议用 RK4 或更高精度积分器。
python复制import numpy as np
from scipy.integrate import solve_ivp
# Aerosonde 参考参数
m = 13.5
S = 0.55
b = 2.9
c = 0.19
g = 9.81
Ixx = 0.824
Iyy = 1.135
Izz = 1.759
Ixz = 0.12
# 气动系数(示例值,线性段)
CL0 = 0.28
CLa = 5.143
CD0 = 0.03
CDa = 0.03
Cm0 = -0.023
Cma = -2.74
Cmq = -9.8
Cmadot = 0.0
rho = 1.2682 # 海平面附近
def aero_coeffs(alpha, beta, p, q, r, de):
CL = CL0 + CLa * alpha
CD = CD0 + CDa * alpha
Cm = Cm0 + Cma * alpha + Cmq * c / (2 * 15) * q
return CL, CD, Cm
def dynamics(t, state, delta):
# state: u, v, w, p, q, r, e0, e1, e2, e3, pn, pe, pd
u, v, w, p, q, r = state[0], state[1], state[2], state[3], state[4], state[5]
de = delta[0]
V = np.sqrt(u*u + v*v + w*w)
alpha = np.arctan2(w, u)
beta = np.arcsin(v / V)
CL, CD, Cm = aero_coeffs(alpha, beta, p, q, r, de)
qbar = 0.5 * rho * V * V
L_aero = qbar * S * CL
D_aero = qbar * S * CD
# 侧力忽略,仅纵向示例
F_x = -D_aero * np.cos(alpha) + L_aero * np.sin(alpha)
F_z = -D_aero * np.sin(alpha) - L_aero * np.cos(alpha)
# 推力为零或常量
T = 5.0
Fx_total = T + F_x
Fz_total = F_z
Fy_total = 0.0
udot = r*v - q*w + Fx_total / m
vdot = p*w - r*u + Fy_total / m
wdot = q*u - p*v + Fz_total / m
M_aero = qbar * S * c * Cm
M_total = M_aero # 忽略副翼、方向舵和推力力矩
pdot = (Izz * M_total) / (Ixx * Izz - Ixz*Ixz) # 简化,仅俯仰相关实际在qdot中
# 为了可运行,这里只做一个示意,完整模型请按六自由度方程展开
qdot = M_aero / Iyy
rdot = 0.0
return [udot, vdot, wdot, pdot, qdot, rdot, 0,0,0,0,0,0]
# 初始状态:平飞
initial = [15, 0, 0.5, 0, 0.05, 0, 1, 0, 0, 0, 0, -100]
sol = solve_ivp(dynamics, [0, 10], initial, args=([0.0],), t_eval=np.linspace(0, 10, 100))
这段代码做了很多简化,真正的模型需要把姿态四元数、位置更新、横航向耦合都加进去。但核心思想就是:把质量、惯量、气动系数放进状态方程,交给积分器去跑。跑完以后你可以画时间响应曲线,看看攻角有没有振荡,俯仰角速度能不能稳定,这些都是验证参数是否合理的直观手段。
5. 建模中的常见坑与参数调试经验
5.1 模型发散?先查坐标和符号
仿真一发散,很多人第一反应是调控制器增益,但大多数情况下问题出在模型本身。我踩过最多次的坑就是坐标轴方向不统一。机体坐标系定义成 z 轴朝下时,正攻角对应正 w;但如果你拿到的那套气动系数是按照 z 轴朝上定义的,符号就会全部反掉。查这个问题最简单的办法是:给一个正的升降舵偏角,看飞机是低头还是抬头。Aerosonde 的升降舵在尾部,按常规映射,拉杆抬头对应的舵偏角符号是可以查到的。
另一个坑是转动惯量的交叉项符号。Jxz 在有些文献里定义为正数,有些定义带负号,取决于坐标轴方向。你要是混着用,横航向动力学立刻会变得很奇怪。我的习惯是,所有参数最终都以自己写的动力学方程的符号约定为准,换句话说,哪个文献的问题不重要,重要的是你的坐标系里每一项该是什么符号。
5.2 气动系数适用范围与线性化边界
Aerosonde 的教材参数大多是在小攻角范围内线性化出来的。你要是用这套系数去做大机动仿真,比如攻角直接拉倒 25 度以上,升力曲线就会明显失真。建模时最好给攻角加限位,或者引入失速模型,否则仿真出来的飞机可以“永远不失控”,和真实物理完全不符。
即便只在巡航段使用,也要注意动压变化。高空密度低,同一空速下动压会变小,气动力绝对值变小。如果你用固定的海平面密度去仿真 1000 米以上高度,结果会有偏差。比较稳妥的做法是引入大气密度随高度变化的模型。
5.3 参数不完整时的估算技巧
很多情况下你拿到的飞机参数缺胳膊少腿,比如没有转动惯量,或者没有力矩系数。这时候可以用经验公式先凑一套初始值。转动惯量可以依据质量和翼展用圆柱体或细长体近似公式估算,精度不高但做控制设计初期够用;气动系数可以参考同级别无人机的公开数据,慢慢迭代。Aerosonde 参数的便利之处就在于,你可以拿它当“母版”,然后根据自己飞机的翼载荷、展弦比等比缩放。
下面的速查表是我自己在调参时反复用到的排查清单:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 模型直接发散 | 符号方向错、质量/惯量数量级错 | 检查机体坐标定义,单独测试重力项 |
| 短周期振荡频率异常 | Cma 数值不对 | 计算静稳定裕度,确认 Cma 为负 |
| 荷兰滚不收敛 | Cn_beta 或 Cl_beta 符号不符 | 给侧滑角初值观察响应方向 |
| 升降舵响应相反 | Cmde 符号反了 | 单独给舵偏阶跃看俯仰角速度符号 |
| 高空和低空差异过大 | 大气密度未更新 | 改用随高度变化的大气模型 |
5.4 我的调参心得
最后分享一点个人经验。我第一次用 Aerosonde 参数建模时,没有仔细验证系数,直接把整套数据砸进 Simulink,结果纵向控制器在仿真里表现完美,一到横航向测试就开始左右摇摆。排查了两天才发现,是我在抄惯量数据时把 Jxz 的符号抄反了。从那以后我养成一个习惯:任何新飞机参数到手,先做一组“开环阶跃响应”测试,分别给升降舵、副翼、方向舵一个不大的阶跃,看响应方向和理论一致,再继续往下做控制律。
另外,气动系数不是越多越好。Aerosonde 的线性模型里,那些动态导数比如 Cmq、Cmadot 对短周期阻尼影响很大,如果你的参考数据里没有,宁可先给一个小的负值,也不要填 0。填 0 会让飞机看起来阻尼很弱,控制器需要额外补偿,容易掩盖真实的问题。
建模这件事,参数质量决定模型上限。Aerosonde 这套参数好就好在公开、自洽、被验证过,拿来做底子可以少踩很多坑。等你在仿真里跑通整个流程,再换自己的飞机数据时,至少你已经知道什么该检查、什么容易出错了。
