Настройка автопилота с двумя циклами

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

Модель автопилота планера

Динамика планера и автопилота моделируются в Simulink.

open_system('rct_airframe1')

Автопилот состоит из двух каскадных циклов. Внутренний цикл управляет скоростью q тангажа, а внешний контур - вертикальным ускорением az в ответ на команду pilot stick azref. В этой архитектуре настраиваемые элементы включают в себя коэффициент усиления ПИ-контроллера (блок «az Control») и коэффициент усиления основного тона (блок «q Gain»). Автопилот должен быть настроен, чтобы ответить на команду step azref примерно за 1 секунду с минимальным перерегулированием. В этом примере мы настраиваем коэффициенты усиления автопилота для одного условия рейса, соответствующего нулевой частоте и скорости 984 м/с.

Чтобы проанализировать динамику планера, обрезайте планер для$\alpha=0$ и. $V = 984 m/s$Условие обрезки соответствует нулю нормального ускорения и крутящего момента ($w$и$q$ устойчивого). Использование 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 функция для автоматической настройки мультициклов, удовлетворяющих основным требованиям, таким как интегральное действие, адекватные запасы устойчивости и желаемая полоса пропускания. Применение 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 с SYSTUNE

Каскадные циклы обычно используются для автопилотов. Тем не менее, можно задаться вопросом, как один контроллер MIMO, который использует оба az и q для генерации команды привода delta fin будет сравниваться с архитектурой в двух циклах. Попробовать новые архитектуры управления легко с systune или looptune. Для разнообразия мы теперь используем systune для настройки следующей архитектуры MIMO.

open_system('rct_airframe2')

Как и прежде, вычислите условие обрезки для$\alpha=0$ и.$V = 984 m/s$

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)

Затем создайте требования к настройке. Здесь мы используем следующие четыре требования:

  1. Отслеживать: az должен ответить примерно через 1 секунду на azref команда

  2. Шумовая полоса и свертка: Коэффициент усиления цикла при delta fin должен сходить через 25 рад/с со склоном -20 дБ/десятилетие

  3. Запасы устойчивости: Запас на delta fin должен превысить 7 дБ и 45 степени

  4. Подавление помех: Коэффициент ослабления для входа нарушений порядка должен составлять 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')

Эффективность отслеживания аналогична, но второй проект имеет лучшие свойства подавления помех.

См. также

|

Похожие темы