В этом примере показано, как использовать slTuner
и systune
настройка стандартного строения продольного автопилота. Мы благодарим профессора Д. Алазара из Institut Superieur de l'Aeronautique et de l'Espace за предоставление модели самолета и профессора Пьера Апкаряна из ONERA за разработку примера.
Продольный автопилот для сверхзвуковой пассажирской струи, летящей со скоростью 0,7 и 5000 футов, показан на фигура. Основной целью автопилота является выполнение команд вертикального ускорения, выданных пилотом. Структура обратной связи состоит из внутреннего цикла, управляющего скоростью тангажа, и внешнего контура, управляющего вертикальным ускорением. Автопилот также включает компонент с feedforward и образец модели, которая задает желаемый ответ на команду step. Наконец, фильтр свертывания второго порядка
используется для ослабления шума и ограничения полосы пропускания управления в качестве защиты от немоделированной динамики. Настраиваемые компоненты выделены оранжевым цветом.
Фигура 1: Продольное Строение автопилота.
Модель самолёта является моделью 5 состояний, переменными состояний являются аэродинамическая скорость (м/с), угол набора высоты (рад), угол атаки (рад), скорость тангажа (рад/с) и высота (м). Отклонение лифта (рад) используется для управления вертикальным коэффициентом нагрузки. Динамика разомкнутого контура включает колебание с частотой и коэффициентом затухания = 1,7 (рад/с) и = 0,33, режим фугоида = 0,64 (рад/с) и = 0,06, и режим медленной высоты = -0,0026.
load ConcordeData G bode(G,{1e-3,1e2}), grid title('Aircraft Model')
Обратите внимание на нуль в источник в. Из-за этого нуля мы не можем достичь нулевой статической ошибки и должны вместо этого фокусироваться на переходном процессе на команды ускорения. Обратите внимание, что команды ускорения являются переходными по своей природе, поэтому установившееся поведение не является проблемой. Этот нуль в источник также исключает чистое интегральное действие, поэтому мы используем псевдоинтегратор с = 0,001.
Когда система управления моделируется в Simulink, можно использовать slTuner
интерфейс для быстрой настройки задачи настройки. Откройте модель Simulink автопилота.
open_system('rct_concorde')
Сконфигурируйте slTuner
интерфейс путем перечисления настроенных блоков в модели Simulink (выделен оранжевым цветом). Это автоматически выбирает все точки линейного анализа в модели как точки интереса для анализа и настройки.
ST0 = slTuner('rct_concorde',{'Ki','Kp','Kq','Kf','RollOff'});
Это также параметрирует каждый настроенный блок и инициализирует параметры блоков на основе их значений в модели Simulink. Обратите внимание, что четыре усиления Ki,Kp,Kq,Kf
в этом примере инициализированы до нуля. По умолчанию фильтр отката параметризован как типовая передаточная функция второго порядка. Чтобы параметризовать его как
создать действительные параметры, построить передаточную функцию, показанную выше, и связать ее со RollOff
блок.
wn = realp('wn', 3); % natural frequency zeta = realp('zeta',0.8); % damping Fro = tf(wn^2,[1 2*zeta*wn wn^2]); % parametric transfer function setBlockParam(ST0,'RollOff',Fro) % use Fro to parameterize "RollOff" block
Автопилот должен быть настроен, чтобы удовлетворить трем основным требованиям к проекту:
1. Отслеживание уставки: Ответ на команду должен тесно совпадать с ответом образца модели:
Этот образец модели задаёт хорошо демпфированный ответ со время урегулирования 2 секунды.
2. Высокочастотный откат: Реакция с обратной связью от шумовых сигналов должна сходить за 8 рад/с с наклоном не менее -40 дБ/десятилетие.
3. Запасы устойчивости: запасы устойчивости во входе объекта должны составить по крайней мере 7 дБ и 45 степеней.
Для отслеживания уставки мы требуем, чтобы коэффициент усиления передачи с обратной связью от команды к ошибке отслеживания был маленьким в полосе частот [0.05,5] рад/с (напомним, что мы не можем привести установившуюся ошибку к нулю из-за нулевого объекта в s = 0). Используя несколько частотных точек, нарисуйте максимальную ошибку отслеживания как функцию от частоты и используйте ее, чтобы ограничить коэффициент усиления от до.
Freqs = [0.005 0.05 5 50]; Gains = [5 0.05 0.05 5]; Req1 = TuningGoal.Gain('Nzc','e',frd(Gains,Freqs)); Req1.Name = 'Maximum tracking error';
The TuningGoal.Gain
конструктор автоматически превращает эскиз максимальной ошибки в функцию плавного взвешивания. Использование viewGoal
для графической проверки требуемого профиля ошибки.
viewGoal(Req1)
Повторите тот же процесс, чтобы ограничить высокочастотный коэффициент усиления от шумовых входов и добиться наклона -40 дБ/десятилетие в полосе частот от 8 до 800 рад/с
Freqs = [0.8 8 800]; Gains = [10 1 1e-4]; Req2 = TuningGoal.Gain('n','delta_m',frd(Gains,Freqs)); Req2.Name = 'Roll-off requirement'; viewGoal(Req2)
Наконец, зарегистрируйте вход завода как сайт для разомкнутого контура анализа и использования TuningGoal.Margins
для захвата требования по запасу устойчивости.
addPoint(ST0,'delta_m') Req3 = TuningGoal.Margins('delta_m',7,45);
Теперь мы готовы настроить параметры автопилота с помощью systune
. Эта команда принимает неотключённое строение ST0
и три проекта и возвращают настроенную версию ST
от ST0
. Все требования выполняются, если окончательное значение меньше единицы.
[ST,fSoft] = systune(ST0,[Req1 Req2 Req3]);
Final: Soft = 0.965, Hard = -Inf, Iterations = 125
Использование showTunable
для просмотра настроенных значений блоков.
showTunable(ST)
Block 1: rct_concorde/Ki = D = u1 y1 -0.02967 Name: Ki Static gain. ----------------------------------- Block 2: rct_concorde/Kp = D = u1 y1 -0.009841 Name: Kp Static gain. ----------------------------------- Block 3: rct_concorde/Kq = D = u1 y1 -0.2843 Name: Kq Static gain. ----------------------------------- Block 4: rct_concorde/Kf = D = u1 y1 -0.0223 Name: Kf Static gain. ----------------------------------- wn = 4.81 ----------------------------------- zeta = 0.507
Чтобы получить настроенное значение, используйте getBlockValue
для оценки Fro
для настроенных значений параметров в ST
:
Fro = getBlockValue(ST,'RollOff');
tf(Fro)
ans = 23.14 --------------------- s^2 + 4.881 s + 23.14 Continuous-time transfer function.
Наконец, используйте viewGoal
графически проверить соответствие всем требованиям.
figure('Position',[100,100,550,710])
viewGoal([Req1 Req2 Req3],ST)
Теперь мы проверяем, что настроенный автопилот удовлетворяет требованиям проекта. Сначала сравните шаг-ответ с шагом-ответом эталонной модели. Снова используйте getIOTransfer
для вычисления настроенной передачи с обратной связью из Nzc
на Nz
:
Gref = tf(1.7^2,[1 2*0.7*1.7 1.7^2]); % reference model T = getIOTransfer(ST,'Nzc','Nz'); % transfer Nzc -> Nz figure, step(T,'b',Gref,'b--',6), grid, ylabel('N_z'), legend('Actual response','Reference model')
Также постройте график отклонения и соответствующих вкладов путей с feedforward и обратной связью:
T = getIOTransfer(ST,'Nzc','delta_m'); % transfer Nzc -> delta_m Kf = getBlockValue(ST,'Kf'); % tuned value of Kf Tff = Fro*Kf; % feedforward contribution to delta_m step(T,'b',Tff,'g--',T-Tff,'r-.',6), grid ylabel('\delta_m'), legend('Total','Feedforward','Feedback')
Наконец, проверьте требования к запасам при срабатывании и устойчивости путем вычисления отклика при разомкнутом контуре.
OL = getLoopTransfer(ST,'delta_m',-1); % negative-feedback loop transfer margin(OL); grid; xlim([1e-3,1e2]);
Диаграмма Боде подтверждает падение -40 дБ/десятилетие за 8 рад/с и указывает на запасы по усилению и фазе, превышающие 10 дБ и 70 степени.
slTuner
| systune (slTuner)
| TuningGoal.Gain
| TuningGoal.Margins