Рабочий процесс MATLAB для настройки автопилота HL-20

Это - Часть 5 ряда в качестве примера на проекте и настройке системы управления полетом для автомобиля HL-20. Эта часть показывает, как выполнить большую часть проекта в MATLAB, не взаимодействуя с моделью Simulink.

Фон

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

В части 2 (Угловое Управление Уровнем в Автопилоте (Control System Toolbox) HL-20) и Части 3 (Управление ориентацией в автопилоте HL-20 - Проект SISO (Control System Toolbox)), мы показали, как замкнуть внутренние круги и настроить расписания усиления для внешних циклов. Эти примеры использовали интерфейс slTuner, чтобы взаимодействовать с моделью Simulink, получить линеаризовавшие модели и ответы системы управления, и нажатие настроило значения назад на Simulink.

Для простых архитектур и быстрых итераций проектирования, это может быть предпочтительным (и концептуально более простым) управлять линеаризовавшими моделями в MATLAB и использовать основные команды как feedback, чтобы замкнуть круги. Этот пример показывает, как выполнить шаги проекта Частей 2 и 3 в MATLAB.

Получение моделей объекта управления

Чтобы настроить автопилот, нам нужны линеаризовавшие модели передаточной функции от отклонений до углового положения и уровней. Для этого запустите с результатов "Обрезки и Линеаризуйте" шаг (см. Обрезку и Линеаризацию Корпуса (Control System Toolbox) HL-20). Вспомните, что G7 является линейной моделью с семью состояниями корпуса в 40 различных (альфа, бета) условия, и CS является линеаризацией блока Селектора Средств управления.

load csthl20_TrimData G7 CS

Используя модель "csthl20_trim" Simulink как ссылка для выбора I/Os, создайте желаемые модели объекта управления путем соединения G7 и CS последовательно. Не забывайте преобразовывать phi, альфу, бету от радианов до степеней.

r2d = 180/pi;
G = diag([1 1 1 r2d r2d r2d]) * G7([4:7 31:32],1:6) * CS(:,1:3);

G.InputName = {'da','de','dr'};
G.OutputName = {'p','q','r','Phi_deg','Alpha_deg','Beta_deg'};

size(G)
8x5 array of state-space models.
Each model has 6 outputs, 3 inputs, and 7 states.

Это дает нам массив моделей объекта управления по 8 5 сетка (альфа, бета) условия, используемые для обрезки.

Замыкание внутренних кругов

Чтобы замкнуть внутренние круги, мы выполняем ту же процедуру как в части 2 (Угловое Управление Уровнем в Автопилоте (Control System Toolbox) HL-20). Это состоит из выбора усиления Kp, Kq, криптон, чтобы установить перекрестную частоту p, q, r циклы к 30, 22.5, и 37,5 рад/с, соответственно.

% Compute Kp,Kq,Kr for each (alpha,beta) condition.
Gpqr = G({'p','q','r'},:);
Kp = 1./abs(evalfr(Gpqr(1,1),30i));
Kq = -1./abs(evalfr(Gpqr(2,2),22.5i));
Kr = -1./abs(evalfr(Gpqr(3,3),37.5i));

bode(Gpqr(1,1)*Kp,Gpqr(2,2)*Kq,Gpqr(3,3)*Kr,{1e-1,1e3}), grid
legend('da to p','de to q','dr to r')

Используйте feedback, чтобы замкнуть эти три внутренних круга. Вставьте аналитическую точку во входном da объекта, de, докторе для более поздней оценки запасов устойчивости.

Cpqr = append(ss(Kp),ss(Kq),ss(Kr));
APu = AnalysisPoint('u',3);  APu.Location = {'da','de','dr'};

Gpos = feedback(G * APu * Cpqr, eye(3), 1:3, 1:3);
Gpos.InputName = {'p_demand','q_demand','r_demand'};

size(Gpos)
8x5 array of generalized state-space models.
Each model has 6 outputs, 3 inputs, 7 states, and 1 blocks.

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

Настройка внешних циклов

Затем переместитесь во внешние циклы. У нас уже есть массив линейных моделей Gpos для "объекта", замеченного внешними циклами. Как сделано в части 3 (Управление ориентацией в автопилоте HL-20 - Проект SISO (Control System Toolbox)), параметризуйте шесть расписаний усиления, когда полином появляется в альфе и бете. Снова мы используем квадратичные поверхности для пропорциональных усилений и полилинейные поверхности для интегральных усилений.

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

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

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

KP = append(P_PHI,P_ALPHA,P_BETA);
KI = append(I_PHI,I_ALPHA,I_BETA);
Cpos = KP + KI * tf(1,[1 0]);

Наконец, используйте feedback, чтобы получить настраиваемую модель с обратной связью внешних циклов. Чтобы позволить настроиться и анализ с обратной связью, вставьте аналитические точки на объекте выходные параметры.

RollOffFilter = tf(10,[1 10]);
APy = AnalysisPoint('y',3);  APy.Location = {'Phi_deg','Alpha_deg','Beta_deg'};

T0 = feedback(APy * Gpos(4:6,:) * RollOffFilter * Cpos ,eye(3));
T0.InputName = {'Phi_demand','Alpha_demand','Beta_demand'};
T0.OutputName = {'Phi_deg','Alpha_deg','Beta_deg'};

Можно построить ответы с обратной связью для начальных настроек поверхности усиления (постоянные усиления 0,05).

step(T0,6)

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

Используйте те же настраивающие цели в качестве в части 3 (Управление ориентацией в автопилоте HL-20 - Проект SISO (Control System Toolbox)). Они включают "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';

Они также включают переменную цель "Полей" наложить соответствующие запасы устойчивости в каждом цикле и через циклы.

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

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

Можно теперь использовать systune, чтобы сформировать шесть поверхностей усиления против настраивающихся целей во всех 40 точках проекта.

T = systune(T0,[R1 R2 R3]);
Final: Soft = 1.03, Hard = -Inf, Iterations = 42

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

step(T0,T,6)
legend('Baseline','Tuned','Location','SouthEast')

Результаты совпадают с полученными в Частях 2 и 3. Настроенные поверхности усиления также подобны.

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

Вы могли теперь использовать evalSurf, чтобы выбрать поверхности усиления и обновить интерполяционные таблицы в модели Simulink. Вы могли также использовать метод codegen, чтобы сгенерировать код для уравнений поверхности усиления. Например,

% Generate code for "P phi" block
MCODE = codegen(setBlockValue(P_PHI,T));

% Get tuned values for the "I phi" lookup table
Kphi = evalSurf(setBlockValue(I_PHI,T),alpha_vec,beta_vec);

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

Похожие темы