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

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

Фон

Этот пример использует модель HL 20, адаптированную от Корпуса Несущего тела (Aerospace Blockset) NASA HL-20, смотрите Часть 1 ряда (Обрезка и Линеаризация корпуса HL-20) для деталей. В Частях 2 и 3 мы показали, как замкнуть внутренние круги и настроить внешние циклы классической архитектуры SISO для автопилота HL-20, смотрите Угловое Управление Уровнем в автопилоте HL-20 и Управление ориентацией в автопилоте HL-20 - Проект SISO для деталей. В этом примере мы исследуем преимущества переключения на архитектуру MIMO для внешних циклов.

В этой архитектуре, трех циклах PI для подачи, альфы, бета заменяется ПИ-контроллером с 3 выходами, с 3 входами, который смешивает подачу, альфу и бета измерения, чтобы вычислить заданные значения внутреннего цикла p_demand, q_demand, r_demand. Интуитивно, эта архитектура должна быть более успешной при сокращении перекрестных связей между осями. Обратите внимание на то, что P и я получаем, имеют размер 3х3 матрицы, запланированные как функция альфы и беты.

Чтобы начать, загрузите модель, установите CTYPE к 3, чтобы выбрать вариант MIMO блока Controller и повторно применить шаги Части 2 для того, чтобы замкнуть внутренние круги (эта часть проекта неизменна). Обратите внимание на то, что это создает и конфигурирует slTuner интерфейс ST0 для взаимодействия с моделью Simulink.

load_system('csthl20_control')
CTYPE = 3;  % MIMO 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/MIMO/Demands
Point 7: Signal "p_demand", located at port 1 of csthl20_control/Flight Control System/Controller/MIMO/Roll-off1
Point 8: Signal "q_demand", located at port 1 of csthl20_control/Flight Control System/Controller/MIMO/Roll-off2
Point 9: Signal "r_demand", located at port 1 of csthl20_control/Flight Control System/Controller/MIMO/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 для настройки внешнего цикла

Как в проекте SISO (Управление ориентацией в автопилоте HL-20 - Проект SISO), первый шаг должен получить линеаризовавшую модель "объекта", замеченного внешними циклами в каждом (альфа, бета) условие. Чтобы составлять то, что внутренний цикл получает Kp, Kq, криптон меняется (альфа, бета), заменяет блок "MIMO/Product" своим линейным эквивалентом, который является диагональной матрицей усиления

Blk = 'csthl20_control/Flight Control System/Controller/MIMO/Product';
Subs = [zeros(3) append(ss(Kp),ss(Kq),ss(Kr))];
BlockSub4 = struct('Name',Blk,'Value',Subs);

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

Расписания "P" и "I" усиления инициализируются к постоянным диагональным матрицам diag([0.05, 0.05, -0.05]). Постройте угловые ответы для этих начальных установок.

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

Настройка целей

Чтобы настроить MIMO получают расписания, мы используем следующие три настраивающихся гола:

  • Цель "Чувствительности" задать желаемую пропускную способность (время отклика) и максимизировать разъединение в низкой частоте.

s = tf('s');
R1 = TuningGoal.Sensitivity({'Phi_deg','Alpha_deg','Beta_deg'},s);
R1.Focus = [1e-2 1];
R1.LoopScaling = 'off';

viewGoal(R1)

  • Ограничение "Усиления" на передачу с обратной связью от угловых требований до угловых ответов. Профиль усиления выбран, чтобы осуществить соответствующий спад и предельное перерегулирование (который связан с горбом около перекрестного соединения).

MaxGain = 1.2 * (10/(s+10))^2;  % max gain profile
R2 = TuningGoal.Gain('Demands',{'Phi_deg','Alpha_deg','Beta_deg'},MaxGain);

viewGoal(R2)

  • Цель "Полей" потребовать запасов по амплитуде по крайней мере 7 дБ и запасов по фазе по крайней мере 45 градусов (в дисковом смысле поля).

R3 = TuningGoal.Margins('da;de;dr',7,45);

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

Расписания усиления для ПИ-контроллера MIMO заданы блоками "P" и "I" в архитектуре MIMO. Вспомните, что эти блоки выводят 3х3 матрицы и реализуют передаточную функцию MIMO:

Для пользы рисунка мы используем блок MATLAB function, чтобы реализовать пропорциональное расписание усиления и блок Matrix Interpolation, чтобы реализовать интегральное расписание усиления. Блок Matrix Interpolation живет в библиотеке "Simulink Extras" и является интерполяционной таблицей, где каждая запись таблицы является матрицей.

Чтобы настроить P и я получаю расписания, отмечаю соответствующие блоки как настраиваемые в slTuner интерфейс.

TunedBlocks = {'MIMO/P' , 'MIMO/I'};
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 gain matrix
alphabetaBasis = polyBasis('canonical',2,2);
P0 = diag([0.05 0.05 -0.05]);  % initial (constant) value
PS = tunableSurface('P', P0, SG, alphabetaBasis);
ST0.setBlockParam('P',PS);

% Integral gain matrix
alphaBasis = @(alpha) alpha;
betaBasis = @(beta) abs(beta);
alphabetaBasis = ndBasis(alphaBasis,betaBasis);
I0 = diag([0.05 0.05 -0.05]);
IS = tunableSurface('I', I0, SG, alphabetaBasis);
ST0.setBlockParam('I',IS);

Наконец, используйте systune настроить 6 поверхностей усиления против трех настраивающихся голов.

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

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

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

Эти ответы показывают значительные сокращения перерегулирования и перекрестную связь, когда по сравнению с SISO проектируют.

Валидация

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

writeBlockValue(ST)

Для блока "I" Matrix Interpolation это производит поверхность усиления в табличных точках останова и обновляет табличные данные в рабочем пространстве модели. Для блока MATLAB function "P", это генерирует код MATLAB для уравнений поверхности усиления. Вы видите этот код путем двойного клика на блоке.

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

Эти ответы не очень отличаются от проекта SISO (Управление ориентацией в автопилоте HL-20 - Проект SISO) из-за умеренных требований в течение маневра. Преимущества проекта MIMO больше отобразились бы в более сложном маневре.