В этом примере показано, как использовать 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')
Эффективность отслеживания аналогична, но второй проект имеет лучшие свойства подавления помех.