JSBsim理论学习

JSBsim理论学习

在这里插入图片描述

在这里插入图片描述

本文主要介绍官方文档第二大部分内容

官方文档中该部分目录是这样的:

  1. 概念 21
  • 2.1 模拟 21

  • 2.2参考系 21

  • 2.3单位 22

  • 2.4属性 23

  • 2.5 数学 25

    • 2.5.1函数 25
    • 2.5.2表格 27
  • 2.6 力和力矩 29

    • 2.6.1空气动力学 29
    • 2.6.2 推进 36
    • 2.6.3 地面反应 36
    • 2.6.4 外部反应 36
  • 2.7 飞行控制和系统建模 36

    • 2.7.1 系统组件 36
    • 2.7.2 JSBSim中的自动飞行 38

JSBsim的属性

仿真程序需要管理大量的状态信息。对于特别大的程序,数据管理任务可能会导致问题:因此在JSBSim飞行模拟器中使用属性(Properties)

  1. 解耦和模块化:属性允许将数据和行为分离,从而提高代码的模块化。不同的模块可以独立地访问和修改状态信息,而不需要了解其他模块的内部实现。

  2. 简化数据管理:随着程序规模的增长,管理大量状态信息变得越来越复杂。属性提供了一个集中的接口来管理这些状态信息,简化了数据管理任务。

  3. 提高可扩展性:通过属性,可以轻松地添加新的特性和变量,而不需要对现有代码进行大规模修改。这对于非编程开发者尤其有用,因为他们可以等待开发者添加新变量。

  4. 支持复杂系统建模:飞行控制系统和其他飞机系统可能非常复杂,涉及许多相互作用的组件。属性允许用户构建这些复杂系统,并通过配置文件灵活地定义它们的行为。

总的来说,属性是JSBSim中实现高度灵活、可配置和可扩展飞行模拟平台的关键技术之一。

在JSBsim中, 属性的定义和配置通常采用XML(eXtensible Markup Language)格式。XML是一种标记语言,用于描述数据的结构和语义。JSBSim使用XML来编写配置文件,这些文件用于定义飞机模型、飞行控制系统、发动机特性以及其他各种模拟参数。

因此,下面首先学习如何看懂XML格式文件。

XMl格式文件的分析读取

X-15模型的飞行控制系统

在这里插入图片描述
1.上面第一个组件 (“fcs/pitch-trim-sum”)从两个地方获取输入:

  • 静态特性: fcs/elevator-cmd-norm 和 fcs/pitch-trim-cmd-norm

2.下一个组件(“fcs/pitch-command-scale”)的输入是(“fcs/pitch-trim-sum”),也就是将第一个组件的输出作为输入。

3.最后一个组件(“fcs/pitch-gain-1”)的输入是(“fcs/pitch-command-scale”),也就是将第二个组件的输出作为输入。

这样,我们就基本明白了在JSBsim中飞机的飞行控制系统是如何通过一个个组件组装起来的。

JSBsim里的数学基础

函数

JSBSim中的函数规范是一个强大而通用的资源,JSBSim允许用户定义代数函数来模拟各种飞行动力学特性,如气动系数、发动机推力等。这些函数可以包含加、减、乘、除、指数、对数、三角函数等操作。

JSBSim支持以下代数函数:

sum - 求和函数,可以接收多个参数。
difference - 差函数,可以接收多个参数。
product - 乘积函数,可以接收多个参数。
quotient - 商函数,接收两个参数。
pow - 幂函数,接收两个参数。
exp - 指数函数,接收两个参数。
abs - 绝对值函数,可以接收多个参数。
sin - 正弦函数,接收一个参数。
cos - 余弦函数,接收一个参数。
tan - 正切函数,接收一个参数。
asin - 反正弦函数,接收一个参数。
acos - 反余弦函数,接收一个参数。
atan - 反正切函数,接收一个参数。
atan2 - 双参数反正切函数,接收两个参数。
min - 最小值函数,可以接收多个参数。
max - 最大值函数,可以接收多个参数。
avg - 平均值函数,可以接收多个参数。
fraction - 分数函数,取参数的小数部分。
mod - 取模函数,接收两个参数。
random - 生成高斯随机数,不接受参数。
integer - 取整函数,取参数的整数部分。

