Настройка запланированного на усиление автопилота с тремя циклами

Этот пример использует systune сгенерировать сглаженные расписания усиления для автопилота с тремя циклами.

Корпус автопилот с тремя циклами и модели

Этот пример использует три модели степени свободы динамики оси подачи корпуса. Состояния являются Наземными координатами$(X_e,Z_e)$, координатами тела$(u,w)$, углом подачи $\theta$и уровнем подачи$q = \dot\theta$. Рисунок 1 обобщает отношение между инерционными и системами координат тела, углом курса полета$\gamma$, углом установки $\alpha$и углом подачи$\theta$.

Рисунок 1: динамика Корпуса.

Мы используем классическую структуру автопилота с тремя циклами, чтобы управлять углом курса полета$\gamma$. Этот автопилот настраивает курс полета путем поставки соответствующих пакетов нормального ускорения$a_z$ (ускорение вперед$w$). В свою очередь нормальное ускорение производится путем корректировки отклонения лифта$\delta$, чтобы вызвать подачу и варьироваться объем подъема. Автопилот использует управление Пропорциональным Интегралом (PI) в цикле уровня подачи$q$ и пропорциональное управление в$a_z$ и$\gamma$ циклах. Система с обратной связью (корпус и автопилот) моделируется в Simulink.

addpath(fullfile(matlabroot,'examples','control','main')) % add example data
open_system('rct_airframeGS')

Табличное управление автопилота

Движущие силы корпуса нелинейны и аэродинамические силы, и моменты зависят от скорости$V$ и падения$\alpha$. Чтобы получить подходящую производительность в$(\alpha,V)$ конверте рейса, усиления автопилота должны быть настроены как функция$\alpha$ и$V$ компенсировать изменения в динамике объекта. Этот процесс корректировки называется "табличным управлением" и$\alpha,V$ называется переменными планирования. В модели Simulink расписания усиления реализованы как интерполяционные таблицы, управляемые измерениями$\alpha$ и$V$.

Табличное управление является линейным методом для управления нелинейными или изменяющимися во времени объектами. Идея состоит в том, чтобы вычислить линейные аппроксимации объекта в различных условиях работы, настроить усиления контроллера в каждых условиях работы и усиления подкачки как функция условий работы во время операции. Обычное табличное управление включает три существенных шага:

  1. Обрежьте и линеаризуйте объект в каждых условиях работы

  2. Настройте усиления контроллера для линеаризовавшей динамики в каждых условиях работы

  3. Согласуйте значения усиления, чтобы обеспечить плавный переход между условиями работы.

В этом примере мы комбинируем Шаги 2. и 3. путем параметризации автопилота получает как полиномы первого порядка в$\alpha,V$ и непосредственно настройки полиномиальных коэффициентов для целого конверта рейса. Этот подход устраняет Шаг 3. и гарантии сглаживают изменения усиления как функцию$\alpha$ и$V$. Кроме того, коэффициенты расписания усиления могут быть автоматически настроены с systune.

Обрезка и линеаризация

Примите, что падение$\alpha$ варьируется между-20 и 20 градусами и что скорость$V$ варьируется между 700 и 1 400 м/с. При пренебрежении силы тяжести движущие силы корпуса симметричны в$\alpha$, так рассмотрите только положительные значения$\alpha$. Используйте 5 9 сетка линейно расположенных с интервалами$(\alpha,V)$ пар, чтобы покрыть конверт рейса:

nA = 5;  % number of alpha values
nV = 9;  % number of V values
[alpha,V] = ndgrid(linspace(0,20,nA)*pi/180,linspace(700,1400,nV));

Для каждого условия рейса $(\alpha,V)$линеаризуйте динамику корпуса в обрезке (обнулите нормальное ускорение и подачу момента). Это требует вычисления отклонения лифта$\delta$ и уровня подачи$q$, которые приводят к устойчивому$w$ и$q$. Для этого сначала изолируйте модель корпуса в отдельной модели Simulink.

open_system('rct_airframeTRIM')

Используйте operspec чтобы задать условие для обрезки, используйте findop вычислить значения для обрезки$\delta$ и $q$и линеаризовать динамику корпуса для получившейся рабочей точки. Смотрите "Обрезку и Линеаризацию Корпуса" пример в Simulink Control Design для деталей. Повторите эти шаги для 45 условий рейса$(\alpha,V)$.

