В этом примере показано, как использовать 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)