Это - Часть 5 ряда в качестве примера на проекте и настройке системы управления полетом для транспортного средства HL-20. Эта часть показывает, как выполнить большую часть проекта в MATLAB, не взаимодействуя с моделью Simulink.
Этот пример использует модель HL 20, адаптированную от Корпуса Несущего тела (Aerospace Blockset) NASA HL-20, смотрите Часть 1 ряда (Обрезка и Линеаризация корпуса HL-20) для деталей. Автопилот, управляющий отношением самолета, состоит из трех внутренних циклов и трех внешних контуров.
В части 2 (Угловое Управление Уровнем в автопилоте HL-20) и Части 3 (Управление ориентацией в автопилоте HL-20 - Проект SISO), мы показали, как замкнуть внутренние круги и настроить расписания усиления для внешних контуров. Эти примеры использовали slTuner
интерфейс, чтобы взаимодействовать с моделью Simulink, получите линеаризовавшие модели и ответы системы управления, и продвиньте настроенные значения назад к Simulink.
Для простых архитектур и быстрых итераций проектирования, это может быть предпочтительным (и концептуально более простым) управлять линеаризовавшими моделями в MATLAB и использовать основные команды как feedback
замкнуть круги. В этом примере показано, как выполнить шаги проекта Частей 2 и 3 в MATLAB.
Чтобы настроить автопилот, нам нужны линеаризовавшие модели передаточной функции от отклонений до углового положения и уровней. Для этого запустите с результатов "Обрезки и Линеаризуйте" шаг (см. Обрезку и Линеаризацию корпуса 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 (Угловое Управление Уровнем в автопилоте 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), параметрируйте шесть расписаний усиления, когда полином появляется в альфе и бете. Снова мы используем квадратичные поверхности для пропорциональных составляющих и полилинейные поверхности для интегральных составляющих.
% 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 - Проект SISO). Они включают "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);