例子:

 <sum>
 	<value> 3.14159 </value>
 	<property> velocities/qbar </property>
 	<product>
		<value> 0.125 </value>
 		<property> metrics/wingarea </property>
 	</product>
 </sum>

product - 乘积函数,可以接收多个参数。
所以上面函数是

3.14159 + qbar + (0.125 * wingarea)

值得注意的是:在JSBSim中定义数学函数时,需要满足以下几点:

  1. 函数元素的唯一性:在顶级函数定义中,只能有一个非可选(非文档)元素,即只能有一个操作元素、属性、表格或值元素。
  2. 操作的参数个数:某些操作如sum、product、abs可以接收多个参数,而像quotient、pow、atan2这样的操作则有固定参数个数。
  3. 操作的嵌套:操作可以包含值、属性、表格或其他操作。但是,任何包含的操作最终必须计算出一个单一的值。

顶级函数定义指的是在配置文件中直接定义的函数,它不是其他函数的一部分,而是作为配置文件中的一个独立元素存在。这种函数定义通常位于配置文件的根级别,或者在某个特定部分的最顶层,如气动特性、推进特性等

函数不能有多个直接子操作、属性、表或值元素。函数元素中的第一个操作几乎总是是乘积或和。例如计算由于偏航率引起的滚转力矩:

<function name="aero/coefficient/Clr">
 	<description>Roll moment due to yaw rate</description>
 	<product>
 		<property>aero/qbar-area</property>
 		<property>metrics/bw-ft</property>
 		<property>aero/bi2vel</property>
 		<property>velocities/r-aero-rad_sec</property>
 		<table>
 			<independentVar>aero/alpha-rad</independentVar>
 			<tableData>
 				0.000 0.08
 				0.094 0.19
 			</tableData>
 		</table>
 	</product>
</function>

公式可以表示为:

Clr \text{Clr} Clr = ( aero/qbar-area \text{aero/qbar-area} aero/qbar-area) × \times × ( metrics/bw-ft \text{metrics/bw-ft} metrics/bw-ft) × \times × ( aero/bi2vel \text{aero/bi2vel} aero/bi2vel) × \times × (velocities/r-aero-rad_sec) × \times × lookup_value \text{lookup\_value} lookup_value

其中, lookup_value \text{lookup\_value} lookup_value是根据迎角(aero/alpha-rad)在查找表中查找或插值得到的值。查找表的数据给出了迎角对应的滚转力矩系数,格式如下:

lookup_value \text{lookup\_value} lookup_value = [ 0.000 0.08 0.094 0.19 ] \begin{bmatrix} 0.000 & 0.08 \\ 0.094 & 0.19 \end{bmatrix} [0.0000.0940.080.19]

具体地,如果迎角aero/alpha-rad的值在0到0.094弧度之间,将使用线性插值来确定lookup_value的值。例如,如果迎角是0.047弧度,则lookup_value将根据0.000和0.094对应的值0.08和0.19进行线性插值计算。

最终的滚转力矩系数Clr是所有这些属性和查找表值的乘积。这个系数随后可以用于计算飞机在偏航时产生的滚转力矩,其计算公式是:

Roll Moment \text{Roll Moment} Roll Moment = Clr \text{Clr} Clr × \times × wing area \text{wing area} wing area

这里, wing area \text{wing area} wing area是飞机机翼的面积,通常在配置文件中也是一个预定义的属性。

简化的元素标签:为了简化函数定义的书写,JSBSim允许在函数定义内部使用简化的元素标签,如 < p > <p> <p>代替 < p r o p e r t y > <property> <property>, < v > <v> <v>代替 < v a l u e > <value> <value> < t > <t> <t>代替 < t a b l e > <table> <table>

