Этот пример показывает, как использовать slTuner
и systune
, чтобы настроить стандартную настройку продольного автопилота. Мы благодарим профессора Д. Алэзарда от Institut Superieur de l'Aeronautique et de l'Espace для обеспечения модели самолета и профессора Пьера Апкаряна от ONERA для разработки примера.
Продольный автопилот для сверхзвукового пассажирского струйного полета в Махе 0.7 и 5 000 футов изображен в рисунке 1. Автопилот основная цель должен следовать за вертикальными ускоряющими командами, данными пилотом. Структура обратной связи состоит из внутреннего цикла, управляющего уровнем подачи и внешним циклом, управляющим вертикальным ускорением. Автопилот также включает feedforward компонент и эталонную модель, которая задает желаемый ответ на команду шага. Наконец, фильтр спада второго порядка
используется, чтобы ослабить шум и ограничить пропускную способность управления как гарантию против несмоделированной динамики. Настраиваемые компоненты подсвечены в оранжевом.
Рисунок 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 = 97
Используйте showTunable
, чтобы видеть настроенные значения блока.
showTunable(ST)
Block 1: rct_concorde/Ki = D = u1 y1 -0.02996 Name: Ki Static gain. ----------------------------------- Block 2: rct_concorde/Kp = D = u1 y1 -0.009684 Name: Kp Static gain. ----------------------------------- Block 3: rct_concorde/Kq = D = u1 y1 -0.2863 Name: Kq Static gain. ----------------------------------- Block 4: rct_concorde/Kf = D = u1 y1 -0.02267 Name: Kf Static gain. ----------------------------------- wn = 4.82 ----------------------------------- zeta = 0.513
Чтобы получить настроенное значение, используйте getBlockValue
, чтобы оценить Fro
для настроенных значений параметров в ST
:
Fro = getBlockValue(ST,'RollOff');
tf(Fro)
ans = 23.19 --------------------- s^2 + 4.937 s + 23.19 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 градусов.
TuningGoal.Gain
| TuningGoal.Margins
| slTuner
| systune (slTuner)