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)所控制的。

提出一个可行的方法——通过滚转角控制副翼偏转指令。这是一个比例控制,因为输出的指令只是系数和输入地乘积,即副翼偏转角与输入滚转角误差成正比例。副翼偏转角指令传送入飞行控制系统,偏转角作用在副翼控制通道内。但是还是存在一些不妥之处,例如这种控制一直处于打开状态。一个更好的解决途径如下图。

比例控制流程图

控制流程图中的 minmaxK 的数值都是需要合理设置的。上图对应的自动驾驶仪在 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),能够实现更好的控制效果,控制的流程图如下:

PID控制流程图

在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>

重新运行代码后,得到优化后的机翼滚转角响应曲线如下图所示。

PID控制器响应曲线

飞行控制系统的设计比较复杂,需要首先了解控制器本身的特性和参数影响关系,然后才能快速的调试出适合的系数。在JSBSim中,添加控制器比较方便,使得用户能够集中精力在系数调试和特性研究上。

[转][JSBSim]JSBSim的使用--飞行控制组件及其配置的更多相关文章

  1. [原][osgEarth][JSBSim]重新整理使用JSBSim飞机动力模拟的使用

    JSBSim是一个模拟飞机飞行空气动力学的,这些都不用深入理解,只要知道自己程序怎么和JSBSim交互就行了 我使用的是JSBSim-Win32-0.9.13 原理:改写jsbsim的FGInput ...

  2. [原][译][osg][osgEarth]飞行模拟软件JSBSim的操作(FGFCS类)

    英文原文在 FGFCS.h头文件中 JSBSim的控制操作封装了飞行控制系统(FCS)的功能. 这个FGFCS类还封装了相同的“系统”和“自动驾驶仪”能力. FGFCS包含用来定义一个系统或飞行模型体 ...

  3. [原]JSBSim 自动驾驶(浅出)

    jsbsim的脚本文件分为几大类: 1.系统脚本: systems  包含通用飞机各部分功能模块组件以及自动飞行控件:Autopilot.xml  和 自动飞行的算法控件:GNCUtilities.x ...

  4. [转]jsbsim基础概念

    转自: 么的聊链接:https://www.jianshu.com/p/a0b4598f928a 虽然用户不需要掌握太多 JSBSim 飞行模拟器的细节,但是了解 JSBSim 的基本工作流程也会对学 ...

  5. [原][JSBSim]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!

    废话没有,上关键代码 头文件 #include <QUdpSocket> #include <qtcpsocket.h> #ifndef vrUDP #define vrUDP ...

  6. [原][译][jsbsim]空气动力学模型库讨论JSBSim对比YASim

    英文原文:JSBSim_vs_YASim 准确性和现实性飞行动力学模型的准确性和真实性是针对YASim的争论中提出的两个共同点.实际上,如果你给YASim或JSBSim垃圾参数,它们都将返回垃圾空气动 ...

  7. [原][译]JSBSim官方源码文档翻译(google翻译)

    /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DOCUMENTATION ...

  8. [原]jsbsim 自动驾驶c310ap文件改写

    <?xml version="1.0"?> <!-- Author: 南水之源 Date: 1 January 2019 Function: A-320 auto ...

  9. [转][JSBSim]使用VS2015编译JSBSim

    转自csdn原文:https://blog.csdn.net/yu_lei_/article/details/81463187 请大家去看原文,原文有图片和资源,本文仅供本人参考 权威参考:http: ...

随机推荐

  1. c# out ref parames的用法

    out ref parames的用法(将值传递转换成引用传递) Out 一般用于返回多个值,在方法体中会清空out变量,侧重于一个方法有多个返回值得时候使用 Ref有进有出,可以在方法体外必须赋初值, ...

  2. shell 脚本的时间差计算

    在某个时间点上增加一段时间 将时间转为时间戳,然后增加时间 [root@~]# date +%s -d '2017-05-27 12:0:0' 1495857600 [root@ ~]# new_ti ...

  3. PHP实现的自定义图像居中裁剪函数示例

    图像居中裁减的大致思路: 1.首先将图像进行缩放,使得缩放后的图像能够恰好覆盖裁减区域.(imagecopyresampled ― 重采样拷贝部分图像并调整大小) 2.将缩放后的图像放置在裁减区域中间 ...

  4. P1297 [国家集训队]单选错位(期望)

    P1297 [国家集训队]单选错位 期望入门 我们考虑涂到第$i$道题时的情况 此时题$i$答案有$a[i]$种,我们可能涂$a[i+1]$种 分类讨论: 1.$a[i]>=a[i+1]$: 可 ...

  5. 理解Linux文件系统之 inode

    一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会 ...

  6. python --- 19 判断对象所属,区分函数和对象, 反射

    一.判断对象所属 isinstance, type , issubclass 1.issubclass(x,y)    判断x是否是y 的子类 2.type(x)  精准返回x 的数据类型 3.isi ...

  7. SCU 4437 Carries(二分乱搞)题解

    题意:问任意两对ai,aj相加的总进位数为多少.比如5,6,95分为(5,6)(5,95)(6,95),进位数 = 1 + 2 + 2 = 5 思路:显然暴力是会超时的.我们可以知道总进位数等于每一位 ...

  8. 大明A+B(大数相加)解题报告

    Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...

  9. What is event bubbling and capturing?

    What is event bubbling and capturing? 答案1 Event bubbling and capturing are two ways of event propaga ...

  10. windows下使用LibreOffice的体验

    我在家里一般是使用Ubuntu,学校这个网络需要e信拨号,还是只能用Windows主用,以前我在Ubuntu一直使用的是LibreOffice,这次看见学校电脑很乱了就重装了系统,MSOffice真的 ...