增益调度三回路自动驾驶仪调优

本示例使用 systune 为三回路自动驾驶仪生成平滑的增益调度。

飞行器模型与三回路自动驾驶仪

本示例使用飞行器俯仰轴动力学的三自由度模型。状态变量为地球坐标系 (Xe,Ze)(X_e,Z_e)(Xe,Ze)、机体坐标系 (u,w)(u,w)(u,w)、俯仰角 θ\thetaθ 以及俯仰角速率 q=θ˙q = \dot\thetaq=θ˙。下图总结了惯性坐标系与机体坐标系之间的关系,以及航迹角 γ\gammaγ、迎角 α\alphaα 和俯仰角 θ\thetaθ 之间的关系。

惯性坐标系与机体坐标系之间的关系

我们采用经典的三回路自动驾驶仪结构来控制航迹角 γ\gammaγ。该自动驾驶仪通过提供足够的法向加速度 aza_zaz(沿 www 方向的加速度)脉冲来调整飞行航迹。反过来,法向加速度通过调整升降舵偏转角 δ\deltaδ 以引起俯仰并改变升力大小来产生。自动驾驶仪在俯仰角速率回路 qqq 中使用比例-积分 (PI) 控制,在 aza_zazγ\gammaγ 回路中使用比例控制。闭环系统(飞行器和自动驾驶仪)在 Simulink 中建模。

open_system(‘rct_airframeGS’)

闭环系统的 Simulink 模型

自动驾驶仪增益调度

飞行器动力学是非线性的,且气动力和力矩取决于速度 VVV 和迎角 α\alphaα。为了在整个 (α,V)(\alpha,V)(α,V) 飞行包线内获得合适的性能,自动驾驶仪增益必须作为 α\alphaαVVV 的函数进行调整,以补偿被控对象动态特性的变化。此调整过程称为“增益调度”,α,V\alpha,Vα,V 称为调度变量。在 Simulink 模型中,增益调度通过由 α\alphaαVVV 测量值驱动的查找表实现。

增益调度是一种用于控制非线性或时变被控对象的线性技术。其思想是在各种工作条件下计算被控对象的线性近似,在每个工作条件下调整控制器增益,并在运行期间根据工作条件切换增益。传统的增益调度包含以下三个主要步骤。

  1. 在每个工作条件下对被控对象进行配平和线性化
  2. 为每个工作条件下的线性化动态特性调整控制器增益
  3. 协调增益值以提供工作条件之间的平滑过渡。

在本示例中,您通过将自动驾驶仪增益参数化为 α,V\alpha,Vα,V 的一阶多项式,并直接针对整个飞行包线调整多项式系数,从而将步骤 2 和 3 结合起来。这种方法消除了步骤 3,并保证了增益随 α\alphaαVVV 平滑变化。此外,增益调度系数可以使用 systune 自动调整。

配平与线性化

假设迎角 α\alphaα 在 -20 到 20 度之间变化,速度 VVV 在 700 到 1400 m/s 之间变化。当忽略重力时,飞行器动力学在 α\alphaα 上是对称的。因此,仅考虑 α\alphaα 的正值。使用 5×9 的线性间隔 (α,V)(\alpha,V)(α,V) 对网格来覆盖飞行包线。

nA = 5; % alpha 值的数量
nV = 9; % V 值的数量
[alpha,V] = ndgrid(linspace(0,20,nA)*pi/180,linspace(700,1400,nV));

对于每个飞行条件 (α,V)(\alpha,V)(α,V),在配平状态(零法向加速度和俯仰力矩)下线性化飞行器动力学。这需要计算能导致 wwwqqq 稳定的升降舵偏转角 δ\deltaδ 和俯仰角速率 qqq。为此,首先将飞行器模型隔离在一个单独的 Simulink 模型中。

mdl = ‘rct_airframeTRIM’;
open_system(mdl)

用于配平的飞行器模型

使用 operspec 指定配平条件,使用 findop 计算 δ\deltaδqqq 的配平值,并针对得到的操作点线性化飞行器动力学。有关详细信息,请参阅 Trim and Linearize an Airframe (Simulink Control Design)。针对 45 个飞行条件 (α,V)(\alpha,V)(α,V) 重复这些步骤。

计算每个 (α,V)(\alpha,V)(α,V) 对的配平条件。

for ct=1:nA*nV
alpha_ini = alpha(ct); % 迎角 [rad]
v_ini = V(ct); % 速度 [m/s]

% 指定配平条件
opspec(ct) = operspec(mdl);
% Xe,Ze: 已知,非稳态
opspec(ct).States(1).Known = [1;1];
opspec(ct).States(1).SteadyState = [0;0];
% u,w: 已知,w 稳态
opspec(ct).States(3).Known = [1 1];
opspec(ct).States(3).SteadyState = [0 1];
% theta: 已知,非稳态
opspec(ct).States(2).Known = 1;
opspec(ct).States(2).SteadyState = 0;
% q: 未知,稳态
opspec(ct).States(4).Known = 0;
opspec(ct).States(4).SteadyState = 1;
end
opspec = reshape(opspec,[nA nV]);

