jsbsim是一个开源的飞行力学仿真软件,学习它的主要目的是希望能够实现一个类似IL2/1战争雷霆这样的空战游戏。虽然jsbsim能够通过socket通信直接进行调用,但是考虑到调用/打包的问题,以及二次开发的目的,决定还是在unity中使用C#实现一个简化版的气动仿真模型。最终的模型应当能够以飞行器当前状态为输入,输出6个自由度上的力/力矩,接入unity刚体组件。

以jsbsim自带的f-16模型配置文件 f16.xml为例,我们来看看里面都写了什么。

看一下xml根节点,对于实现一个简化版仿真模型来说,metrics,mass_balance,aerodynamics看起来比较重要。其他的地面互动、推力以及自动控制暂时先不看了 。顺便说一句,jsbsim最早的侧重点就是进行自动控制策略的仿真,所以flight_control还是挺详细的,但是这个还是先不和气动力学模块混在一起看了。

实际上,写这篇文章的动机主要就是把配置文件里的缩写含义都搞清楚,以便后续查找。因为里面的缩写很多都是不当人级别的,实乃一大恶习;另一大恶习就是jsbsim中大量实用英制单位(imperial帝国主义单位 ),我们社会主义的花朵看不到SI单位实在很烦躁。

metrics 节点

先来看看metrics,它描述了飞行器的几个尺寸/位置指标

  • wingarea=翼面积,单位 FT2=feet^2=平方英尺
  • wingspan 翼展,单位 FT=feet=平方英尺
  • chord 机翼弦长
  • htailarea=horizontal tail area=水平尾翼面积
  • htailarm=水平尾翼力臂(相对气动中心AERORP/CG)
  • vtailarea=vertical tail area=垂直尾翼面积
  • vtailarm=垂直尾翼力臂
  • AERORP=aerodynamic reference point=气动参考点,单位 IN=inch=英寸
  • EYEPOINT=飞行员视角位置
  • VRP=visual reference point=视觉参考点

我们看到了很多长度、面积、位置信息,在此需要补充一下jsbsim中的坐标系约定。其中所谓VRP就是下图中的一段偏移量,用来确定飞行器“鼻尖”和建模时使用的坐标原点之间的位置关系。

mass_balance节点

mass_balance描述了飞行器的质量分布参数,梦回理论力学

  • ixx, iyy, izz, ixy, ixz, iyz=构成刚体惯性张量的六个参数,单位 SLUG*FT2,其中slug是一个质量单位
  • emptywt=empty weight=空载重量,单位 LBS=Libra pondo=
  • CG=center of gravity=重心
  • Pilot=飞行员,POINTMASS=质点

这里面大概就惯性张量比较难懂了,但是不用害怕,就算啥也不会直接灌倒unity的刚体组件里就行了。平面转动的惯量比较好理解,三维情况比较麻烦的一点就是刚体角动量与瞬时角速度一般方向不同,简单来说,根据质量分布的参数我们可以推断出飞行器在力矩作用下将会如何旋转。

aerodynamics节点

这是要分析的重点数据,内容也很多,已经不能全部展开看了,看一下它的子节点吧

  • kCLge=k lift coefficient (by) ground effect=升力系数由于地面效应产生的变化
  • h_b-mac-ft=height-mean aerodynamic chord-feet

除了一个比较出戏的地面效应函数,其他六项(axis=轴)很好理解,分别对应了沿x,y,z轴平动、绕x,y,z轴转动这六个刚体运动自由度。aerodynamics节点里面包含了大量的表格,需要注意jsbsim的实现中各种非线性的公式/函数都是靠查表完成的,并且采用线性插值(没找到二/三维表格是如何插值的,姑且当作双/三线性插值)。

DRAG 轴

  • CDDh=drag coefficient (by) horizontal deflection=水平尾翼偏转的阻力
  • qbar-psf=\bar{q}=filght dynamic pressure=空气动压,单位 psf=pounds per square foot=磅力/平方英尺
  • Sw-sqft=S_W=Wing area=翼面积,单位 sqft=squre foot=平方英尺
  • alpha-rad=\alpha=angle of attack=攻角,单位=radians=弧度
  • elevator-pos-rad=升降舵角度

jsbsim里面的函数大部分都是乘积与查表,并且函数也自带description能够比较清晰地描述其用途,后面就不重复讨论了,只把函数、变量的缩写和物理含义写下来。

  • mach=马赫数
  • lef-pos-rad=leading edge flap position=前缘缝翼角度
  • flapreon-mix-rad=襟副翼混合角度?
  • gear-pos-norm=起落架位置,单位 norm=normalized=归一化(的值,0~1)
  • speedbrake-pos-rad=减速板角度
  • q-aero-rad_sec=(考虑了空速的)俯仰角速度,p,q,e三个角速度的定义如下图

  • ci2vel=Wingchord divided (by) 2 * velocity=机翼弦长/两倍速度

SIDE 轴

  • beta-rad=sideslip angle=侧滑角
  • aileron-pos-rad=副翼偏转角
  • rudder-pos-rad=舵偏转角
  • bi2vel=Wingspan divided (by) 2 * velocity=翼展/两倍速度
  • p-aero-rad_sec=(考虑空速的)滚转角速度,如上图
  • r-aero-rad_sec=(考虑空速的)侧滑角速度,如上图

LIFT 轴 PITCH 轴 YAW 轴

  • bw-ft=wingspan
  • cbarw-ft= \bar{c}_w =mean aerodynamic chord=MAC=平均气动弦长

新的变量越来越少了,直接把这些轴写一起了。配置文件的解析就到此为止,下一步我们准备开始编写能够加载这些配置文件和进行动力学运算的程序。顺便说一下,如果一个变量在google上也搜不到的话,不妨尝试对jsbsim源码进行全局搜索,多少能找到一点蛛丝马迹,比如bi2vel系列,就是这么找到的: