[转][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: ...
随机推荐
- SpringMVC MultiActionController 默认方法名解析器
MultiActionController默认方法名解析器是指在请求的地址中加入指定方法名称 MultiActionController类具有一个属性methodNameResolver,方法名解析器 ...
- nn.Conv2d中padding详解
- django 函数装饰器 变为 类装饰器
aaa
- django模板-通过a标签生成链接并跳转
views.py from django.shortcuts import render from django.http import HttpResponse def index(request) ...
- 深入浅出TCP之半关闭与CLOSE_WAIT
转自:https://www.2cto.com/net/201309/243585.html(相关链接) 深入浅出TCP之半关闭与CLOSE_WAIT 终止一个连接要经过4次握手.这由TCP的半关闭( ...
- Angular 请求数据
Angular 请求数据 get post 以及 jsonp 请求数据 引入 HttpModule .JsonpModule 普通的 HTTP 调用并不需要用到 JsonpModule,不过稍后我们就 ...
- Linux限制普通用户只能使用某命令
修改sudoers(/etc/sudoers)
- NetworkExtension
一, 按照网上的方法: iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架 提交了申请.两个小时候后苹果回应邮件.意思就是如果只是使用 App Proxy, Content Filter, ...
- python操作串口
import serial test = serial.Serial("COM1",115200)#这里就已经打开了串口 print(test.portstr) test.writ ...
- Python3基础 list len 输出元素的个数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...