例如上面的函数也可以写成这样:

 <function name="aero/coefficient/Clr">
 	<description>Roll moment due to yaw rate</description>
 	<product>
 		<p> aero/qbar-area </p>
 		<p> metrics/bw-ft </p>
 		<p> aero/bi2vel </p>
 		<p> velocities/r-aero-rad_sec </p>
 		<t>
 			<independentVar> aero/alpha-rad </independentVar>
 			<tableData>
 				0.000 0.08
 				0.094 0.19
 			</tableData>
 		</t>
 	</product>
 </function>

表格

就是查表获取数据,比较简单,JSBSim支持一维、二维甚至三维表格。
在三维表格中,使用“breakpoint”属性来定义不同的数据集。每个元素可以有一个breakpoint属性,用于标识数据集的起始点。
例如:

<table>
	<independentVar lookup="row">fcs/row-value</independentVar>
 	<independentVar lookup="column">fcs/column-value</independentVar>
 	<independentVar lookup="table">fcs/table-value</independentVar>
 	<tableData breakPoint="-1.0">
 				-1.0  	1.0
 		0.0  	1.0000  2.0000
 		1.0  	3.0000  4.0000
 	</tableData>
 	<tableData breakPoint="0.0000">
 				0.0 	10.0
 		2.0 	1.0000 	2.0000
  		3.0 	3.0000 	4.0000
 	</tableData>
 	<tableData breakPoint="1.0">
 				0.0 	10.0 	20.0
 		2.0 	1.0000 	2.0000 	3.0000
 		3.0 	4.0000 	5.0000 	6.0000
 		10.0 	7.0000 	8.0000 	9.0000
 	</tableData>
</table>

值得注意的是:JSBSim中表格的值是线性插值的,并且在表的限制处不进行外推——也就是如果查找的值超出了表格定义的范围,它将返回最接近定义值的表格值,而不是进行任何形式的外推,表将返回的最高值是所定义的最高值。

力与力矩的计算

空气动力学

所属属性: < aerodynamics >

从前面的学习,我们知道,JSBsim中所有的仿真数学公式都是通过XML文件配置的。通过系数累积法实现目标参数的计算,比如升力的求解是计算所有对升力有贡献的总和。

F l i f t = 1 2 ρ V a 2 S C L F_{lift}=\frac{1}{2} \rho V_a^2 S C_L Flift=21ρVa2SCL

查阅相关教材可知CL基本公式:

在这里插入图片描述

计算空气动力最关键的是计算出CL等气动导数。

那么在JSBsim里,进行仿真飞机建模时是如何获取气动导数这些信息的呢?
任何飞机建模的早期任务都是收集飞机特征信息,但是这些信息到底如何获取呢?

在JSBsim的官方文档里,作者使用了NASA 技术报告服务器 (NTRS) , 并以Beech 99飞机为例为我们详细演示了如何查找Beech 99飞机相关气动导数资料。

图片链接
在这里插入图片描述
通过这种方法查找气动导数,一般比较准确,但是大多不全,覆盖的范围受限,通常只会涵盖飞机正常使用范围的数据,或者稍微扩展一下。

上面提到的是仿真时用到的方法,主要还是靠其他人提供,但是现实中实际飞机是如何得到气动导数呢?目前主流的还是以下几种方法:

  • 风洞试验

  • CFD数值计算

  • 气动参数辨识

    最小二乘法
    神经网络

  • 飞行试验

另外, 计算力和力矩时要注意所用的坐标系:
• DRAG, SIDE, LIFT (气流坐标系)
• X, Y, Z (机体坐标系)
• AXIAL, SIDE, NORMAL (机体坐标系)

襟翼展开状态对升力的贡献值计算:

<function name="aero/force/CLDf">
 	<description>Lift contribution due to flap deflection</description>
 	<product>
 		<property>aero/function/ground-effect-factor-lift</property>
 		<property>aero/qbar-area</property>
 		<table>
 			<independentVar>fcs/flap-pos-deg</independentVar>
 			<tableData>
 				0.0 	0.0
 				10.0 	0.20
 				20.0 	0.30
 				30.0 	0.35
 			</tableData>
 		</table>
 	</product>
