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

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

Корпус образцовый и автопилот с тремя циклами

Этот пример использует три модели степени свободы динамики оси подачи корпуса. Состояния являются Наземными координатами, координатами тела, углом подачи и уровнем подачи. Рисунок 1 обобщает отношение между инерционными и каркасами кузова, углом курса полета, углом установки и углом подачи.

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

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

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

Планирование усиления автопилота

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

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

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

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

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

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

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

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

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));

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

open_system('rct_airframeTRIM')

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

% 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 условиях рейса. Движущие силы объекта отличаются существенно через конверт рейса.

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

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

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

.

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

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

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

Каждая поверхность инициализируется к постоянному усилению с помощью настраивающихся результатов для = 10 градусов и = 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 задать цели производительности:

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

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

  • цикл: Обеспечьте хорошее подавление помех в низкой частоте (чтобы отследить ускоряющие требования) и прошлые 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)

  • цикл: Обеспечьте хорошему подавлению помех до 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 = 59

Окончательное значение объединенной цели близко к 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')

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

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

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

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

| |

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

Больше о