В этом примере показано, как использовать slTuner и systune настроить стандартную настройку продольного автопилота. Мы благодарим профессора Д. Алэзарда от Institut Superieur de l'Aeronautique et de l'Espace для обеспечения модели самолета и профессора Пьера Апкаряна от ONERA для разработки примера.
Продольный автопилот для сверхзвукового пассажирского струйного полета в Махе 0.7 и 5 000 футов изображен в рисунке 1. Автопилот основная цель должен следовать за вертикальными ускоряющими командами
, данными пилотом. Структура обратной связи состоит из внутреннего цикла, управляющего уровнем подачи
и внешним контуром, управляющим вертикальным ускорением
. Автопилот также включает компонент прямого распространения и образец модели
, который задает желаемый ответ на команду шага
. Наконец, фильтр спада второго порядка

используется, чтобы ослабить шум и ограничить пропускную способность управления как гарантию против несмоделированной динамики. Настраиваемые компоненты подсвечены в оранжевом.

Рисунок 1: продольная настройка автопилота.
Модель самолета
является моделью с 5 состояниями, переменные состояния, являющиеся аэродинамической скоростью
(m/s), угол подъема
(рад), угол нападения
(рад), уровень подачи
(rad/s) и высота
(m). Отклонение лифта
(рад) используется, чтобы управлять вертикальным коэффициентом загрузки
. Движущие силы разомкнутого контура включают
колебание с частотой и коэффициентом затухания
= 1.7 (rad/s) и
= 0.33, фугоидный режим
= 0.64 (rad/s) и
= 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] rad/s (вспомните, что мы не можем управлять установившейся ошибкой обнулить из-за нуля объекта в 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';
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 = 74
Используйте showTunable видеть настроенные значения блока.
showTunable(ST)
Block 1: rct_concorde/Ki =
D =
u1
y1 -0.02998
Name: Ki
Static gain.
-----------------------------------
Block 2: rct_concorde/Kp =
D =
u1
y1 -0.009687
Name: Kp
Static gain.
-----------------------------------
Block 3: rct_concorde/Kq =
D =
u1
y1 -0.2868
Name: Kq
Static gain.
-----------------------------------
Block 4: rct_concorde/Kf =
D =
u1
y1 -0.02271
Name: Kf
Static gain.
-----------------------------------
wn = 4.82
-----------------------------------
zeta = 0.514
Чтобы получить настроенное значение
, используйте getBlockValue оценивать Fro для настроенных значений параметров в ST:
Fro = getBlockValue(ST,'RollOff');
tf(Fro)
ans =
23.21
---------------------
s^2 + 4.949 s + 23.21
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]);

Диаграмма Боде подтверждает спад прошлых 8 рад/с на-40 дБ/десятилетие и указывает на запасы по амплитуде и фазе сверх 10 дБ и 70 градусов.
slTuner | systune (slTuner) | TuningGoal.Gain | TuningGoal.Margins