Управление положением в HL-20 Autopilot - SISO Design

Это часть 3 серии примеров по проекту и настройке системы управления рейсом для HL-20 транспортного средства. В этой части показано, как настроить классическую архитектуру SISO для управления креном, тангажом и рысканием транспортного средства.

Фон

Этот пример использует модель HL-20, адаптированную из планера НАСА HL-20 грузоподъемного тела (Aerospace Blockset), см. Часть 1 серии (Обрезка и линеаризация HL-20 планера) для получения дополнительной информации. Автопилот, контролирующий положение самолета, состоит из трёх внутренних циклов и трех внешних контуров.

В Части 2 (Управление Угловой Скоростью в HL-20 Autopilot) мы показали, как закрыть внутренние циклы, управляющие угловыми скоростями p, q, r. Следующие команды повторяют соответствующие шаги. Обратите внимание, что это создает и конфигурирует slTuner интерфейс ST0 для взаимодействия с моделью Simulink.

load_system('csthl20_control')
CTYPE = 2;  % Select SISO architecture
HL20recapPart2

ST0
 
slTuner tuning interface for "csthl20_control":

No tuned blocks. Use the addBlock command to add new blocks.
9 Analysis points: 
--------------------------
Point 1: Signal "da;de;dr", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller
Point 2: Signal "pqr", located at 'Output Port 2' of csthl20_control/HL20 Airframe
Point 3: 'Output Port 1' of csthl20_control/Flight Control System/Alpha_deg
Point 4: 'Output Port 1' of csthl20_control/Flight Control System/Beta_deg
Point 5: 'Output Port 1' of csthl20_control/Flight Control System/Phi_deg
Point 6: 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Demands
Point 7: Signal "p_demand", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Roll-off1
Point 8: Signal "q_demand", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Roll-off2
Point 9: Signal "r_demand", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Roll-off3
 
No permanent openings. Use the addOpening command to add new permanent openings.
Properties with dot notation get/set access:
      Parameters         : [] 
      OperatingPoints    : [] (model initial condition will be used.)
      BlockSubstitutions : [3x1 struct]
      Options            : [1x1 linearize.SlTunerOptions]
      Ts                 : 0

Setup настройки внешнего контура

Теперь мы переключаем особое внимание на три запланированных по усилению цикла PI, управляющих креном (phi), углом атаки (альфа) и углом боковой оси (бета). Эти циклы могут быть настроены по одному за раз (3 циклы и 40 рабочих точек равны 120 проектным точкам). Можно также использовать pidtune настройка коэффициентов усиления ПИ в пакетном режиме для определенных требований к целевой полосе пропускания и запасам по фазе. Оба подхода имеют оговорки:

  • Трудно принять во внимание циклу взаимодействия.

  • Усиления, полученные в каждой точке проекта, могут быть противоречивыми и требуют сглаживания между рабочими точками.

Альтернативным подходом является концепция «настройки поверхности усиления» [1], где вы параметризоваете графики усиления P (альфа, бета) и I (альфа, бета) как полиномиальные поверхности и используете systune для настройки полиномиальных коэффициентов. Этот подход охватывает все рабочие точки сразу и может учитывать цикл взаимодействия, в частности, факторов запаса устойчивости. Это подход, продемонстрированный здесь.

Чтобы настроить внешние контуры, мы должны закрыть внутренние циклы и получить линеаризированную модель « объект», видимую внешними контурами при каждом (альфа, бета) условии. Мы можем спросить slTuner чтобы вычислить соответствующую передаточную функцию, но это будет эффективно фиксировать коэффициенты усиления внутреннего контура Kp, Kq, Kr к их значениям при рабочем условии по умолчанию. Чтобы получить правильную линеаризацию, мы должны сказать slTuner эти усиления варьируются в зависимости от (альфа, бета). Подстановка блоков снова самый простой способ сделать это. Чтобы отметить Kp как варьирующийся, найдите блок Product, используемый для умножения сигнала ошибки на Kp, и замените его массивом усилений, по одному для каждого (альфа, бета) условия.