根据给定规格配平模型。

Options = findopOptions(‘DisplayReport’,‘off’);
op = findop(mdl,opspec,Options);

在配平条件下线性化模型。

G = linearize(mdl,op);
G.u = ‘delta’;
G.y = {‘alpha’,‘V’,‘q’,‘az’,‘gamma’,‘h’};
G.SamplingGrid = struct(‘alpha’,alpha,‘V’,V);

此过程在 45 个飞行条件 (α,V)(\alpha,V)(α,V) 下生成一个 5×9 的线性化被控对象模型数组。被控对象动态特性在整个飞行包线内变化显著。

sigma(G)
title(‘飞行器动态特性的变化’)

飞行包线内飞行器动态特性的变化

可调增益曲面

自动驾驶仪包含四个增益 Kp,Ki,Ka,KgK_p, K_i, K_a, K_gKp,Ki,Ka,Kg,需要作为 α\alphaαVVV 的函数进行“调度”(调整)。实际上,这意味着需要调整四个对应查找表中的 88 个值。与其单独调整每个表项,不如将增益参数化为二维增益曲面,例如,对 α\alphaαVVV 具有简单多重线性依赖关系的曲面:

$ K(\alpha,V) = K_0 + K_1 \alpha + K_2 V + K_3 \alpha V $.