</function>

关于飞机的受力,除了所受空气动力十分复杂外,飞机发动机的推力计算也很复杂,受飞行高度、速度、滑油温度等参数影响很大。矢量喷气发动机还要考虑发动机方向。

推力计算

在JSBsim中,支持活塞发动机、火箭发动机、涡轮发动机、螺旋桨发动机、电动发动机

在这里插入图片描述

官方文档中关于这一部分介绍较少,因此直接从JSBsim代码中找相关属性分析:

F15XML文件中关于推力的介绍:

    <propulsion>发动机推力        根元素,表示整个配置部分是关于飞机的推进系统
        <engine file="F100-PW-229">定义了一个发动机模型、型号F100-PW-229
            <feed>0</feed>定义了发动机的输入,可能指的是从哪里获取燃料
            <feed>1</feed>
            <thruster file="direct">
                <location unit="IN">发动机在机体坐标系的位置坐标,单位:英寸
                    <x> 50 </x>            1.27米
                    <y> -25.5 </y>         0.6477米
                    <z> 0 </z>
                </location>
                <orient unit="DEG">  发动机推力方向,单位:度
                    <roll> 0.0 </roll>推力器绕X轴(滚转)的旋转角度
                    <pitch> 0.0 </pitch>推力器绕Y轴(俯仰)的旋转角度
                    <yaw> 0.0 </yaw>推力器绕Z轴(偏航)的旋转角度
                </orient>
            </thruster>
        </engine>   第二个发动机,相同型号。。。
        <engine file="F100-PW-229">
            <feed>0</feed>
            <feed>1</feed>
            <thruster file="direct">
                <location unit="IN">
                    <x> 50 </x>
                    <y> 25.5 </y>
                    <z> 0 </z>
                </location>
                <orient unit="DEG">
                    <roll> 0.0 </roll>
                    <pitch> 0.0 </pitch>
                    <yaw> 0.0 </yaw>
                </orient>
            </thruster>
        </engine>
        <tank type="FUEL">    <!-- Tank number 0 -->    定义了一个燃料箱
            <location unit="IN">                        燃料箱位置,单位:英寸
                <x> -236.39 </x>             6.004306米
                <y> 0 </y>
                <z> 4.5 </z>                  0.1143米
            </location>
            <capacity unit="LBS"> 6561.5 </capacity>  燃料箱容量单位:磅,2976.24kg
            <contents unit="LBS"> 2500 </contents>   当前燃料量单位:磅,1133.98kg
        </tank>
        <tank type="FUEL">    <!-- Tank number 1 -->    第二个燃料箱
            <location unit="IN">
                <x> -236.39 </x>
                <y> 0 </y>
                <z> 4.5 </z>
            </location>
            <capacity unit="LBS"> 6561.5 </capacity>
            <contents unit="LBS"> 2500 </contents>
        </tank>
    </propulsion>结束————————

根据上面的介绍可以知道F15选用的发动机型号是F100-PW-229

直接查找发动机F100-PW-229的相关XML文件,就可以知道F15飞机所用发动机的推力计算方法。

<?xml version="1.0"?>版本
<!--
  File:     F100-PW-229.xml
  Author:   Aero-Matic v 0.8

  Inputs:
    name:           F100
    type:           turbine
    thrust:         17800 lb
    augmented?      yes
    injected?       no
-->注释

