Управление ориентацией в автопилоте HL-20 - проект SISO

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

Фон

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

В части 2 (Угловое Управление Уровнем в автопилоте HL-20), мы показали, как замкнуть внутренние круги, управляющие угловыми уровнями 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 настроить усиления PI в пакетном режиме для определенной целевой пропускной способности и требований запаса по фазе. Оба подхода имеют протесты:

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

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

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

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

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

Это легко проверяется, что эта линеаризация блока составляет умножение сигнала ошибки различным количеством Kp, вычисленный выше. Точно так же замените соответствующие блоки продукта для 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 и я получаю расписания для внешнего контура, отмечаю эти три блока 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)

Для трех блоков интерполяционной таблицы "Я phi", "Я альфа", "Я бета", writeBlockValue производит поверхности усиления за таблицей, устанавливает точки останова и обновляет табличные данные в рабочем пространстве модели. Для блоков MATLAB function "P phi", "Альфа P", "P бета", writeBlockValue генерирует код MATLAB для уравнений поверхности усиления. Например, код для блока "P phi" похож

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

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

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

Ссылки

[1] П. Гэхинет и П. Апкэриэн, "Автоматизированная настройка запланированных на усиление систем управления", в материалах Решение Конференции IEEE и Управление, декабрь 2013.

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

Похожие темы