ProductBlk = 'csthl20_control/Flight Control System/Controller/Classical/Product1';
BlockSub4 = struct('Name',ProductBlk,'Value',[0 ss(Kp)]);

Легко проверить, что этот блок линеаризация равносилен умножению сигнала ошибки на изменяющуюся величину Kp, вычисленную выше. Аналогичным образом замените соответствующие блоки Product для Kq и Kr различными коэффициентами усиления.

ProductBlk = 'csthl20_control/Flight Control System/Controller/Classical/Product3';
BlockSub5 = struct('Name',ProductBlk,'Value',[0 ss(Kq)]);

ProductBlk = 'csthl20_control/Flight Control System/Controller/Classical/Product4';
BlockSub6 = struct('Name',ProductBlk,'Value',[0 ss(Kr)]);

ST0.BlockSubstitutions = [ST0.BlockSubstitutions ; BlockSub4 ; BlockSub5 ; BlockSub6];

Теперь можно построить график угловых характеристик для начальных настроек расписания усиления в модели.

T0 = getIOTransfer(ST0,'Demand',{'Phi_deg','Alpha_deg','Beta_deg'});
step(T0,6)

Цели настройки

Основные цели управления включают пропускную способность (время отклика) и запасы устойчивости. Используйте цели «MinLoopGain» и «MaxLoopGain», чтобы задать кроссовер усиления внешних контуров между 0,5 и 5 рад/с. Поскольку все переменные цикла выражены в степенях, дополнительное масштабирование не требуется.

R1 = TuningGoal.MinLoopGain({'Phi_deg','Alpha_deg','Beta_deg'},0.5,1);
R1.LoopScaling = 'off';
R2 = TuningGoal.MaxLoopGain({'Phi_deg','Alpha_deg','Beta_deg'},tf(50,[1 10 0]));
R2.LoopScaling = 'off';

Используйте цель «Маржи», чтобы навязать адекватные запасы устойчивости в каждом цикле и через циклы. Эта цель основана на понятии дисковых полей, которая гарантирует стабильность при одновременных изменениях коэффициента усиления и фазы во всех трех циклах. Поскольку целевые поля 7 дБ и 40 степени трудно получить для экстремальных ориентаций (углы сетки (альфа, бета)), мы используем различную цель, чтобы ослабить требования к запасам по амплитуде и фазе в углах.

% Gain margins vs (alpha,beta)
GM = [...
   6     6     6     6     6
   6     6     7     6     6
   7     7     7     7     7
   7     7     7     7     7
   7     7     7     7     7
   7     7     7     7     7
   6     6     7     6     6
   6     6     6     6     6];

% Phase margins vs (alpha,beta)
PM = [...
   40         40          40         40        40
   40         40          45         40        40
   45         45          45         45        45
   45         45          45         45        45
   45         45          45         45        45
   45         45          45         45        45
   40         40          45         40        40
   40         40          40         40        40];

% Create varying goal
FH = @(gm,pm) TuningGoal.Margins('da;de;dr',gm,pm);
R3 = varyingGoal(FH,GM,PM);

Настройка расписания усиления

Чтобы настроить графики усиления P и I для внешнего контура, отметьте три блока MATLAB Function и три блока интерполяционной таблицы как настраиваемые.

TunedBlocks = {'P phi','P alpha','P beta','I phi','I alpha','I beta'};
ST0.addBlock(TunedBlocks)

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

% Grid of (alpha,beta) design points
alpha_vec = -10:5:25;	 % Alpha Range
beta_vec = -10:5:10;     % Beta Range
[alpha,beta] = ndgrid(alpha_vec,beta_vec);
SG = struct('alpha',alpha,'beta',beta);

% Proportional gains
alphabetaBasis = polyBasis('canonical',2,2);
P_PHI = tunableSurface('Pphi', 0.05, SG, alphabetaBasis);
P_ALPHA = tunableSurface('Palpha', 0.05, SG, alphabetaBasis);
P_BETA = tunableSurface('Pbeta', -0.05, SG, alphabetaBasis);
ST0.setBlockParam('P phi',P_PHI);
ST0.setBlockParam('P alpha',P_ALPHA);
ST0.setBlockParam('P beta',P_BETA);

