http://www.jianshu.com/p/b5e9f1f5df95
飞行控制率、稳定增强系统、自动驾驶仪和其他飞控系统(航电、电气等)都能够在 JSBSim 中以独立的控制组件进行建模。JSBSim 提供了一套可配置的组件,包含增益、滤波器、开关等。飞机系统是由一系列的组件构成,在飞机配置文件中<system>、<autopilot>、<flight_control> 里面提供 <channel> 元素用于定义飞行控制系统。<channel> 元素内包含一系列相关任务的组件,例如:
<autopilot name="C172X Autopilot">
<!-- Wing leveler -->
<channel name="Roll wing leveler">
<pid name="fcs/roll-ap-error-pid">
<input>attitude/phi-rad</input>
<kp> 1.0 </kp>
<ki> 0.01 </ki>
<kd> 0.1 <kd>
</pid>
<switch name="fcs/roll-ap-autoswitch">
<default value="0.0"/>
<test value="fcs/roll-ap-error-pid">
ap/attitude_hold == 1
</test>
</switch>
<pure_gain name="fcs/roll-ap-aileron-command-normalizer">
<input>fcs/roll-ap-autoswitch</input>
<gain>-1</gain>
</pure_gain>
</channel>
... additional channels ...
</autopilot>
每个组件将计算其自身的输出,然后输出结果就能够被后续其他组件所使用。从 JSBSim 的发展例程看,飞行控制模块(<flight_control>)是最先被加入到 JSBSim 仿真系统中的,后续版本才陆续添加了自动驾驶仪(<autopilot>)、飞控系统(<system>),才使得任意形式的飞控系统都能够被建模和模拟。目前,飞控系统(<system>)已经具备替换自动驾驶仪和飞行控制模块的能力,也可以同时添加多个飞控系统。飞控系统能够在单独的配置文件中进行定义,然后以文件名的形式被调用和加载,避免了在系统配置文件中出现过多的代码段和变量等。例如:
<autopilot file="C310ap"/>
这里,自动驾驶仪定义文件 C310ap.xml 就会被搜索(在飞机配置文件的同名目录下)并加载。但是这种只引用文件名的方式在实际过程中并不常见,为使得自动驾驶仪能够被多个飞机模型使用,通常会在引用文件 C310ap.xml 的同时将控制率的PID参数重新定义一次(覆盖原文件中的参数),即如下所示:
<autopilot file="C310ap">
<!-- Roll channel A/P gains -->
<property value="50.0"> ap/roll-pid-kp </property>
<property value="5.0"> ap/roll-pid-ki </property>
<property value="17.0"> ap/roll-pid-kd </property>
</autopilot>
作为参考,这里将文件 C310ap.xml 的内容摘录如下:
<autopilot name="C-130 Autopilot">
<!-- file name = C310ap.xml -->
<!-- INTERFACE PROPERTIES -->
<property>ap/attitude_hold</property>
<property>ap/altitude_hold</property>
...
<property value="50.0"> ap/roll-pid-kp </property>
<property value="5.0"> ap/roll-pid-ki </property>
<property value="17.0"> ap/roll-pid-kd </property>
<!-- Wing leveler -->
<channel name="Roll wing leveler">
...
<pid name="fcs/roll-ap-error-pid">
<input>attitude/phi-rad</input>
<kp> 1.0 </kp>
<ki> 0.01 </ki>
<kd> 0.1 <kd>
<trigger> fcs/wing-leveler-ap-on-off </trigger>
</pid>
...
这样,作为科研工作者就可以开发一些通用的自动驾驶仪或者其他飞控配置文件,在具体使用的时候调用通用文件并修改部分增益和控制参数即可。飞控系统的各个组件的详细内容在后续编程手册中会逐一介绍。
JSBSim 中的自动飞行(Automatic Flight)
JSBSim 的长期目标是能够实现自动(automatic)和脚本(scripted)飞行。其中,脚本飞行指的是在脚本文件控制下以独立运行的方式(可视化除外)稳定的飞向不同目标(高度和极距或者经纬度均可)。脚本飞行的应用场合较多,例如模拟飞行训练、飞机性能测试、飞控系统开发等。这些特性也包含一些潜在功能,例如潜入开关和函数组件、传感器和其他自动驾驶仪相关项。
在JSBSim 中开发自动飞行功能需要包含以下文件:
- 脚本文件:扮演着制导系统的角色,负责发动机启动、喷喉伸缩、飞向目标等功能
- 飞机配置文件:定义飞机属性,包含飞行控制系统、自动驾驶仪的接口等
- 自动驾驶仪文件:可以独立定义自动驾驶仪文件,也可以直接包含在飞机配置文件内
自动驾驶仪的职责是,将机翼的姿态水平、航向、高度控制达到所需要的位置并保持住当前状态。对自动驾驶仪的设计属于科学的范畴——但是作为用户我们通常回避设计的细节,而是更多地关注如何在JSBSim 中添加并使用好自动驾驶仪。
例程:构建一个机翼矫正自动驾驶仪,机翼的水平姿态矫正是指飞机的滚转角保持为零(phi=0)。机翼的姿态收到许多因素的干扰,例如发动机扭矩、大气湍流、燃料不均等。为了保持滚转角为零(假设当前 phi 不等0),需要获得一个非零的滚转角速率(phi rate),从而驱动机翼向水平方向靠拢(译者注:从一个滚转角非零的状态到达归零状态,需要速率的变化)。为了获得非零的滚转角速率,则需要一个非零的滚转角加速度,滚转角加速度是由副翼(aileron)所控制的。
提出一个可行的方法——通过滚转角控制副翼偏转指令。这是一个比例控制,因为输出的指令只是系数和输入地乘积,即副翼偏转角与输入滚转角误差成正比例。副翼偏转角指令传送入飞行控制系统,偏转角作用在副翼控制通道内。但是还是存在一些不妥之处,例如这种控制一直处于打开状态。一个更好的解决途径如下图。
控制流程图中的 min、max、K 的数值都是需要合理设置的。上图对应的自动驾驶仪在 JSBSim 中的实现代码如下,完成代码后可以调试自动驾驶仪的性能。
<channel name="AP Roll Wing Leveler">
<pure_gain name="ap/roll-ap-wing-leveler">
<input>attitude/phi-rad</input>
<gain>2.0</gain>
<clipto>
<min>-0.255</min>
<max>0.255</max>
</clipto>
</pure_gain>
<switch name="ap/roll-ap-autoswitch">
<default value="0.0"/>
<test logic="AND" value="ap/roll-ap-wing-leveler">
ap/attitude_hold == 1
</test>
</switch>
<pure_gain name="fcs/roll-ap-aileron-command-normalizer">
<input>fcs/roll-ap-autoswitch</input>
<gain>-1</gain>
</pure_gain>
</channel>
上述代码中指的注意的有几点:1)在 "ap/roll-ap-wing-leveler" 组件中本该包含 <gain> 1 </gain> ,但是考虑到这是 pure_gain 的默认状态就省略了;2)副翼偏转角被限制在正负0.255rad(即15度)以内,这与实际中副翼能偏转的范围相关;3)在ap/roll-ap-autoswitch 开关组件中,ap/attitude_hold 在功能上表示 Roll A/P ON,与控制流程图中的开关对应。
上图显示滚转角对副翼偏转指令的追随存在一个稳态偏差,这个可以通过添加积分器消除,控制流程如下:
在 JSBSim 配置文件中比例积分控制(PI)器的代码如下:
<channel name="AP Roll Wing Leveler">
<pure_gain name="ap/roll-ap-wing-leveler">
<input>attitude/phi-rad</input>
<clipto>
<min>-0.255</min>
<max>0.255</max>
</clipto>
</pure_gain>
<pure_gain name="ap/roll-ap-wing-leveler">
<input>attitude/phi-rad</input>
<gain>2.0</gain>
</pure_gain>
<integrator name="ap/roll-ap-error-integrator">
<input>ap/limited-phi</input>
<c1>0.125</c1>
</integrator>
<summer name="ap/roll-ap-error-summer">
<input>ap/roll-ap-wing-leveler</input>
<input>ap/roll-ap-error-integrator</input>
<clipto>
<min>-1.0</min>
<max> 1.0</max>
</clipto>
</summer>
<switch name="ap/roll-ap-autoswitch">
<default value="0.0"/>
<test logic="AND" value="ap/roll-ap-wing-leveler">
ap/attitude_hold == 1
</test>
</switch>
<pure_gain name="fcs/roll-ap-aileron-command-normalizer">
<input>fcs/roll-ap-autoswitch</input>
<gain>-1</gain>
</pure_gain>
</channel>
同样,运行代码测试后得到如下图所示结果:
添加积分项后,机翼滚转角控制的稳态偏差已经消除,能够很好地归零。但是,控制曲线的起始超调量偏大,这也是需要调整改善的地方,通过匹配比例和积分项的系数能够在一定程度上优化结果。调试中会发现,机翼滚转角响应结果与期望值还是存在差距,甚至在自动驾驶仪关闭后还会出现稳态跳动。
为改善结果,还可以添加导数项控制,导数项的控制输出与系统误差的变化率成正比例。在机翼水平矫正的案例中,误差的变化率就是滚转角速率(p)。添加导数项后,整个控制系统就是一个典型的PID控制(Proportional-Integral-Derivative),能够实现更好的控制效果,控制的流程图如下:
在JSBSim 中的实现代码段如下:
<channel name="AP Roll Wing Leveler">
<pure_gain name="ap/roll-ap-wing-leveler">
<input>attitude/phi-rad</input>
<clipto>
<min>-0.255</min>
<max>0.255</max>
</clipto>
</pure_gain>
<pure_gain name="ap/roll-ap-wing-leveler">
<input>attitude/phi-rad</input>
<gain>2.0</gain>
</pure_gain>
<integrator name="ap/roll-ap-error-integrator">
<input>ap/limited-phi</input>
<c1>0.125</c1>
</integrator>
<summer name="ap/roll-ap-error-summer">
<input>velocities/p-rad_sec</input>
<input>ap/roll-ap-wing-leveler</input>
<input>ap/roll-ap-error-integrator</input>
<clipto>
<min>-1.0</min>
<max> 1.0</max>
</clipto>
</summer>
<switch name="ap/roll-ap-autoswitch">
<default value="0.0"/>
<test logic="AND" value="ap/roll-ap-wing-leveler">
ap/attitude_hold == 1
</test>
</switch>
<pure_gain name="fcs/roll-ap-aileron-command-normalizer">
<input>fcs/roll-ap-autoswitch</input>
<gain>-1</gain>
</pure_gain>
</channel>
重新运行代码后,得到优化后的机翼滚转角响应曲线如下图所示。
飞行控制系统的设计比较复杂,需要首先了解控制器本身的特性和参数影响关系,然后才能快速的调试出适合的系数。在JSBSim中,添加控制器比较方便,使得用户能够集中精力在系数调试和特性研究上。