<turbine_engine name="F100">      根元素
  <milthrust>   17800.0 </milthrust>          军用推力
  <maxthrust>   29000.0 </maxthrust>          最大推力
  <bypassratio>     0.4 </bypassratio>		  旁通比,即旁通气流与核心气流的比值
  <tsfc>            0.74 </tsfc>              海平面特定燃料消耗率
  <atsfc>           2.05 </atsfc>             高空特定燃料消耗率
  <idlen1>         40.0 </idlen1>             怠速转速
  <idlen2>         53.0 </idlen2>             怠速转速
  <maxn1>         100.0 </maxn1>              最大转速
  <maxn2>         100.0 </maxn2>              最大转速
  <augmented>         1 </augmented>          是否增压
  <augmethod>         2 </augmethod>          增压方法????
  <injected>          0 </injected>           是否喷射

  <function name="IdleThrust">怠速推力计算,根据马赫数和高度查表计算
   <table>
    <independentVar lookup="row">velocities/mach</independentVar>
    <independentVar lookup="column">atmosphere/density-altitude</independentVar>
    <tableData>
         -10000     0     10000   20000   30000   40000   50000   60000
     0.0  0.0430  0.0488  0.0528  0.0694  0.0899  0.1183  0.1467  0.0
     0.2  0.0500  0.0501  0.0335  0.0544  0.0797  0.1049  0.1342  0.0
     0.4  0.0040  0.0047  0.0020  0.0272  0.0595  0.0891  0.1203  0.0
     0.6 -0.0804 -0.0804 -0.0560 -0.0237  0.0276  0.0718  0.1073  0.0
     0.8 -0.2129 -0.2129 -0.1498 -0.1025  0.0474  0.0868  0.0900  0.0
     1.0 -0.2839 -0.2839 -0.1104 -0.0469 -0.0270  0.0552  0.0800  0.0
    </tableData>
   </table>
  </function>

  <function name="MilThrust">军用推力计算
   <table>
    <independentVar lookup="row">velocities/mach</independentVar>
    <independentVar lookup="column">atmosphere/density-altitude</independentVar>
    <tableData>
          -10000       0   10000   20000   30000   40000   50000   60000
     0.0   1.2600  1.0000  0.7400  0.5340  0.3720  0.2410  0.1490  0.0
     0.2   1.1710  0.9340  0.6970  0.5060  0.3550  0.2310  0.1430  0.0
     0.4   1.1500  0.9210  0.6920  0.5060  0.3570  0.2330  0.1450  0.0
     0.6   1.1810  0.9510  0.7210  0.5320  0.3780  0.2480  0.1540  0.0
     0.8   1.2580  1.0200  0.7820  0.5820  0.4170  0.2750  0.1700  0.0
     1.0   1.3690  1.1200  0.8710  0.6510  0.4750  0.3150  0.1950  0.0
     1.2   1.4850  1.2300  0.9750  0.7440  0.5450  0.3640  0.2250  0.0
     1.4   1.5941  1.3400  1.0860  0.8450  0.6280  0.4240  0.2630  0.0
    </tableData>
   </table>
  </function>

  <function name="AugThrust">增压推力计算
   <table>
    <independentVar lookup="row">velocities/mach</independentVar>
    <independentVar lookup="column">atmosphere/density-altitude</independentVar>
    <tableData>
           -10000       0   10000   20000   30000   40000   50000   60000
     0.0    1.1816  1.0000  0.8184  0.6627  0.5280  0.3756  0.2327  0.0
     0.2    1.1308  0.9599  0.7890  0.6406  0.5116  0.3645  0.2258  0.0
     0.4    1.1150  0.9474  0.7798  0.6340  0.5070  0.3615  0.2240  0.0
     0.6    1.1284  0.9589  0.7894  0.6420  0.5134  0.3661  0.2268  0.0
     0.8    1.1707  0.9942  0.8177  0.6647  0.5309  0.3784  0.2345  0.0
     1.0    1.2411  1.0529  0.8648  0.7017  0.5596  0.3983  0.2467  0.0
     1.2    1.3287  1.1254  0.9221  0.7462  0.5936  0.4219  0.2614  0.0
     1.4    1.4365  1.2149  0.9933  0.8021  0.6360  0.4509  0.2794  0.0
     1.6    1.5711  1.3260  1.0809  0.8700  0.6874  0.4860  0.3011  0.0
     1.8    1.7301  1.4579  1.1857  0.9512  0.7495  0.5289  0.3277  0.0
     2.0    1.8314  1.5700  1.3086  1.0474  0.8216  0.5786  0.3585  0.0
     2.2    1.9700  1.6900  1.4100  1.2400  0.9100  0.6359  0.3940  0.0
     2.4    2.0700  1.8000  1.5300  1.3400  1.0000  0.7200  0.4600  0.0
     2.6    2.2000  1.9200  1.6400  1.4400  1.1000  0.8000  0.5200  0.0
    </tableData>
   </table>
  </function>