% Integral gains
alphaBasis = @(alpha) alpha;
betaBasis = @(beta) abs(beta);
alphabetaBasis = ndBasis(alphaBasis,betaBasis);
I_PHI = tunableSurface('Iphi', 0.05, SG, alphabetaBasis);
I_ALPHA = tunableSurface('Ialpha', 0.05, SG, alphabetaBasis);
I_BETA = tunableSurface('Ibeta', -0.05, SG, alphabetaBasis);
ST0.setBlockParam('I phi',I_PHI);
ST0.setBlockParam('I alpha',I_ALPHA);
ST0.setBlockParam('I beta',I_BETA);

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

Теперь можно использовать systune чтобы настроить 6 поверхностей усиления против трех целей настройки.

ST = systune(ST0,[R1 R2 R3]);
Final: Soft = 1.03, Hard = -Inf, Iterations = 41

Конечное целевое значение близко к 1, поэтому цели настройки по существу выполняются. Постройте график угловых характеристик замкнутой системы и сравните с проектом базовой линии.

T = getIOTransfer(ST,'Demand',{'Phi_deg','Alpha_deg','Beta_deg'});
step(T0,T,6)
legend('Baseline','Tuned','Location','SouthEast')

Результаты сопоставимы с базовой линией с меньшими колебаниями в откликах крена и бокового выступа и уменьшенным количеством поперечного сцепления. Использование viewSurf для осмотра настроенных усилительных поверхностей.

TV = getTunedValue(ST);
clf
% NOTE: setBlockValue updates each gain surface with the tuned coefficients in TV
subplot(3,2,1)
viewSurf(setBlockValue(P_PHI,TV))
subplot(3,2,3)
viewSurf(setBlockValue(P_ALPHA,TV))
subplot(3,2,5)
viewSurf(setBlockValue(P_BETA,TV))
subplot(3,2,2)
viewSurf(setBlockValue(I_PHI,TV))
subplot(3,2,4)
viewSurf(setBlockValue(I_ALPHA,TV))
subplot(3,2,6)
viewSurf(setBlockValue(I_BETA,TV))

Валидация

Чтобы дополнительно подтвердить этот проект, передвиньте настроенные поверхности усиления к модели Simulink.

writeBlockValue(ST)

Для трех блоков интерполяционной таблицы «I phi», «I alpha», «I beta», writeBlockValue дискретизирует поверхности усиления в точках останова таблицы и обновляет данные таблицы в рабочем пространстве модели. Для блоков MATLAB function «P phi», «P alpha», «P beta», writeBlockValue генерирует код MATLAB для уравнений поверхности усиления. Например, код для блока «P phi» выглядит следующим образом

Simulink Coder автоматически превращает этот код MATLAB в эффективные встроенные Коды С. Использовать ли интерполяционные таблицы или блоки MATLAB Function, зависит от приложения. Опция Функция MATLAB обеспечивает плавное изменение коэффициентов усиления как функции альфа и бета (отсутствие искривлений в точках останова). Это также может быть более эффективным в памяти, так как ему нужно только хранить коэффициенты полиномиального уравнения для поверхности усиления. С другой стороны, оценка усиления в заданной (альфа, бета) точке может занять несколько больше операций, чем в интерполяционной таблице, и дальнейшая настройка коэффициентов усиления легче в интерполяционной таблице.

После того, как вы перенесли коэффициент усиления в Simulink, настройка автопилота завершена, и можно симулировать его поведение во время захода на посадку.

Эффективность удовлетворительная, но линейные отклики показали значительное количество перекрестных связей между осями, и мы не смогли совсем достичь целевого уровня устойчивости в угловых точках (альфа, бета) области значений. Было бы выгодно использовать архитектуру MIMO, которая объединяет все три измерения phi, альфа, бета для вычисления поверхностных отклонений? Эта идея дополнительно исследуется в части 4 этой серии (Attitude Control в HL-20 Autopilot - MIMO Design).

Ссылки

[1] P. Gahinet and P. Apkarian, «Автоматизированная настройка систем управления по расписанию усиления», Proc. IEEE Conf. Decision and Control, Dec 2013.

См. также

Похожие темы