这将每个查找表的变量数量从 88 个减少到 4 个。使用 tunableSurface 对象对每个增益曲面进行参数化。请注意:

  • TuningGrid 指定“调优网格”(设计点)。此网格应与线性化使用的网格匹配,但无需与查找表断点匹配
  • ShapeFcn 指定曲面参数化的基函数(α\alphaαVVVαV\alpha VαV

每个曲面使用 α\alphaα = 10 度和 VVV = 1050 m/s(中程设计)的调优结果初始化为恒定增益。

TuningGrid = struct(‘alpha’,alpha,‘V’,V);
ShapeFcn = @(alpha,V) [alpha,V,alpha*V];

Kp = tunableSurface(‘Kp’,0.1, TuningGrid,ShapeFcn);
Ki = tunableSurface(‘Ki’,2, TuningGrid,ShapeFcn);
Ka = tunableSurface(‘Ka’,0.001, TuningGrid,ShapeFcn);
Kg = tunableSurface(‘Kg’,-1000, TuningGrid,ShapeFcn);

接下来创建一个 slTuner 接口用于调优增益曲面。使用块替换将非线性被控对象模型替换为调优网格上的线性化模型。使用 setBlockParam 将可调增益曲面 Kp、Ki、Ka、Kg 与同名的 Interpolation 块关联起来。

BlockSubs = struct(‘Name’,‘rct_airframeGS/Airframe Model’,‘Value’,G);
ST0 = slTuner(‘rct_airframeGS’,{‘Kp’,‘Ki’,‘Ka’,‘Kg’},BlockSubs);

% 注册关注点
ST0.addPoint({‘az_ref’,‘az’,‘gamma_ref’,‘gamma’,‘delta’})

% 参数化查找表块
ST0.setBlockParam(‘Kp’,Kp,‘Ki’,Ki,‘Ka’,Ka,‘Kg’,Kg);

自动驾驶仪调优

systune 可以自动为整个飞行包线调整增益曲面系数。使用 TuningGoal 对象指定性能目标:

  • γ\gammaγ 回路:以 1 秒的响应时间跟踪设定点,稳态误差小于 2%,峰值误差小于 30%。

Req1 = TuningGoal.Tracking(‘gamma_ref’,‘gamma’,1,0.02,1.3);
viewGoal(Req1)

gamma 回路的跟踪要求

  • aza_zaz 回路:确保在低频(以跟踪加速度指令)和超过 10 rad/s 时(对测量噪声不敏感)具有良好的干扰抑制能力。干扰注入在 az_ref 位置。

RejectionProfile = frd([0.02 0.02 1.2 1.2 0.1],[0 0.02 2 15 150]);
Req2 = TuningGoal.Gain(‘az_ref’,‘az’,RejectionProfile);
viewGoal(Req2)

a_z 回路的干扰抑制要求

  • qqq 回路:确保在高达 10 rad/s 时具有良好的干扰抑制能力。干扰在被控对象输入 delta 处注入。

Req3 = TuningGoal.Gain(‘delta’,‘az’,600*tf([0.25 0],[0.25 1]));
viewGoal(Req3)

q 回路的干扰抑制要求

  • 瞬态过程:确保最小阻尼比为 0.35,以获得无振荡的瞬态过程

MinDamping = 0.35;
Req4 = TuningGoal.Poles(0,MinDamping);

使用 systune,调整 16 个增益曲面系数,以在所有 45 个飞行条件下最佳地满足这些性能要求。

ST = systune(ST0,[Req1 Req2 Req3 Req4]);

Final: Soft = 1.13, Hard = -Inf, Iterations = 57

组合目标的最终值接近 1,表明所有要求几乎都得到满足。可视化得到的增益曲面。

% 获取调优后的增益曲面。
TGS = getBlockParam(ST);

% 绘制增益曲面。
clf
subplot(2,2,1)
viewSurf(TGS.Kp)
title(‘Kp’)
subplot(2,2,2)
viewSurf(TGS.Ki)
title(‘Ki’)
subplot(2,2,3)
viewSurf(TGS.Ka)
title(‘Ka’)
subplot(2,2,4)
viewSurf(TGS.Kg)
title(‘Kg’)

Kp、Ki、Ka 和 Kg 的调优后增益曲面

验证

首先在上述考虑的 45 个飞行条件下验证调优后的自动驾驶仪。绘制对航迹角阶跃变化的响应以及对升降舵偏转角阶跃干扰的响应。

clf
subplot(2,1,1)
step(getIOTransfer(ST,‘gamma_ref’,‘gamma’),5)
grid
title(‘航迹角阶跃变化的跟踪’)
subplot(2,1,2)
step(getIOTransfer(ST,‘delta’,‘az’),3)
grid
title(‘被控对象输入处阶跃干扰的抑制’)

飞行条件下的阶跃响应验证

在所有飞行条件下,响应都令人满意。接下来针对非线性飞行器模型验证自动驾驶仪。首先使用 writeBlockValue 将调优结果应用到 Simulink 模型。这会在两个 Prelookup 块中指定的断点处评估每个增益曲面公式,并将结果写入相应的 Interpolation 块。

writeBlockValue(ST)

模拟自动驾驶仪在使飞行器通过其大部分飞行包线的机动过程中的性能。以下代码等效于在 Simulink 模型中按下 Play 按钮并检查 Scope 块中的响应。

% 指定初始条件。
h_ini = 1000;
alpha_ini = 0;
v_ini = 700;

% 模拟模型。
SimOut = sim(‘rct_airframeGS’, ‘ReturnWorkspaceOutputs’, ‘on’);

% 提取模拟数据。
SimData = get(SimOut,‘sigsOut’);
Sim_gamma = getElement(SimData,‘gamma’);
Sim_alpha = getElement(SimData,‘alpha’);
Sim_V = getElement(SimData,‘V’);
Sim_delta = getElement(SimData,‘delta’);
Sim_h = getElement(SimData,‘h’);
Sim_az = getElement(SimData,‘az’);
t = Sim_gamma.Values.Time;

% 绘制主要飞行变量。
clf
subplot(2,1,1)
plot(t,Sim_gamma.Values.Data(:,1),‘r–’,t,Sim_gamma.Values.Data(:,2),‘b’)
grid
legend(‘指令值’,‘实际值’,‘location’,‘SouthEast’)
title(‘航迹角 \gamma(单位:度)’)
subplot(2,1,2)
plot(t,Sim_delta.Values.Data)
grid
title(‘升降舵偏转角 \delta(单位:度)’)

仿真结果:航迹角与升降舵偏转角

subplot(2,1,1)
plot(t,Sim_alpha.Values.Data)
grid
title(‘迎角 \alpha(单位:度)’)
subplot(2,1,2)
plot(t,Sim_V.Values.Data)
grid
title(‘速度 V(单位:m/s)’)

仿真结果:迎角与速度

subplot(2,1,1)
plot(t,Sim_h.Values.Data)
grid
title(‘高度 h(单位:米)’)
subplot(2,1,2)
plot(t,Sim_az.Values.Data)
grid
title(‘法向加速度 a_z(单位:g)’)

仿真结果:高度与法向加速度

在整个机动过程中,对航迹角剖面的跟踪始终保持良好。请注意,迎角 α\alphaα 和速度 VVV 的变化覆盖了此处考虑的大部分飞行包线(α\alphaα 为 [-20,20] 度,VVV 为 [700,1400])。虽然自动驾驶仪是针对 3000 米的标称高度进行调优的,但它在高度从 1,000 米变化到 10,000 米时也表现良好。

非线性仿真结果证实,增益调度自动驾驶仪在整个飞行包线内始终提供高性能。“增益曲面调优”过程为增益对调度变量的依赖关系提供了简单的显式公式。您可以直接使用这些公式,而不是使用查找表,从而实现更节省内存的硬件实现。

另请参阅

slTuner (Simulink Control Design) | tunableSurface | setBlockParam (Simulink Control Design)

相关示例

  • Model Gain-Scheduled Control Systems in Simulink
  • Gain-Scheduled Control of a Chemical Reactor

详细信息

  • Gain Scheduling Basics
  • Parameterize Gain Schedules

版权标注与来源说明

本文译文对应的原文内容,均来源于 MathWorks 官方网站(https://www.mathworks.com/)及官方帮助中心,原文版权均独家归属MathWorks 公司所有。

译文系基于原文进行的非官方翻译,仅为方便个人学习、理解MathWorks相关产品(含MATLAB等)的功能、操作及技术细节而制作,不代表MathWorks公司官方立场,也不构成官方翻译版本。

建议使用者优先查阅官方原文。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