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