В этом примере показано, как использовать Simulink Control Design для настройки двухконтурного автопилота, управляющего частотой тангажа и вертикальным ускорением планера.
Динамика планера и автопилота моделируются в Simulink.
open_system('rct_airframe1')

Автопилот состоит из двух каскадных циклов. Внутренний цикл управляет скоростью q тангажа, а внешний контур - вертикальным ускорением az в ответ на команду pilot stick azref. В этой архитектуре настраиваемые элементы включают в себя коэффициент усиления ПИ-контроллера (блок «az Control») и коэффициент усиления основного тона (блок «q Gain»). Автопилот должен быть настроен, чтобы ответить на команду step azref примерно за 1 секунду с минимальным перерегулированием. В этом примере мы настраиваем коэффициенты усиления автопилота для одного условия рейса, соответствующего нулевой частоте и скорости 984 м/с.
Чтобы проанализировать динамику планера, обрезайте планер для
и.
Условие обрезки соответствует нулю нормального ускорения и крутящего момента (
и
устойчивого). Использование findop вычислить соответствующее рабочее условие замкнутого контура. Обратите внимание, что мы добавили входной порт «delta trim», так что findop может регулировать отклонение ребра, чтобы создать желаемое равновесие сил и моментов.
opspec = operspec('rct_airframe1'); % Specify trim condition % Xe,Ze: known, not steady opspec.States(1).Known = [1;1]; opspec.States(1).SteadyState = [0;0]; % u,w: known, w steady opspec.States(3).Known = [1 1]; opspec.States(3).SteadyState = [0 1]; % theta: known, not steady opspec.States(2).Known = 1; opspec.States(2).SteadyState = 0; % q: unknown, steady opspec.States(4).Known = 0; opspec.States(4).SteadyState = 1; % integrator states unknown, not steady opspec.States(5).SteadyState = 0; opspec.States(6).SteadyState = 0; op = findop('rct_airframe1',opspec);
Operating point search report:
---------------------------------
Operating point search report for the Model rct_airframe1.
(Time-Varying Components Evaluated at time t=0)
Operating point specifications were successfully met.
States:
----------
(1.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position
x: 0 dx: 984
x: -3.05e+03 dx: 0
(2.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta
x: 0 dx: -0.00972
(3.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w
x: 984 dx: 22.7
x: 0 dx: -1.44e-11 (0)
(4.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q
x: -0.00972 dx: 1.15e-16 (0)
(5.) rct_airframe1/Integrator
x: 0.000708 dx: -0.00972
(6.) rct_airframe1/az Control/Integrator/Continuous/Integrator
x: 0 dx: 0.000242
Inputs:
----------
(1.) rct_airframe1/delta trim
u: 0.000708 [-Inf Inf]
Outputs: None
----------
Линеаризируйте блок «Airframe Модели» для вычисляемого условия обрезки op и постройте график коэффициентов усиления от отклонения ребра delta на az и q:
G = linearize('rct_airframe1','rct_airframe1/Airframe Model',op); G.InputName = 'delta'; G.OutputName = {'az','q'}; bodemag(G), grid

Обратите внимание, что модель планера имеет нестабильный полюс:
pole(G)
ans =
-0.0320
-0.0255
0.1253
-29.4685
Можно использовать looptune функция для автоматической настройки мультициклов, удовлетворяющих основным требованиям, таким как интегральное действие, адекватные запасы устойчивости и желаемая полоса пропускания. Применение looptune в модель автопилота создайте образец slTuner интерфейс и обозначить блоки Simulink «az Control» и «q Gain» как настраиваемые. Также задайте условие обрезки op для правильной линеаризации динамики планера.
ST0 = slTuner('rct_airframe1',{'az Control','q Gain'},op);
Отметьте сигналы ссылки, управления и измерения как точки интереса для анализа и настройки.
addPoint(ST0,{'az ref','delta fin','az','q'});
Наконец, настройте системные параметры управления, чтобы соответствовать требованию времени отклика 1 секунду. В частотный диапазон это примерно соответствует усилению частоты среза wc = 5 рад/с для разомкнутой реакции на входе объекта «delta fin».
wc = 5; Controls = 'delta fin'; Measurements = {'az','q'}; [ST,gam,Info] = looptune(ST0,Controls,Measurements,wc);
Final: Peak gain = 1.01, Iterations = 72
Требования нормированы, поэтому окончательное значение около 1 означает, что все требования выполняются. Подтвердите это путем графической проверки проекта.
figure('Position',[100,100,560,714])
loopview(ST,Info)

Первый график подтверждает, что реакция без разомкнутого контура имеет интегральное действие и желаемую частоту среза усиления, в то время как второй график показывает, что запасы устойчивости MIMO удовлетворительны (синяя кривая должна оставаться ниже желтой границы). Далее проверьте ответ от команды step azref на вертикальное ускорение az:
T = getIOTransfer(ST,'az ref','az'); figure step(T,5)

Ускорение az не отслеживает azref несмотря на наличие интегратора в цикле. Это связано с тем, что цикл обратной связи действует на две переменные az и q и мы не уточнили, какой из них следует отследить azref.
Чтобы устранить эту проблему, добавьте явное требование, которое az следует следовать команде step azref со временем отклика 1 секунду. Также ослабьте требование пересечения коэффициента усиления к интервалу [3,12], чтобы позволить тюнеру найти соответствующую частоту среза коэффициента усиления.
TrackReq = TuningGoal.Tracking('az ref','az',1); ST = looptune(ST0,Controls,Measurements,[3,12],TrackReq);
Final: Peak gain = 1.23, Iterations = 50
Значение переходной характеристики от azref на az в настоящее время удовлетворительно:
Tr1 = getIOTransfer(ST,'az ref','az'); step(Tr1,5) grid

Также проверяйте характеристики подавления помех, рассматривая ответы от нарушения порядка, вводимого на входе объекта
Td1 = getIOTransfer(ST,'delta fin','az'); bodemag(Td1) grid

step(Td1,5)
grid
title('Disturbance rejection')

Использование showBlockValue чтобы увидеть настроенные значения коэффициента усиления ПИ-контроллера и внутреннего контура
showBlockValue(ST)
AnalysisPoints_ =
D =
u1 u2 u3 u4
y1 1 0 0 0
y2 0 1 0 0
y3 0 0 1 0
y4 0 0 0 1
Name: AnalysisPoints_
Static gain.
-----------------------------------
az_Control =
1
Kp + Ki * ---
s
with Kp = 0.00166, Ki = 0.0017
Name: az_Control
Continuous-time PI controller in parallel form.
-----------------------------------
q_Gain =
D =
u1
y1 1.985
Name: q_Gain
Static gain.
Если этот проект удовлетворителен, используйте writeBlockValue применить настроенные значения к модели Simulink и моделировать настроенный контроллер в Simulink.
writeBlockValue(ST)
Каскадные циклы обычно используются для автопилотов. Тем не менее, можно задаться вопросом, как один контроллер MIMO, который использует оба az и q для генерации команды привода delta fin будет сравниваться с архитектурой в двух циклах. Попробовать новые архитектуры управления легко с systune или looptune. Для разнообразия мы теперь используем systune для настройки следующей архитектуры MIMO.
open_system('rct_airframe2')

Как и прежде, вычислите условие обрезки для
и.
opspec = operspec('rct_airframe2'); % Specify trim condition % Xe,Ze: known, not steady opspec.States(1).Known = [1;1]; opspec.States(1).SteadyState = [0;0]; % u,w: known, w steady opspec.States(3).Known = [1 1]; opspec.States(3).SteadyState = [0 1]; % theta: known, not steady opspec.States(2).Known = 1; opspec.States(2).SteadyState = 0; % q: unknown, steady opspec.States(4).Known = 0; opspec.States(4).SteadyState = 1; % controller states unknown, not steady opspec.States(5).SteadyState = [0;0]; op = findop('rct_airframe2',opspec);
Operating point search report:
---------------------------------
Operating point search report for the Model rct_airframe2.
(Time-Varying Components Evaluated at time t=0)
Operating point specifications were successfully met.
States:
----------
(1.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position
x: 0 dx: 984
x: -3.05e+03 dx: 0
(2.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta
x: 0 dx: -0.00972
(3.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w
x: 984 dx: 22.7
x: 0 dx: 2.46e-11 (0)
(4.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q
x: -0.00972 dx: -1.72e-16 (0)
(5.) rct_airframe2/MIMO Controller
x: 0.000654 dx: -0.009
x: 4.13e-19 dx: 0.0303
Inputs:
----------
(1.) rct_airframe2/delta trim
u: 0.000436 [-Inf Inf]
Outputs: None
----------
Как и в случае looptune, используйте slTuner интерфейс для конфигурирования модели Simulink для настройки. Обратите внимание, что интересующие сигналы уже помечены как точки линейного анализа в модели Simulink.
ST0 = slTuner('rct_airframe2','MIMO Controller',op);
Попробуйте контроллер второго порядка с нулевым сквозным соединением от e на delta fin. Для этого создайте необходимую параметризацию контроллера и связайте ее с блоком «MIMO Controller» используя setBlockParam:
C0 = tunableSS('C',2,1,2); % Second-order controller C0.D.Value(1) = 0; % Fix D(1) to zero C0.D.Free(1) = false; setBlockParam(ST0,'MIMO Controller',C0)
Затем создайте требования к настройке. Здесь мы используем следующие четыре требования:
Отслеживать: az должен ответить примерно через 1 секунду на azref команда
Шумовая полоса и свертка: Коэффициент усиления цикла при delta fin должен сходить через 25 рад/с со склоном -20 дБ/десятилетие
Запасы устойчивости: Запас на delta fin должен превысить 7 дБ и 45 степени
Подавление помех: Коэффициент ослабления для входа нарушений порядка должен составлять 40 дБ при увеличении 1 рад/с до 100 дБ при 0,001 рад/с.
% Tracking Req1 = TuningGoal.Tracking('az ref','az',1); % Bandwidth and roll-off Req2 = TuningGoal.MaxLoopGain('delta fin',tf(25,[1 0])); % Margins Req3 = TuningGoal.Margins('delta fin',7,45); % Disturbance rejection % Use an FRD model to sketch the desired attenuation profile with a few points Freqs = [0 0.001 1]; MinAtt = [100 100 40]; % in dB Req4 = TuningGoal.Rejection('delta fin',frd(db2mag(MinAtt),Freqs)); Req4.Focus = [0 1];
Теперь можно использовать systune настроить параметры контроллера, удовлетворяющие этим требованиям.
AllReqs = [Req1,Req2,Req3 Req4];
Opt = systuneOptions('RandomStart',3);
rng(0)
[ST,fSoft] = systune(ST0,AllReqs,Opt);
Final: Soft = 1.42, Hard = -Inf, Iterations = 47 Final: Soft = 1.42, Hard = -Inf, Iterations = 62 Final: Soft = 1.14, Hard = -Inf, Iterations = 79 Final: Soft = 1.14, Hard = -Inf, Iterations = 119
Лучший проект имеет общее целевое значение, близкое к 1, что указывает на то, что все четыре требования почти выполнены. Использование viewGoal проверить каждое требование на лучший проект.
figure('Position',[100,100,987,474])
viewGoal(AllReqs,ST)

Вычислите отклики замкнутой системы и сравните с проектом с двумя системами.
T = getIOTransfer(ST,{'az ref','delta fin'},'az');
figure
step(Tr1,'b',T(1),'r',5)
title('Tracking')
legend('Cascade','2 dof')

step(Td1,'b',T(2),'r',5) title('Disturbance rejection') legend('Cascade','2 dof')

Эффективность отслеживания аналогична, но второй проект имеет лучшие свойства подавления помех.
looptune (slTuner) (Simulink Control Design) | slTuner (Simulink Control Design)