[转][JSBSim]JSBSim的使用--飞行控制组件及其配置
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中,添加控制器比较方便,使得用户能够集中精力在系数调试和特性研究上。
[转][JSBSim]JSBSim的使用--飞行控制组件及其配置的更多相关文章
- [原][osgEarth][JSBSim]重新整理使用JSBSim飞机动力模拟的使用
JSBSim是一个模拟飞机飞行空气动力学的,这些都不用深入理解,只要知道自己程序怎么和JSBSim交互就行了 我使用的是JSBSim-Win32-0.9.13 原理:改写jsbsim的FGInput ...
- [原][译][osg][osgEarth]飞行模拟软件JSBSim的操作(FGFCS类)
英文原文在 FGFCS.h头文件中 JSBSim的控制操作封装了飞行控制系统(FCS)的功能. 这个FGFCS类还封装了相同的“系统”和“自动驾驶仪”能力. FGFCS包含用来定义一个系统或飞行模型体 ...
- [原]JSBSim 自动驾驶(浅出)
jsbsim的脚本文件分为几大类: 1.系统脚本: systems 包含通用飞机各部分功能模块组件以及自动飞行控件:Autopilot.xml 和 自动飞行的算法控件:GNCUtilities.x ...
- [转]jsbsim基础概念
转自: 么的聊链接:https://www.jianshu.com/p/a0b4598f928a 虽然用户不需要掌握太多 JSBSim 飞行模拟器的细节,但是了解 JSBSim 的基本工作流程也会对学 ...
- [原][JSBSim]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!
废话没有,上关键代码 头文件 #include <QUdpSocket> #include <qtcpsocket.h> #ifndef vrUDP #define vrUDP ...
- [原][译][jsbsim]空气动力学模型库讨论JSBSim对比YASim
英文原文:JSBSim_vs_YASim 准确性和现实性飞行动力学模型的准确性和真实性是针对YASim的争论中提出的两个共同点.实际上,如果你给YASim或JSBSim垃圾参数,它们都将返回垃圾空气动 ...
- [原][译]JSBSim官方源码文档翻译(google翻译)
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DOCUMENTATION ...
- [原]jsbsim 自动驾驶c310ap文件改写
<?xml version="1.0"?> <!-- Author: 南水之源 Date: 1 January 2019 Function: A-320 auto ...
- [转][JSBSim]使用VS2015编译JSBSim
转自csdn原文:https://blog.csdn.net/yu_lei_/article/details/81463187 请大家去看原文,原文有图片和资源,本文仅供本人参考 权威参考:http: ...
随机推荐
- python的ws库功能,实时获取服务器ws协议返回的数据
# -*- coding:utf-8 -*- ''' 模块下载,帮助地址:https://github.com/liris/websocket-client#readme 模块:websocket-c ...
- chrome platform
folder_extension: ---menifest.json ---navigator_change.js manifest.json { "manifest_version&quo ...
- 在static的function静态函数中访问成员变量
class A{ private $url; public function __construct(){ $this->url = $_SERVER['PATCH_INFO']; } publ ...
- hihocoder [Offer收割]编程练习赛8
第一次做这种比赛,被自己坑的好惨... A.这道题的关键其实是如果有k和n满足kD+F>nL>kD则不能走无限远,分支看似难整理,其实比较简单,F>L根本就不用算了,明摆着就是Bsi ...
- linux 文件同步
ref: https://www.cnblogs.com/MacoLee/p/5633650.html https://wenda.so.com/q/1505308236213470 http://b ...
- 使用svn导入项目
打开eclipse工作平台点击“File”-->import如下图: 在项目导入框中找到SVN选择“从SVN检出项目”然后点击“下一步”,出现如下界面: 在上图界面中选择“创建新的资源库 ...
- topcoder srm 705 div1 -3
1.设有一个字母表$T$,对于一个单词$w$,若对于任意的$0\leq i< |w|-1$,满足$w_{i}$在$T$中的排名小于等于$w_{i+1}$在$T$中的排名,则称$s$在$T$中是合 ...
- ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(3)
4. 主从表关系 名称 类型 说明 MasterSource 从表对应于主表的DataSource组件 DetailFields 从表中对应于主表字段的外键字段 MasterFields 主表中关联从 ...
- uniGUI试用笔记(六)
uniGUI提供了一个文件上传控件TUniFileUpload,进行数据的导入就变得比较容易.首先将TUniFileUpload控件放置在窗体上,按下导入按钮后,执行TUniFileUpload的文件 ...
- 如何在gvim中安装autoproto自动显示函数原型
cankao: http://www.vim.org/scripts/script.php?script_id=1553 注意, 在gvim中执行的命令, :foo和:!foo 的区别, 跟vim一样 ...