Управление ориентацией в автопилоте 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
run(fullfile(matlabroot,'examples','control','main','HL20recapPart2.m'))

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 port 1 of csthl20_control/Flight Control System/Controller
Point 2: Signal "pqr", located at port 2 of csthl20_control/HL20 Airframe
Point 3: Port 1 of csthl20_control/Flight Control System/Alpha_deg
Point 4: Port 1 of csthl20_control/Flight Control System/Beta_deg
Point 5: Port 1 of csthl20_control/Flight Control System/Phi_deg
Point 6: Port 1 of csthl20_control/Flight Control System/Controller/Classical/Demands
Point 7: Signal "p_demand", located at port 1 of csthl20_control/Flight Control System/Controller/Classical/Roll-off1
Point 8: Signal "q_demand", located at port 1 of csthl20_control/Flight Control System/Controller/Classical/Roll-off2
Point 9: Signal "r_demand", located at 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 в пакетном режиме для определенной целевой пропускной способности и маржинальных требований фазы. Оба подхода имеют протесты:

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

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

Альтернативный подход является концепцией "Поверхности Усиления Настройка" [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 = 42

Итоговое объективное значение близко к 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.

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