一个固定翼飞机仿真程序带你系统性上手如何实现配平(工具箱+脚本)
老规矩,该博客所用的模型和脚本已上传至百度网盘,名字为“固定翼配平训练例子”,自己自取。
这几天在帮师弟弄一个项目,关于固定翼飞机的simulink配平,于是记录一下解决过程,里面涉及到使用工具箱以及单纯用m脚本实现配平两种方式。
老规矩,该博客所用的模型和脚本已上传至百度网盘,名字为“固定翼配平训练例子”,自己自取。
一、模型准备
先准备好你的simulink模型,注意必要保证你的配平输入端口必须用simulink里的输入端口连接,且状态输出端口也必须用simulink里的输出端口连接,这样才能保证系统能够识别到你的配平输入是哪些,状态是哪些。如下图这样:
因为这个模型是一个传统的固定翼,因此配平输入端口有四个,另外输出的状态有12个,需要注意后续如果要设计控制器,应将控制器的输出与配平端口相加。
模型准备好后,先别急着先运行它,先到模型设置里面把zhe两个勾勾去掉,即先不引入工作区的配平输入和配平状态。
然后运行模型,看看未配平前的效果。下面这幅图就是我这个飞机未配平时的高度变化和速度变化:
二、开始配平
假设我们要配平的工况为定高直飞(高度-100,速度50,沿着xe方向直飞),打开app里面的模型线性化器。点击下图中的位置:
在里面选择"配平模型",弹出下面的窗口:
第一步,先设置“状态”,由于我们设置的工况为定高匀速直飞,因此三个姿态角均不为已知(已知是指是不是值固定在我们设置的点),显然不是,因此三个姿态的已知框框不勾选,但后面的稳态必须勾选;同理三个角速度也是一样;但在设置三个机体速度时不一样了,因为是定高匀速直飞,因此ub是固定已知的50,因此uv要勾上已知,且值为50,稳态也要勾选,而vb和wb就不已知了,但稳态要勾选;因为是沿着xe方向直飞,所以xe就不已知了,且不属于稳态,ye已知为0,稳态要勾选;ze为已知的-100,稳态要勾选。所以完整的状态设置如图:
然后再设置输入,输入里面的dla、dle、dlr均不为固定已知,所以不管,范围需要根据实际情况进行设置,我们这里先不管,但dlt的范围一定要设置为0-1:
输出那里就不管了,最后再选项里面将算法改为sqp
点击开始配平,出现下面的窗口表示配平成功:
回到模型线性化器窗口,可以看到工作区出现了一个配平点:
双击它,点击弹出窗口右下方的初始化模型,然后设置成下面的样子:
里面的变量名称根据实际情况进行修改。确定后可以在matlab的工作区看到这配平点。
然后回到咱的simulink模型,再次开打模型设置,此时把之前去掉的两个勾勾勾上,并把括号里的参数名字改为咱定的配平名。
然后可以仿真,可以看到高度和速度都稳住了,即配平成功:
下面介绍如何不适用工具箱,直接用脚本进行配平,其实很简单,因为脚本里面的每一句话都对应工具箱里面的操作,这里不再重复说,直接放上代码,相信你可以看懂。
% 加载飞机参数
mass = 1247;
mass_ex = 50;
S = 17.09;
span = 10.18;
chord = 1.74;
inertia = [1421,0,0;0,4086,0;0,0,4786];
initial_pos = [0 0 -100];
initial_vb = [50 0 0];
initial_att = [0 0 0];
initial_pqr = [0 0 0];
Tmax = 4.4024e+03;
g0 = 9.80665;
DEG2RAD = 0.0175;
RAD2DEG = 57.2958;
% 打开 Simulink 模型
AircraftModel = 'PlantModel1_peipingzhuanyong2';
if ~bdIsLoaded(AircraftModel)
open_system(AircraftModel);
end
% 启用快速重启
set_param(AircraftModel, 'FastRestart', 'on');
%% 配平设置
TrimOpt = findopOptions;
TrimOpt.OptimizationOptions.Algorithm = 'sqp';
TrimOpt.OptimizationOptions.TolCon = 1e-3;
TrimOpt.OptimizationOptions.TolConSQP = 1e-4;
TrimOpt.OptimizationOptions.TolFun = 2e-3;
TrimOpt.OptimizationOptions.TolFunValue = 2e-3;
TrimOpt.OptimizationOptions.MaxIter = 800;
TrimOpt.OptimizationOptions.FinDiffType = 'center';
TrimOpt.OptimizationOptions.Display = 'off';
% TrimOpt = findopOptions;
% TrimOpt.OptimizationOptions.Algorithm = 'sqp'; % 使用序列二次规划算法
% TrimOpt.OptimizationOptions.TolCon = 1e-3; % 约束容差
% TrimOpt.OptimizationOptions.TolFun = 2e-3; % 函数值容差
% TrimOpt.OptimizationOptions.MaxIter = 800; % 最大迭代次数
% TrimOpt.OptimizationOptions.Display = 'off'; % 关闭优化过程显示
%% 配平条件
% 定速直飞工况:高度 100 米,速度 50 米/秒
trim_conditions = [100, 50, 0, 0, 0]; % [高度 (m), 速度 (m/s), 攻角 (deg), 侧滑角 (deg), 俯仰角 (deg)]
% 创建操作点规范对象
AircraftOpSpec = operspec(AircraftModel, 1);
% 提取配平条件
H = trim_conditions(1); % 高度 (m)
v_t = trim_conditions(2); % 速度 (m/s)
alpha = trim_conditions(3) / 57.3; % 攻角 (rad)
beta = trim_conditions(4) / 57.3; % 侧滑角 (rad)
theta = trim_conditions(5) / 57.3; % 俯仰角 (rad)
% 计算速度分量
U = v_t * cos(alpha) * cos(beta); % X 轴速度分量
V = v_t * sin(beta); % Y 轴速度分量
W = v_t * sin(alpha) * cos(beta); % Z 轴速度分量
%% 设置状态变量
% 姿态角
AircraftOpSpec.States(1).x(1) = 0; % 滚转角 phi (rad)
AircraftOpSpec.States(1).Known(1) = 0; % 未知,需要优化
AircraftOpSpec.States(1).SteadyState(1) = 1; % 稳态
AircraftOpSpec.States(1).x(2) = 0; % 俯仰角 theta (rad)
AircraftOpSpec.States(1).Known(2) = 0; % 未知,需要优化
AircraftOpSpec.States(1).SteadyState(2) = 1; % 稳态
AircraftOpSpec.States(1).x(3) = 0; % 偏航角 psi (rad)
AircraftOpSpec.States(1).Known(3) = 0;
AircraftOpSpec.States(1).SteadyState(3) = 1; % 稳态
% 角速度
AircraftOpSpec.States(2).x(1) = 0; % 滚转角速度 p (rad/s)
AircraftOpSpec.States(2).Known(1) = 0;
AircraftOpSpec.States(2).SteadyState(1) = 1; % 稳态
AircraftOpSpec.States(2).x(2) = 0; % 俯仰角速度 q (rad/s)
AircraftOpSpec.States(2).Known(2) = 0;
AircraftOpSpec.States(2).SteadyState(2) = 1; % 稳态
AircraftOpSpec.States(2).x(3) = 0; % 偏航角速度 r (rad/s)
AircraftOpSpec.States(2).Known(3) = 0;
AircraftOpSpec.States(2).SteadyState(3) = 1; % 稳态
% 速度分量
AircraftOpSpec.States(3).x(1) = v_t; % X 轴速度分量 U (m/s)
AircraftOpSpec.States(3).Known(1) = 1;
AircraftOpSpec.States(3).SteadyState(1) = 1; % 稳态
AircraftOpSpec.States(3).x(2) = 0; % Y 轴速度分量 V (m/s)
AircraftOpSpec.States(3).Known(2) = 0; % 未知,需要优化
AircraftOpSpec.States(3).SteadyState(2) = 1; % 稳态
AircraftOpSpec.States(3).x(3) = 0; % Z 轴速度分量 W (m/s)
AircraftOpSpec.States(3).Known(3) = 0; % 未知,需要优化
AircraftOpSpec.States(3).SteadyState(3) = 1; % 稳态
% 位置
AircraftOpSpec.States(4).x(1) = 0; % X 轴位置 (m)
AircraftOpSpec.States(4).Known(1) = 0;
AircraftOpSpec.States(4).SteadyState(1) = 0; % 非稳态
AircraftOpSpec.States(4).x(2) = 0; % Y 轴位置 (m)
AircraftOpSpec.States(4).Known(2) = 1; % 已知,固定为零
AircraftOpSpec.States(4).SteadyState(2) = 1; % 稳态
AircraftOpSpec.States(4).x(3) = -H; % Z 轴位置 (m)
AircraftOpSpec.States(4).Known(3) = 1; % 已知,固定为高度
AircraftOpSpec.States(4).SteadyState(3) = 1; % 稳态
%% 设置输入变量
AircraftOpSpec.Inputs(1).u = 0; % 输入 1
AircraftOpSpec.Inputs(1).Known = 0; % 未知,需要优化
AircraftOpSpec.Inputs(2).u = 0; % 输入 2
AircraftOpSpec.Inputs(2).Known = 0; % 未知,需要优化
AircraftOpSpec.Inputs(3).u = 0; % 输入 3
AircraftOpSpec.Inputs(3).Known = 0; % 未知,需要优化
AircraftOpSpec.Inputs(4).u = 0; % 输入 4
AircraftOpSpec.Inputs(4).Known = 0; % 未知,需要优化
AircraftOpSpec.Inputs(4).Min = 0;% 油门输入介于0-1之间
AircraftOpSpec.Inputs(4).Max = 1;
%% 执行配平工具箱
[AircraftOpTrim, opReport] = findop(AircraftModel, AircraftOpSpec, TrimOpt);
% 显示配平结果
disp(opReport);
% 将配平结果应用到模型
set_param(AircraftModel, 'LoadInitialState', 'on', 'InitialState', 'getstatestruct(AircraftOpTrim)');
% 设置模型的初始输入为配平点中的输入值(相当于干了模型配置里面的事)
set_param(AircraftModel, 'LoadExternalInput', 'on', 'ExternalInput', 'getinputstruct(AircraftOpTrim)');
% 运行仿真
sim(AircraftModel);
补充:定迎角直飞的配平设置
更多推荐
所有评论(0)