% Compute trim condition for each (alpha,V) pair
clear op
for ct=1:nA*nV
   alpha_ini = alpha(ct);      % Incidence [rad]
   v_ini = V(ct);              % Speed [m/s]

   % Specify trim condition
   opspec = operspec('rct_airframeTRIM');
   % 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;

   % TRIM
   Options = findopOptions('DisplayReport','off');
   op(ct) = findop('rct_airframeTRIM',opspec,Options);
end

% Linearize at trim conditions
G = linearize('rct_airframeTRIM',op);
G = reshape(G,[nA nV]);
G.u = 'delta';
G.y = {'alpha' 'V' 'q' 'az' 'gamma' 'h'};

Это производит 5 9 массив линеаризовавших моделей объекта управления при 45 условиях рейса$(\alpha,V)$. Движущие силы объекта варьируются существенно через конверт рейса.

sigma(G), title('Variations in airframe dynamics')

Настраиваемая поверхность усиления

Автопилот состоит из четырех усилений$K_p, K_i, K_a, K_g$, которые будут "запланированы" (настроенный) как функция$\alpha$ и$V$. Практически, это означает настраивать 88 значений в каждой из соответствующих четырех интерполяционных таблиц. Вместо того, чтобы настраивать каждую запись таблицы отдельно, параметрируйте усиления, когда двумерное усиление появляется, например, поверхности с простой полилинейной зависимостью от$\alpha$ и$V$:

$$ K(\alpha,V) = K_0 + K_1 \alpha + K_2 V + K_3 \alpha V $$.

Это сокращает количество переменных от 88 вниз к 4 для каждой интерполяционной таблицы. Используйте tunableSurface объект параметрировать каждую поверхность усиления. Обратите внимание на то, что:

  • TuningGrid задает "настраивающуюся сетку" (точки проекта). Эта сетка должна совпадать с тем, используемым в линеаризации, но не должна совпадать с табличными точками останова цикла

  • ShapeFcn задает основные функции для поверхностной параметризации ($\alpha$$V$и$\alpha V$)

Каждая поверхность инициализируется к постоянному усилению с помощью настраивающихся результатов в$\alpha$ = 10 градусов и$V$ = 1 050 м/с (средний проект).

TuningGrid = struct('alpha',alpha,'V',V);
ShapeFcn = @(alpha,V) [alpha,V,alpha*V];

Kp = tunableSurface('Kp', 0.1, TuningGrid, ShapeFcn);
Ki = tunableSurface('Ki', 2, TuningGrid, ShapeFcn);
Ka = tunableSurface('Ka', 0.001, TuningGrid, ShapeFcn);
Kg = tunableSurface('Kg', -1000, TuningGrid, ShapeFcn);

Затем создайте slTuner интерфейс для настройки поверхностей усиления. Используйте замену блока, чтобы заменить нелинейную модель объекта управления линеаризовавшими моделями по настраивающейся сетке. Используйте setBlockParam сопоставлять настраиваемое усиление появляется Kp, Ki, Ka, Kg с блоками Интерполяции того же имени.

BlockSubs = struct('Name','rct_airframeGS/Airframe Model','Value',G);
ST0 = slTuner('rct_airframeGS',{'Kp','Ki','Ka','Kg'},BlockSubs);

% Register points of interest
ST0.addPoint({'az_ref','az','gamma_ref','gamma','delta'})

% Parameterize look-up table blocks
ST0.setBlockParam('Kp',Kp,'Ki',Ki,'Ka',Ka,'Kg',Kg);

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

systune может автоматически настроить коэффициенты поверхности усиления для целого конверта рейса. Используйте TuningGoal объекты задать цели производительности:

  • $\gamma$ цикл: Отследите заданное значение с 1 вторым временем отклика, меньше чем 2%-й установившейся ошибкой и меньше чем 30%-й пиковой ошибкой.

Req1 = TuningGoal.Tracking('gamma_ref','gamma',1,0.02,1.3);
viewGoal(Req1)

  • $a_z$ цикл: Обеспечьте хорошее подавление помех в низкой частоте (чтобы отследить ускоряющие требования) и прошлые 10 рад/с (чтобы быть нечувствительными к шуму измерения).

% Note: The disturbance is injected at the az_ref location
RejectionProfile = frd([0.02 0.02 1.2 1.2 0.1],[0 0.02 2 15 150]);
Req2 = TuningGoal.Gain('az_ref','az',RejectionProfile);
viewGoal(Req2)

  • $q$ цикл: Обеспечьте хорошему подавлению помех до 10 рад/с. Воздействие введено во входе delta объекта.

Req3 = TuningGoal.Gain('delta','az',600*tf([0.25 0],[0.25 1]));
viewGoal(Req3)

  • Переходные процессы: Обеспечьте минимальный коэффициент затухания 0,35 для переходных процессов без колебаний

