В этом примере показано, как использовать 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 степени.
TuningGoal.Gain | TuningGoal.Margins | slTuner (Simulink Control Design) | systune (slTuner) (Simulink Control Design)