В этом примере показано, как использовать Simulink Control Design, чтобы настроить автопилот 2D цикла, управляющий уровнем тангажа и вертикальным ускорением корпуса.
Динамика корпуса и автопилот моделируются в Simulink.
open_system('rct_airframe1')
Автопилот состоит из двух каскадных циклов. Внутренний цикл управляет уровнем тангажа q, и внешний контур управляет вертикальным ускорением az
в ответ на экспериментальную команду палки azref
. В этой архитектуре настраиваемые элементы включают усиления ПИ-контроллера ("блок" Управления азимутом) и усиление уровня тангажа ("q Усиление" блок). Автопилот должен быть настроен, чтобы ответить на команду шага azref
приблизительно за 1 секунду с минимальным перерегулированием. В этом примере мы настраиваем усиления автопилота для одного условия рейса, соответствующего, чтобы обнулить падение и скорость 984 м/с.
Чтобы анализировать динамику корпуса, обрежьте корпус для и. Условие для обрезки соответствует нулевому нормальному ускорению и подаче момента (и устойчивый). Используйте findop
вычислить соответствующие условия работы с обратной связью. Обратите внимание на то, что мы добавили "входной порт" обрезки дельты так, чтобы 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: --------------------------------- opreport = Operating point search report for the Model rct_airframe1. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- <strong>Min</strong> <strong>x</strong> <strong>Max</strong> <strong>dxMin</strong> <strong>dx</strong> <strong>dxMax</strong> <strong>_____</strong> <strong>__________</strong> <strong>_____</strong> <strong>_____</strong> <strong>___________</strong> <strong>_____</strong> (1.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position 0 0 0 -Inf 984 Inf -3048 -3048 -3048 -Inf 0 Inf (2.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta 0 0 0 -Inf -0.0097235 Inf (3.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w 984 984 984 -Inf 22.69 Inf 0 0 0 0 -1.4371e-11 0 (4.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q -Inf -0.0097235 Inf 0 1.1477e-16 0 (5.) rct_airframe1/Integrator -Inf 0.00070807 Inf -Inf -0.0097235 Inf (6.) rct_airframe1/az Control/Integrator/Continuous/Integrator -Inf 0 Inf -Inf 0.00024207 Inf Inputs: ---------- <strong>Min</strong> <strong>u</strong> <strong>Max</strong> <strong>____</strong> <strong>__________</strong> <strong>___</strong> (1.) rct_airframe1/delta trim -Inf 0.00070807 Inf Outputs: None ----------
Линеаризуйте блок "Airframe Model" для вычисленного условия для обрезки 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 "Управлением азимутом" и "q Усиление" как настраиваемые. Также задайте условие для обрезки op
правильно линеаризовать динамику корпуса.
ST0 = slTuner('rct_airframe1',{'az Control','q Gain'},op);
Отметьте ссылку, управление и сигналы измерения как интересные места для анализа и настройки.
addPoint(ST0,{'az ref','delta fin','az','q'});
Наконец, настройте параметры системы управления, чтобы удовлетворить 1 второе требование времени отклика. В частотном диапазоне это примерно соответствует частоте среза усиления wc
= 5 рад/с для ответа разомкнутого контура на объекте вводят "пластину дельты".
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 являются удовлетворительными (синяя кривая должна остаться ниже связанного желтого). Затем проверяйте ответ от команды шага azref
к вертикальному ускорению az
:
T = getIOTransfer(ST,'az ref','az'); figure step(T,5)
Ускорение az
не отслеживает azref
несмотря на присутствие интегратора в цикле. Это вызвано тем, что обратная связь действует на эти две переменные az
и q
и мы не задали, какой должен отследить azref
.
Чтобы исправить эту проблему, добавьте явное требование что az
должен следовать за командой шага 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 = 54
Переходной процесс от 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
соответствовал бы архитектуре 2D цикла. Попытка новых архитектур управления легка с 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: --------------------------------- opreport = Operating point search report for the Model rct_airframe2. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- <strong>Min</strong> <strong>x</strong> <strong>Max</strong> <strong>dxMin</strong> <strong>dx</strong> <strong>dxMax</strong> <strong>_____</strong> <strong>__________</strong> <strong>_____</strong> <strong>_____</strong> <strong>___________</strong> <strong>_____</strong> (1.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position 0 0 0 -Inf 984 Inf -3048 -3048 -3048 -Inf 0 Inf (2.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta 0 0 0 -Inf -0.0097235 Inf (3.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w 984 984 984 -Inf 22.69 Inf 0 0 0 0 2.4587e-11 0 (4.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q -Inf -0.0097235 Inf 0 -1.7215e-16 0 (5.) rct_airframe2/MIMO Controller -Inf 0.00065361 Inf -Inf -0.0089973 Inf -Inf 3.7592e-20 Inf -Inf 0.030259 Inf Inputs: ---------- <strong>Min</strong> <strong>u</strong> <strong>Max</strong> <strong>____</strong> <strong>__________</strong> <strong>___</strong> (1.) rct_airframe2/delta trim -Inf 0.00043574 Inf Outputs: None ----------
Как с looptune
, используйте slTuner
интерфейс, чтобы сконфигурировать модель Simulink для настройки. Обратите внимание на то, что сигналы интереса уже отмечены как Линейные Аналитические точки в модели Simulink.
ST0 = slTuner('rct_airframe2','MIMO Controller',op);
Судите контроллер MIMO второго порядка нулевым сквозным соединением от 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 = 84 Final: Soft = 1.14, Hard = -Inf, Iterations = 102
Лучший проект имеет значение главной цели близко к 1, указывая, что все четыре требования почти удовлетворяются. Используйте viewGoal
смотреть каждое требование для лучшего проекта.
figure('Position',[100,100,987,474])
viewGoal(AllReqs,ST)
Вычислите ответы с обратной связью и сравните с проектом 2D цикла.
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)