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

Автопилот состоит из двух каскадных контуров. Внутренний контур управляет скоростью q тангажа, а внешний контур управляет вертикальным ускорением. az в ответ на команду ручки летчика azref. В этой архитектуре перестраиваемые элементы включают в себя коэффициенты усиления PI контроллера (блок «az управления») и коэффициент усиления основного тона (блок «q усиления»). Автопилот должен быть настроен для ответа на пошаговую команду 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
----------
Линеаризация блока «Модель планера» для вычисленного условия отделки 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 рад/с для отклика с разомкнутым контуром на входе установки «дельта-плавник».
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 для просмотра настроенных значений PI-контроллера и коэффициента усиления внутреннего контура
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);
Попробуйте использовать контроллер 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 = 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)