</turbine_engine>

地面效应

外力作用

弹射器、钩、金属线捕获装置、拖绳、降落伞等外力

飞行控制和系统建模

系统组件

飞行控制考虑的因素有:飞行控制率、增稳系统、自动驾驶等技术

实现方法:提供增益、滤波器、交换机等组件,通过配置组成控制系统。

飞机系统被指定为飞机系统配置文件中< 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>
 	<channel name=”Pitch attitude hold”>俯仰控制通道
 		… components …
 	</channel>
		… additional channels …
</autopilot>

关于这段代码中, 用于控制飞机的横滚角(Roll)的自动控制使用了PID控制器、开关和纯增益组件。下面是对每个组件的解释和计算方式:

  1. PID控制器 (<pid>):

    • name: “fcs/roll-ap-error-pid”,这是控制器的名称,用于在系统中标识这个PID控制器。
    • input: “attitude/phi-rad”,这是PID控制器的输入,表示横滚角的当前值,单位是弧度。
    • kp: 1.0,比例增益,用于调节误差的比例部分。
    • ki: 0.01,积分增益,用于调节误差的累积部分。
    • kd: 0.1,微分增益,用于调节误差的变化率。

    PID控制器的输出计算公式是:
    output = k p × e ( t ) + k i × ∫ e ( t )   d t + k d × d e ( t ) d t \text{output} = kp \times e(t) + ki \times \int e(t) \, dt + kd \times \frac{de(t)}{dt} output=kp×e(t)+ki×e(t)dt+kd×dtde(t)
    其中 e ( t ) e(t) e(t) 是当前误差,即期望横滚角与实际横滚角的差值。

  2. 开关/交换机 (<switch>):

    • name: “fcs/roll-ap-autoswitch”,这是开关的名称。
    • default value: “0.0”,当没有满足任何测试条件时,开关的默认输出值。
    • test: 包含一个条件表达式 “ap/attitude_hold == 1”,当这个条件为真时,开关的输出值将设置为测试中指定的值,即 “fcs/roll-ap-error-pid” 的输出。

    这个开关的作用是根据 “ap/attitude_hold” 的状态来决定是否使用 PID 控制器的输出。

  3. 纯增益 (<pure_gain>):

    • name: “fcs/roll-ap-aileron-command-normalizer”,这是增益组件的名称。
    • input: “fcs/roll-ap-autoswitch”,这是增益组件的输入,即开关的输出。
    • gain: -1,增益值,用于调节输入信号的幅度。

    纯增益组件的输出计算公式是:

    output = gain × input \text{output} = \text{gain} \times \text{input} output=gain×input

    在这个例子中,输出将是开关输出的负值。

综上所述,这些组件联合工作来实现横滚控制的自动调节。首先,PID控制器根据横滚角的误差计算一个控制信号,然后通过开关根据 “ap/attitude_hold” 的状态决定是否使用这个信号,最后通过纯增益组件调整控制信号的幅度,以驱动飞机的副翼或其他控制面进行横滚控制。

但上面的自动驾驶控制的实现是专门针对于C172X 自动驾驶仪的,不具备通用性,那么通用性是如何实现的呢?

看下面的代码:

<autopilot name="C-310 Autopilot">
<!-- 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="AP roll wing leveler">
 ...
 	<pid name="fcs/roll-ap-error-pid">
 		<input>attitude/phi-rad</input>
 		<kp> ap/roll-pid-kp </kp>
 		<ki> ap/roll-pid-ki </ki>
 		<kd> ap/roll-pid-kd </kd>
 		<trigger> fcs/wing-leveler-ap-on-off </trigger>
 	</pid>
 ...

