[转][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: ...
随机推荐
- Spring Aop 代理
AOP 面向切面编程 底层就是 动态代理模式 代理模式是java中常用的设计模式. 特点为: 1 委托类和代理类有相同的接口,或共同的父类(保证使用一样的方法) 2 代理类为委托类负责处理消息,并将 ...
- JavaScript笔记 #08# 用Regex辅助生成文章目录 V2.0
索引 简介 测试用例 代码 简介 * 用Regex辅助生成文章目录 2.0 * 1.提高了功能的通用性(假定的文章格式更加普遍,即按照h2h3h4分级) * 2.改善了代码的可读性(稍微牺牲了一点点性 ...
- django 存在则忽略, 不存在则创 TagSheet.objects.get_or_create(tag='test')
django 存在则忽略, 不存在则创 TagSheet.objects.get_or_create(tag='test')
- 禁止单个IP或ip段访问
//IP禁止判断接口,返回true则为找到 function checkIp($ip, $ipbanned) { $ipbannedFlag = false; if (!empty($ipbanned ...
- log4j2配置推荐
<?xml version="1.0" encoding="UTF-8"?> <!-- monitorInterval为监听配置变化的间隔,3 ...
- dubbo-集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试. 各节点的关系: 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker ...
- Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定
Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...
- kali linux fuzz工具集简述
模糊测试是一种自动化软件测试技术,涉及提供无效,意外或随机数据作为计算机程序的输入. 然后监视程序是否存在异常,例如崩溃,内置代码断言失败或潜在的内存泄漏. 通常,模糊器用于测试采用结构化输入的程序. ...
- Codeforces 765F Souvenirs - 莫队算法 - 链表 - 线段树
题目传送门 神速的列车 光速的列车 声速的列车 题目大意 给定一个长度为$n$的序列,$m$次询问区间$[l, r]$内相差最小的两个数的差的绝对值. Solution 1 Mo's Algorith ...
- Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索
Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...