MinDamping = 0.35;
Req4 = TuningGoal.Poles(0,MinDamping);

Используя systune, настройте 16 коэффициентов поверхности усиления, чтобы лучше всего соответствовать этим требованиям к производительности при всех 45 условиях рейса.

ST = systune(ST0,[Req1 Req2 Req3 Req4]);
Final: Soft = 1.13, Hard = -Inf, Iterations = 57

Окончательное значение объединенной цели близко к 1, указывая, что все требования почти удовлетворяются. Визуализируйте получившиеся поверхности усиления.

% Get tuned gain surfaces
TGS = getBlockParam(ST);

% Plot gain surfaces
clf
subplot(221), viewSurf(TGS.Kp), title('Kp')
subplot(222), viewSurf(TGS.Ki), title('Ki')
subplot(223), viewSurf(TGS.Ka), title('Ka')
subplot(224), viewSurf(TGS.Kg), title('Kg')

Валидация

Сначала подтвердите настроенный автопилот при 45 условиях рейса, рассмотренных выше. Постройте ответ на ступенчатое изменение в углу курса полета и ответ на воздействие шага в отклонении лифта.

clf
subplot(211), step(getIOTransfer(ST,'gamma_ref','gamma'),5), grid
title('Tracking of step change in flight path angle')
subplot(212), step(getIOTransfer(ST,'delta','az'),3), grid
title('Rejection of step disturbance at plant input')

Ответы являются удовлетворительными при всех условиях рейса. Затем подтвердите автопилот против нелинейной модели корпуса. Сначала используйте writeBlockValue применять настраивающиеся результаты к модели Simulink. Это оценивает каждую формулу поверхности усиления в точках останова, заданных в двух блоках Перед поиском, и написало результат в соответствующем блоке Interpolation.

writeBlockValue(ST)

Теперь симулируйте производительность автопилота для маневра, который берет корпус через значительную часть его конверта рейса. Код ниже эквивалентен нажатию кнопки воспроизведения в модели Simulink и осмотре ответов в блоках Scope.

% Initial conditions
h_ini = 1000;
alpha_ini = 0;
v_ini = 700;

% Simulate
SimOut = sim('rct_airframeGS', 'ReturnWorkspaceOutputs', 'on');

% Extract simulation data
SimData = get(SimOut,'sigsOut');
Sim_gamma = getElement(SimData,'gamma');
Sim_alpha = getElement(SimData,'alpha');
Sim_V = getElement(SimData,'V');
Sim_delta = getElement(SimData,'delta');
Sim_h = getElement(SimData,'h');
Sim_az = getElement(SimData,'az');
t = Sim_gamma.Values.Time;

% Plot the main flight variables
clf
subplot(211)
plot(t,Sim_gamma.Values.Data(:,1),'r--',t,Sim_gamma.Values.Data(:,2),'b'), grid
legend('Commanded','Actual','location','SouthEast')
title('Flight path angle \gamma in degrees')
subplot(212)
plot(t,Sim_delta.Values.Data), grid
title('Elevator deflection \delta in degrees')

subplot(211)
plot(t,Sim_alpha.Values.Data), grid
title('Incidence \alpha in degrees')
subplot(212)
plot(t,Sim_V.Values.Data), grid
title('Speed V in m/s')

subplot(211)
plot(t,Sim_h.Values.Data), grid
title('Altitude h in meters')
subplot(212)
plot(t,Sim_az.Values.Data), grid
title('Normal acceleration a_z in g''s')

Отслеживание углового профиля курса полета остается хорошим в течение маневра. Обратите внимание на то, что изменения падения$\alpha$ и скорости$V$ покрывают большую часть конверта рейса, рассмотренного здесь ([-20,20] степени для$\alpha$ и [700,1400] для$V$). И в то время как автопилот был настроен для номинальной высоты 3 000 м, он достигает хорошего результата для высоты, изменяющейся от 1 000 до 10 000 м.

Нелинейные результаты симуляции подтверждают, что запланированный на усиление автопилот поставляет последовательно высокую производительность в конверте рейса. "Поверхность усиления настраивающаяся" процедура обеспечивает простые явные формулы для зависимости усиления от переменных планирования. Вместо того, чтобы использовать интерполяционные таблицы, можно использовать эти формулы непосредственно в более эффективной памятью аппаратной реализации.

rmpath(fullfile(matlabroot,'examples','control','main')) % remove example data

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

| |

Связанные примеры

Больше о

Для просмотра документации необходимо авторизоваться на сайте