这段代码是飞行控制系统(FCS)配置文件的一部分,用于定义一个名为 “C-310 Autopilot” 的自动驾驶仪的属性和行为。在这个配置中,定义了自动驾驶仪的一些控制特性,包括横滚姿态保持(Wing Leveler)功能。以下是详细解释:

  1. 自动驾驶仪属性:

    • property: 定义了自动驾驶仪的一些控制属性,这些属性可以用于控制自动驾驶仪的行为。例如,ap/attitude_holdap/altitude_hold 分别用于控制姿态保持和高度保持功能。
  2. PID控制器参数:

    • property value="50.0"> ap/roll-pid-kp </property>: 定义了横滚PID控制器的比例增益(Kp)为50.0。
    • property value="5.0"> ap/roll-pid-ki </property>: 定义了横滚PID控制器的积分增益(Ki)为5.0。
    • property value="17.0"> ap/roll-pid-kd </property>: 定义了横滚PID控制器的微分增益(Kd)为17.0。
  3. 横滚姿态保持(Wing Leveler):

    • channel name="AP roll wing leveler": 定义了一个名为 “AP roll wing leveler” 的控制通道,用于横滚姿态保持。
    • pid name="fcs/roll-ap-error-pid": 在这个控制通道中定义了一个PID控制器,用于计算横滚姿态保持所需的控制信号。
  4. PID控制器配置:

    • input>attitude/phi-rad</input: PID控制器的输入是飞机的横滚角(phi),单位为弧度。
    • kp> ap/roll-pid-kp </kp>: PID控制器的比例增益使用前面定义的属性 ap/roll-pid-kp
    • ki> ap/roll-pid-ki </ki>: PID控制器的积分增益使用前面定义的属性 ap/roll-pid-ki
    • kd> ap/roll-pid-kd </kd>: PID控制器的微分增益使用前面定义的属性 ap/roll-pid-kd
    • trigger> fcs/wing-leveler-ap-on-off </trigger>: 定义了一个触发器,用于控制PID控制器的激活和关闭。当触发器 fcs/wing-leveler-ap-on-off 被激活时,PID控制器开始工作。

综上所述,这段配置定义了一个横滚姿态保持功能,当触发器 fcs/wing-leveler-ap-on-off 被激活时,PID控制器会根据飞机当前的横滚角与其目标值(通常为0,即水平姿态)之间的误差来计算控制信号,然后通过飞行控制系统调整飞机的控制面(如副翼)。

自动飞行

JSBSim的一个长期目标是支持自动的脚本飞行。脚本飞行指的是JSBSim能够在独立模式下运行(除了视觉效果,因为jsbsim不支持图画显示),并以稳定的方式飞行到各种目标,包括高度和航向,或经纬度等。这样能够更加方便JSBSim的回归测试、飞机飞行模型性能测试和控制系统的开发

要实现这一目标,至少要包括这些文件:

  1. 一个能够引导飞机打开发动机,推进油门,并飞向一个目标的航向、高度或速度的脚本文件。
  2. 定义飞机属性的飞机配置文件,飞机属性包括飞行控制系统
  3. 自动驾驶仪文件(如果和第二条分开的话)

下面建立一个简单的自动驾驶仪,举例来说:前面我们已经知道飞机在飞行过程中,由于发动机扭矩、大气湍流、燃料损耗等会受到各种力,这些力随着飞机状态的变化而变化,扰乱飞机并使其发生滚转运动,而为了使飞机保持稳定,我们需要操纵副翼来使得飞机滚转角变化平稳且维持在 0 附近。那么如何控制副翼呢?

其实就是采用PID(比例P、积分 I 和微分D)控制。

在这里插入图片描述

<channel name="AP Roll Wing Leveler">
 	<pure_gain name="ap/limited-phi">
 		<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> ap/limited-phi </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-error-summer">
 			ap/attitude_hold == 1
  		</test>
 	</switch>
 	<pure_gain name="ap/roll-ap-aileron-command-normalizer">
 		<input> ap/roll-ap-autoswitch </input>
 		<gain> -1 </gain>
 	</pure_gain>
</channel>
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值