我们将继续发表一系列有关在小型无人机上自动执行特技飞行性能的文章。 本文首先提出了一个教育目标:在这里,我们将以仅使用副翼控制飞机时执行“桶状”特技飞行的任务为例,展示如何创建最简单的自动控制系统(ACS)。 本文是“飞行无人机”系列出版物中的第二篇,该系列介绍了以培训形式建造自行火炮的硬件和软件部分的过程。

链接到该周期的上一篇文章:
1.“飞行无人机。 如何做桶“内容:
引言运动模型模型参数。 转动惯量模型参数。 侧倾力矩的导数模型验证控制综合以提高机筒性能飞行实验备注结论引言
因此,我们决定以自动模式实施“桶”。 显然,为了自动执行图形,必须制定相应的控制律。 如果您使用飞机运动的数学模型,则发明过程将更加轻松快捷。 尽管可以在飞行实验中测试控制律,但需要花费更多的时间,如果丢失或损坏设备,则可能会花费更多。
由于在飞机的小攻角和滑行角下,其侧倾运动实际上与其他两个通道的运动无关:跟踪和纵向-要完成一个简单的“枪管”,仅围绕一个轴(关联的
SC的轴
OX)建立运动模型就足够了。 出于同样的原因,在创建完整的控制系统时,副翼控制定律不会发生重大变化。
运动模型
飞机围绕相关SC的纵轴
OX的运动方程非常简单:
Ix\点 mathrm omegax=Mx,
在哪里
Ix 绕轴
OX的惯性矩是
Mx 由几个组成部分组成,其中对于飞机的运动的真实描述,仅考虑两个即可:
Mx=M omegaxx omegax+M deltaax deltaa,
在哪里
M omegaxx omegax -飞机绕
OX轴旋转的力矩(阻尼力矩),
M deltaax deltaa -由于副翼偏离而产生的力矩(控制力矩)。 最后一个表达式以线性化形式编写:滚动力矩
Mx 线性依赖于角速度
omegax 和副翼偏转角
deltaa 具有恒定的比例系数
M omegaxx 和
M deltaax 相应地。
如您所知(例如,来自
Wiki ),一个线性微分方程
Ix\点 mathrm omegax=M omegaxx omegax+M deltaax deltaa
对应于一阶的非周期性链接
W= frackTp+1,
在哪里
W -传递函数
p -微分运算符,
T 时间是常数吗?
k -收获。
如何从微分方程转换为传递函数?在我们的情况下,从方程式的参数到传递函数的参数,我们可以按以下步骤进行(知道导数
M omegaxx 否定):
Ix\点 omegax=M omegaxx omegax+M deltaax deltaa longrightarrowIx\点 omegax=−\左|M omegaxx\对| omegax+M deltaax deltaa
Ix\点 omegax+\左|M omegaxx\对| omegax=M deltaax deltaa longrightarrow\向左(Ixp+\向左|M omegaxx向右|\向右) omegax=M deltaax deltaa
\左( fracIx\左|M omegaxx\右|p+1\右) omegax= fracM deltaax\左|M omegaxx\右| deltaa longrightarrowT= fracIx\左|M omegaxx right|,k= fracM deltaax\左|M omegaxx right|
对于非周期性链接,时间常数
T 等于输出量的时间
omegax(t) 输入量的单步效应
deltaa(t) 取一个不同于稳态约5%的值,增益
k 通过一步效应在数值上等于输出值的稳态值:
构造的运动模型中有两个未知参数:增益
k 和时间常数
T 。 这些参数通过物理系统的特性表示:惯性矩
Ix 以及侧倾力矩的导数
M omegaxx 和
M deltaax :
M omegaxx=− fracIxT, colorwhite longrightarrowM deltaax=−kM omegaxx= frackIxT
因此,如果知道惯性矩
Ix 然后,在确定了模型参数之后,可以从中恢复系统参数。
模型参数。 转动惯量 Ix
我们的飞机由以下部分组成:机翼,带有羽毛的机身,发动机,电池(电池)和
航空电子设备 :

航空电子设备包括:自动驾驶板,
SNA接收器板,无线电调制解调器板,控制设备的信号接收器板,两个稳压器,一个发动机转速调节器以及连接线。

由于航空电子设备重量轻,可以忽略其对总惯性矩的贡献。
惯性矩如何估算?转动惯量的估算
Ix 可以如下进行。 让我们看一下沿
OX轴的平面:

然后以以下简化模型的形式想象它:
惯性矩计算方案 Ix 。 左上方-电池,右下方-引擎。 引擎和电池位于机身轴上可以看出,创建模型时,龙骨,水平尾翼,螺钉和航空电子设备被丢弃。 在这种情况下,剩下的就是:机身,机翼,电池,发动机。 通过测量每个部分的质量和特征尺寸,我们可以计算每个部分相对于机身纵轴的惯性矩:
- 机翼(细杆): Ixw= frac112mwL2w+mwy2w=1.7 cdot10−2kg cdotm2
- 机身(空心圆柱): Ixf=mfr2f=2.8 cdot10−4kg cdotm2
- 电池(极板): Ixa= frac112ma left(h2a+w2a right)=3.4 cdot10−4kg cdotm2
- 引擎(磁盘): Ixe= frac12mer2e=2.3 cdot10−5kg cdotm2
飞机相对于轴
OX的惯性矩的总值
是通过将零件的惯性矩相加得出的:
Ix=Ixw+Ixf+Ixa+Ixe=1.8 cdot10−2kg cdotm2
估计飞机各部分对总惯性矩的贡献
Ix ,结果如下:
可以看出,对总转动惯量的主要贡献
Ix 做一个翅膀。 这是由于机翼的横向尺寸相当大(机翼跨度-1 m):

因此,尽管重量适中(约占飞机总起飞质量的20%),机翼仍具有显着的惯性矩。
模型参数。 侧倾力矩的导数 M omegaxx 和 M deltaax
侧倾力矩导数的计算是与通过数值方法或使用工程技术来计算飞机的空气动力特性相关的相当困难的任务。 第一次和第二次的应用需要大量的时间,智力和计算成本,这在大型飞机控制系统的开发中是合理的,在这种系统中,错误的成本仍然超过了建立良好模型的成本。 对于重量不超过2千克的无人机控制任务,这种方法几乎是不合理的。 计算这些导数的另一种方法是飞行实验。 考虑到我们飞机的廉价性,以及适合进行此类实验的合适领域,选择对于我们来说是显而易见的。
将固件写入自动驾驶仪以进行手动控制和参数注册后,我们组装了飞机并准备进行测试:

在飞行实验中,有可能获得有关副翼偏离角和飞机旋转角速度的数据。 飞行员以手动模式控制飞机,绕圈飞行,转弯和“发动”,并记录了机载设备并将必要的信息发送给地面站。 结果,获得了必要的依赖关系:
omegax(t) (deg / s)和
deltaa(t) (b / p)。 价值
deltaa(t) 代表归一化的副翼偏离角:值1对应于最大偏差,值-1对应于最小值:

现在如何确定
M omegaxx 和
M deltaax 从收到的数据? 答案是在图形上测量瞬态参数。
omegax(t) 和
deltaa(t) 。
如何确定系数k和T?增益
k 通过将角速度的稳态值分配给副翼偏差值来确定:
在飞行实验中获得的副翼偏转角和侧倾角速度与时间的关系在前面的图中,角速度的稳态值的各个部分大致对应于例如时刻422、425和438s附近的片段(在图中以深红色标记)。
时间常数
T 由相同的图表确定。 为此,发现副翼偏转角急剧变化的部分,然后测量角速度取与稳态值相差5%的值的时间。
确定时间常数和增益值的结果如下:
T=0.075 texts ,
k=−575\文字deg/s 。 这些系数的值具有已知的惯性矩值
Ix 横摆力矩的导数的以下值相对应:
M omegaxx=− fracIxT=−0.24 frac textN cdot textm textdeg/s, color白色 longrightarrowM deltaax=−kM omegaxx= frackIxT=−138 frac\文本N cdot\文本m\文本[]
模型验证
因此,建立了一个模型,其基础是非周期性链接
W= frac−5750.75p+1,
可以通过对输入信号进行验证
\德尔塔(t) 从飞行实验中获得,并将模型的输出信号与该值进行比较
omegax(t) 在实验中也得到了。
模拟是如何完成的?我们主要是根据广泛的读者重复结果的可能性来选择建模工具的:这主要意味着该程序应该在公共领域。 原则上,可以通过从头开始创建自己的工具来解决对一阶非周期性链接的行为建模的问题。 但是由于将来模型会变得更加复杂,因此,您自己创建乐器可能会分散主要任务(即自行火炮的创建)的注意力。 考虑到工具的开放性原则,我们选择了
JSBsim 。
在上一节中,我们获得了系数值
M deltaax 和
M omegaxx 。 我们使用它们来模拟飞机的运动。 在
上一篇文章中,我们记得在
JSBsim中飞机模型的配置是使用
XML文件设置的。 创建自己的模型:
<?xml version="1.0"?> <fdm_config name="OP1" version="2.0" release="BETA"> <metrics> <wingarea unit="M2"> 0.2 </wingarea> <wingspan unit="M"> 1.0 </wingspan> <chord unit="M"> 0.2 </chord> <htailarea unit="M2"> 0.03 </htailarea> <htailarm unit="M"> 0.5 </htailarm> <vtailarea unit="M2"> 0.03 </vtailarea> <vtailarm unit="M"> 0.5 </vtailarm> <location name="AERORP" unit="M"> <x> -0.025 </x> <y> 0 </y> <z> 0.05 </z> </location> </metrics> <mass_balance> <ixx unit="KG*M2"> 0.018 </ixx> <iyy unit="KG*M2"> 0.018 </iyy> <izz unit="KG*M2"> 0.018 </izz> <emptywt unit="KG"> 1.2 </emptywt> <location name="CG" unit="M"> <x> 0 </x> <y> 0 </y> <z> 0 </z> </location> </mass_balance> <ground_reactions> </ground_reactions> <propulsion> </propulsion> <flight_control name="FCS: OP1"> <channel name="Pitch"> </channel> <channel name="Roll"> <summer name="Roll Trim Sum"> <input>fcs/aileron-cmd-norm</input> <clipto> <min>-1</min> <max>1</max> </clipto> </summer> </channel> <channel name="Yaw"> </channel> </flight_control> <aerodynamics> <axis name="DRAG"> </axis> <axis name="SIDE"> </axis> <axis name="LIFT"> </axis> <axis name="ROLL" unit="N*M"> <function name="aero/coefficient/Clp"> <description>Roll_moment_due_to_roll_rate</description> <product> <property>velocities/p-aero-rad_sec</property> <value>-0.24</value> </product> </function> <function name="aero/coefficient/Clda"> <description>Roll_moment_due_to_aileron</description> <product> <property>fcs/aileron-cmd-norm</property> <value> 2.4 </value> </product> </function> </axis> <axis name="PITCH"> </axis> <axis name="YAW"> </axis> </aerodynamics> <output name="OP1.csv" rate="60" type="CSV"> <property> velocities/vc-kts </property> <property> aero/alphadot-deg_sec </property> <property> aero/betadot-deg_sec </property> <property> fcs/throttle-cmd-norm </property> <simulation> OFF </simulation> <atmosphere> OFF </atmosphere> <massprops> OFF </massprops> <aerosurfaces> ON </aerosurfaces> <rates> ON </rates> <velocities> ON </velocities> <forces> OFF </forces> <moments> OFF </moments> <position> ON </position> <coefficients> OFF </coefficients> <ground_reactions> OFF </ground_reactions> <fcs> ON </fcs> <propulsion> OFF </propulsion> </output> </fdm_config>
由于我们仅针对设备沿移动方向建立模型,因此我们将许多文件部分留空。 在模型文件中依次设置以下特征。
飞机
的几何尺寸在“
度量”部分中设置:机翼面积,翼展,平均空气动力弦长,水平尾翼面积,水平尾翼肩宽,垂直尾翼面积,垂直尾翼肩宽,空气动力学焦点位置。
在质量 平衡部分设置飞机的
质量特性 :飞机惯性张量,空重,质心位置。
值得注意的是,空气动力学焦点的绝对位置和飞机的质心不参与设备动力学的计算,它们的相对位置很重要。
以下各节描述了飞机起落架及其动力装置的特性。
在负责
控制系统的下一部分中,我们将填写负责侧倾控制的通道:我们将指示唯一的输入
fcs / aileron-cmd-norm ,其值将从-1标准化为1。
在
空气动力学部分中设置了
空气 动力学特性 :在高速坐标系中设置了力,在耦合坐标系中设置了力矩。 我们对滚动时刻感兴趣。 在
轴名称=“ ROLL”部分中,定义了一些函数,这些函数确定气动力矩在相关坐标系
OX轴上的投影的各个组成部分中的力矩。 我们的模型中有两个这样的组件。 第一个分量是阻尼力矩,它等于角速度乘以先前确定的系数的乘积
M omegaxx 。 第二部分是副翼在固定飞行速度下的力矩:它等于先前确定的系数的乘积
M deltaax 通过副翼的偏离量。
值得注意的是,在确定系数时
M deltaax 使用尺寸值
T 。 在我们的飞行数据中,角速度以每秒度数为单位,而
JSBSim使用弧度每秒,因此系数
M deltaax 必须减小到所需的尺寸,即除以180度再乘以
pi 弧度 我们记下产品
产品功能内部空气动力的这些分量。 在建模时,将所有功能的结果相加,并获得空气动力力矩在相应轴上的投影值。
您可以在飞行测试期间获得的实验数据上验证创建的模型。 为此,请创建具有以下内容的脚本:
<?xml version="1.0" encoding="utf-8"?> <runscript> <use aircraft="ownPlane1" initialize="scripts/airborne"/> <run start="0" end="51" dt="0.01"> <event name="Trims"> <condition> sim-time-sec ge 0.0 </condition> <set name="simulation/do_simple_trim" value="5"/> </event> <event name="Time Notif" continuous="true"> <description>Provide a time history input for the aileron</description> <condition> sim-time-sec ge 0</condition> <set name="fcs/aileron-cmd-norm" > <function> <table> <independentVar lookup="row">sim-time-sec</independentVar> <tableData> 0 0.00075 0.1 0.00374 0.2 -0.00075 0.3 -0.00075 0.4 -0.00075 0.5 -0.00075 0.6 0.00075 0.7 0.00075 ... 48.8 -0.00075 48.9 0.00000 49 -0.00075 </tableData> </table> </function> </set> </event> </run> </runscript>
点表示缺少数据。 在上一篇文章熟悉的脚本文件中,出现了一种新的事件类型(
“ Time Notif” ),它使您可以及时设置参数的连续变化。 参数对时间的依赖性由表格功能设置。
JSBSim在表格数据之间线性插值函数值。 横摇运动模型的验证过程包括在创建的模型上执行此脚本,并将结果与实验结果进行比较。
验证结果如图所示:

