Это часть 5 серии примеров по проекту и настройке системы управления рейсом для HL-20 транспортного средства. В этой части показано, как выполнить большую часть проекта в MATLAB, не взаимодействуя с моделью Simulink.
Этот пример использует модель HL-20, адаптированную из планера НАСА HL-20 грузоподъемного тела (Aerospace Blockset), см. Часть 1 серии (Обрезка и линеаризация HL-20 планера) для получения дополнительной информации. Автопилот, контролирующий положение самолета, состоит из трёх внутренних циклов и трех внешних контуров.
В Части 2 (Управление Угловой Скоростью в HL-20 Autopilot) и Части 3 (Управление Отношением в HL-20 Autopilot - SISO Design) мы показали, как закрыть внутренние циклы и настроить графики усиления для внешних контуров. Эти примеры использовали slTuner
интерфейс для взаимодействия с моделью Simulink, получения линеаризированных моделей и откликов системы управления и возврата настроенных значений к Simulink.
Для простых архитектур и быстрых итераций проектирования может быть предпочтительнее (и концептуально проще) манипулировать линеаризированными моделями в MATLAB и использовать основные команды, такие как feedback
чтобы закрыть циклы. В этом примере показано, как выполнить шаги проекта деталей 2 и 3 в MATLAB.
Чтобы настроить автопилот, нам нужны линеаризированные модели передаточной функции от отклонений к угловому положению и скоростям. Для этого начните с результатов с шага «Обрезка и линеаризация» (см. Обрезка и линеаризация HL-20 Airframe). Напомним, что G7
является семигосударственной линейной моделью планера при 40 различных (альфа, бета) условиях и CS
является линеаризацией блока Controls Selector.
load csthl20_TrimData G7 CS
Используя модель Simulink «csthl20_trim» в качестве ссылки для выбора 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 (Управление Угловой Скоростью в HL-20 Autopilot). Это состоит из выбора коэффициентов усиления Kp, Kq, Kr, чтобы установить частоту среза циклов 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, dr для последующей оценки запасов устойчивости.
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 (Attitude Control в HL-20 Autopilot - SISO Design), параметризовайте шесть графиков усиления как полиномиальные поверхности в альфа и бете. Снова мы используем квадратичные поверхности для пропорциональных составляющих и мультилинейные поверхности для интегральных составляющих.
% 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, который принял ошибки в угловых положениях 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 Autopilot - SISO Design). Они включают в себя цели «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 = 52
Конечное целевое значение близко к 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);