Это - Часть 3 ряда в качестве примера на проекте и настройке системы управления полетом для транспортного средства HL-20. Эта часть показывает, как настроить классическую архитектуру SISO для управления креном, тангажом и рысканием транспортного средства.
Этот пример использует модель HL 20, адаптированную от Корпуса Несущего тела (Aerospace Blockset) NASA HL-20, смотрите Часть 1 ряда (Обрезка и Линеаризация корпуса HL-20) для деталей. Автопилот, управляющий отношением самолета, состоит из трех внутренних циклов и трех внешних контуров.
В части 2 (Угловое Управление Уровнем в автопилоте HL-20), мы показали, как замкнуть внутренние круги, управляющие угловыми уровнями p, q, r. Следующие команды резюмируют соответствующие шаги. Обратите внимание на то, что это создает и конфигурирует slTuner
интерфейс ST0
для взаимодействия с моделью Simulink.
load_system('csthl20_control') CTYPE = 2; % Select SISO architecture HL20recapPart2 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 'Output Port 1' of csthl20_control/Flight Control System/Controller Point 2: Signal "pqr", located at 'Output Port 2' of csthl20_control/HL20 Airframe Point 3: 'Output Port 1' of csthl20_control/Flight Control System/Alpha_deg Point 4: 'Output Port 1' of csthl20_control/Flight Control System/Beta_deg Point 5: 'Output Port 1' of csthl20_control/Flight Control System/Phi_deg Point 6: 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Demands Point 7: Signal "p_demand", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Roll-off1 Point 8: Signal "q_demand", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/Roll-off2 Point 9: Signal "r_demand", located at 'Output Port 1' of csthl20_control/Flight Control System/Controller/Classical/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
Мы теперь переключаем особое внимание на три запланированных на усиление цикла PI, управляющие креном (phi), углом нападения (альфа) и угол заноса (бета). Эти циклы могли быть настроены по одному (3 цикла, и 40 рабочих точек равняется 120 точкам проекта). Вы могли также использовать pidtune
настроить усиления PI в пакетном режиме для определенной целевой пропускной способности и требований запаса по фазе. Оба подхода имеют протесты:
Это затрудняет с учетом взаимодействий цикла.
Усиления, полученные в каждой точке проекта, могут быть противоречивыми и потребовать сглаживания через рабочие точки.
Альтернативный подход является концепцией "Поверхности Усиления Настройка" [1], где вы параметрируете расписания усиления P (альфа, бета) и я (альфа, бета), когда полином появляется, и используйте systune
настроить полиномиальные коэффициенты. Этот подход занимается всеми рабочими точками целиком и может считать взаимодействия цикла for, в частности для факторов запаса устойчивости. Это - подход, продемонстрированный здесь.
Чтобы настроить внешние контуры, мы должны замкнуть внутренние круги и получить линеаризовавшую модель "объекта", замеченного внешними контурами в каждом (альфа, бета) условие. Мы могли спросить slTuner
чтобы вычислить соответствующую передаточную функцию, но это эффективно зафиксировало бы усиления внутреннего цикла Kp, Kq, криптон к их значениям в условиях работы по умолчанию. Чтобы получить правильную линеаризацию, мы должны сказать slTuner
то, что эти усиления меняются (альфа, бета). Блокируйтесь замена является снова самым простым способом сделать это. Чтобы отметить Kp как варьирование, найдите, что блок продукта раньше умножал сигнал ошибки на Kp и заменял его массивом усилений, один для каждого (альфа, бета) условие.
ProductBlk = 'csthl20_control/Flight Control System/Controller/Classical/Product1'; BlockSub4 = struct('Name',ProductBlk,'Value',[0 ss(Kp)]);
Это легко проверяется, что эта линеаризация блока составляет умножение сигнала ошибки различным количеством Kp, вычисленный выше. Точно так же замените соответствующие блоки продукта для Kq и Kr путем изменяния усилений.
ProductBlk = 'csthl20_control/Flight Control System/Controller/Classical/Product3'; BlockSub5 = struct('Name',ProductBlk,'Value',[0 ss(Kq)]); ProductBlk = 'csthl20_control/Flight Control System/Controller/Classical/Product4'; BlockSub6 = struct('Name',ProductBlk,'Value',[0 ss(Kr)]); ST0.BlockSubstitutions = [ST0.BlockSubstitutions ; BlockSub4 ; BlockSub5 ; BlockSub6];
Можно теперь построить угловые ответы для начальных настроек расписания усиления в модели.
T0 = getIOTransfer(ST0,'Demand',{'Phi_deg','Alpha_deg','Beta_deg'}); step(T0,6)
Основные цели управления включают пропускную способность (время отклика) и запасы устойчивости. Используйте "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';
Используйте цель "Полей" наложить соответствующие запасы устойчивости в каждом цикле и через циклы. Эта цель основана на понятии дисковых полей, которое гарантирует устойчивость перед лицом параллельного усиления и изменений фазы всех трех циклов. Поскольку целевые поля 7 дБ и 40 градусов затрудняют, чтобы получить для экстремальных ориентаций (углы (альфа, бета) сетка), мы используем различную цель ослабить требования запаса по амплитуде и фазе в углах.
% 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);
Чтобы настроить P и я получаю расписания для внешнего контура, отмечаю эти три блока MATLAB function и три блока интерполяционной таблицы как настраиваемые.
TunedBlocks = {'P phi','P alpha','P beta','I phi','I alpha','I beta'}; 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 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); ST0.setBlockParam('P phi',P_PHI); ST0.setBlockParam('P alpha',P_ALPHA); ST0.setBlockParam('P beta',P_BETA); % 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); ST0.setBlockParam('I phi',I_PHI); ST0.setBlockParam('I alpha',I_ALPHA); ST0.setBlockParam('I beta',I_BETA);
Обратите внимание на то, что мы инициализировали каждую поверхность усиления к фиксированному значению, предложенному базовым проектом. В общем случае не рекомендуется начать с нулевой или случайной начальной точки, потому что трудность проблемы увеличивает вероятность застревания в неинтересных локальных минимумах. Вместо этого лучшая стратегия состоит из настройки фиксированного (непредвиденного) набора усилений против полного набора (или соответствующее подмножество) точек проекта. Такой "устойчивый проект" обычно обеспечивает хорошую начальную точку для настройки поверхности усиления.
Можно теперь использовать systune
настроить 6 поверхностей усиления против трех настраивающихся голов.
ST = systune(ST0,[R1 R2 R3]);
Final: Soft = 1.03, Hard = -Inf, Iterations = 41
Итоговое объективное значение близко к 1, таким образом, настраивающимся целям по существу удовлетворяют. Постройте угловые ответы с обратной связью и сравните с базовым проектом.
T = getIOTransfer(ST,'Demand',{'Phi_deg','Alpha_deg','Beta_deg'}); step(T0,T,6) legend('Baseline','Tuned','Location','SouthEast')
Результаты сопоставимы с базовой линией с меньшим количеством колебаний в крене и ответов заноса и уменьшаемым объемом перекрестной связи. Используйте viewSurf
смотреть настроенные поверхности усиления.
TV = getTunedValue(ST);
clf
% NOTE: setBlockValue updates each gain surface with the tuned coefficients in TV
subplot(3,2,1)
viewSurf(setBlockValue(P_PHI,TV))
subplot(3,2,3)
viewSurf(setBlockValue(P_ALPHA,TV))
subplot(3,2,5)
viewSurf(setBlockValue(P_BETA,TV))
subplot(3,2,2)
viewSurf(setBlockValue(I_PHI,TV))
subplot(3,2,4)
viewSurf(setBlockValue(I_ALPHA,TV))
subplot(3,2,6)
viewSurf(setBlockValue(I_BETA,TV))
Чтобы далее подтвердить этот проект, продвиньте настроенные поверхности усиления к модели Simulink.
writeBlockValue(ST)
Для трех блоков интерполяционной таблицы "Я phi", "Я альфа", "Я бета", writeBlockValue
производит поверхности усиления за таблицей, устанавливает точки останова и обновляет табличные данные в рабочем пространстве модели. Для блоков MATLAB function "P phi", "Альфа P", "P бета", writeBlockValue
генерирует код MATLAB для уравнений поверхности усиления. Например, код для блока "P phi" похож
Simulink Coder автоматически превращает этот код MATLAB в эффективный встроенный код С. Использовать ли интерполяционные таблицы, или блоки MATLAB function зависит от приложения. Опция функции MATLAB гарантирует сглаженное изменение усилений в зависимости от альфы и беты (никакие петли в точках останова). Это может также быть более эффективно памятью, когда это только должно сохранить коэффициенты полиномиального уравнения для поверхности усиления. С другой стороны, оценивая усиление в данном (альфа, бета) точка может взять еще несколько операций, чем в интерполяционной таблице, и дальнейшая корректировка усилений легче в интерполяционной таблице.
Если вы продвинули усиления к Simulink, настройка автопилота завершена, и можно симулировать ее поведение во время приземляющегося подхода.
Эффективность является удовлетворительной, но линейные ответы показали существенное количество перекрестной связи между осями, и мы могли не совсем достигнуть цели запасов устойчивости на углу точки (альфа, бета) область значений. Это было бы выгодно, чтобы использовать архитектуру MIMO, которая комбинирует все три измерения phi, альфы, бета, чтобы вычислить поверхностные отклонения? Эта идея далее исследуется в части 4 этого ряда (Управление ориентацией в автопилоте HL-20 - Проект MIMO).
[1] П. Гэхинет и П. Апкэриэн, "Автоматизированная настройка запланированных на усиление систем управления", в материалах Решение Конференции IEEE и Управление, декабрь 2013.