从图中可以看出,模型与现实的重合并不完全。
控制综合以提高机筒性能
收到模型后,很容易确定需要使副翼偏转多少和多长时间才能完成“炮管”。 一种选择是以下偏差算法:
- t=0 :副翼开始偏离中立位置;
- t=0.1\文字c :副翼被50%拒绝;
- t=1.3\文字c :副翼开始偏离到中立位置;
- t=1.4\文字c :副翼处于中立状态。
在副翼偏转算法的开始和结束时存在持续时间为0.1 s的段,这些段模拟了伺服驱动器的惯性,该惯性无法立即使表面偏转。 该模型显示,通过这种副翼偏转定律,飞机必须完成围绕
OX轴的一整圈旋转,检查吗?
飞行实验
由此产生的副翼控制定律被编程到安装在飞机上的自动驾驶仪上。 实验的想法很简单:使飞机水平飞行,然后使用获得的控制律。 如果飞机沿横摇的真实运动与创建的模型相对应,则飞机必须执行“炮管”操作-360度的完整旋转。
我们对我们忠实的飞行员的工作,专业精神和通用货车上舒适的行李箱表示感谢!
在实验过程中,很明显,成功建立了侧倾模型-飞行员一旦激活了程序控制律,飞机便一次又一次地执行“炮管”动作。 下图显示了角速度
omegax 在实验过程中记录下来并从模拟结果中获得,以及飞行实验中的后跟角度和俯仰角度:

下图显示了在飞行实验中记录的副翼,升降舵(RV)和方向舵(RN)的信号:

垂直线表示执行“桶”开始和结束的时刻。 从图中可以看出,在执行“炮管”过程中,飞行员并未干预电梯和舵的控制,而且很明显,在执行“炮管”过程中,俯仰角总是趋于减小-飞机将您拖入俯冲,正如模拟结果所预测的那样在飞行模拟器中(请参阅文章
“飞行无人机。如何制造枪管” )。 如果仔细考虑前面的图表,很明显第三个“炮管”甚至没有完成,因为飞行员进行了干预以使飞机脱离俯冲:俯仰角在仅由副翼执行“炮管”时变化很大。
备注
- 为执行“枪管”而建造的自行火炮没有考虑侧倾力矩的导数对飞行速度的依赖性。 一方面,这样做是为了不使管理模式和法律复杂化。 另一方面,如果不是导数,则很容易引入这种依赖性 M omegaxx 和 M deltaax 使用数量 M omegaxx/V2 和 M deltaax/V2 在给定的飞行速度下定义 V 。
- 制定的控制法则是没有反馈的程序控制。 关于角速度和/或侧倾角的反馈的存在将改善图形的准确性,这将在将来完成。
结论
作为我们工作的结果,我们展示了一种创建无人机角速度运动模型的方法
omegax 。 在飞行实验中,证明了所创建的运动模型与模拟对象是一致的。 在开发的模型的基础上,获得了程序控制定律,从而可以在自动模式下执行“枪管”。 我们还确保了仅靠副翼就不可能完成正确的“炮管”,并且我们也清楚地证明了这一点。
下一步将是通过添加反馈来最终确定控制律,并包括电梯控制。 后者将需要创建我们飞机纵向运动的模型。 根据工作结果,将发布下一份出版物。