Это - Часть 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);