Настройка автопилота 2D цикла

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

Модель автопилота корпуса

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

open_system('rct_airframe1')

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

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

 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 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 функционируйте, чтобы автоматически настроить многоконтурные системы управления, удовлетворяющие основным требованиям, таким как интегральное действие, соответствующие запасы устойчивости и желаемая пропускная способность. Применять 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 = 70

Требования нормированы так окончательное значение около 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 с SYSTUNE

Каскадные циклы обычно используются для автопилотов. Все же можно задаться вопросом, как один контроллер MIMO, который использует оба az и q сгенерировать команду привода delta fin соответствовал бы архитектуре 2D цикла. Попытка новых архитектур управления легка с 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);

Судите контроллер 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)

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

  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 = 82
Final: Soft = 1.14, Hard = -Inf, Iterations = 104

Лучший проект имеет значение главной цели близко к 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')

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

Смотрите также

|

Похожие темы