Этот пример использует systune
сгенерировать сглаженные расписания усиления для автопилота с тремя циклами.
Этот пример использует три модели степени свободы динамики оси тангажа корпуса. Состояния являются Наземными координатами, координатами тела, углом тангажа и уровнем тангажа. Следующая фигура обобщает отношение между инерционными и системами координат тела, углом угла тангажа, углом установки и углом тангажа.
Мы используем классическую структуру автопилота с тремя циклами, чтобы управлять углом угла тангажа. Этот автопилот настраивает угол тангажа путем поставки соответствующих пакетов нормального ускорения (ускорение вперед). В свою очередь нормальное ускорение производится путем корректировки отклонения лифта, чтобы вызвать подачу и варьироваться объем подъема. Автопилот использует управление Пропорциональным Интегралом (PI) в цикле уровня тангажа и пропорциональное управление в и циклах. Система с обратной связью (корпус и автопилот) моделируется в Simulink.
open_system('rct_airframeGS')
Движущие силы корпуса нелинейны и аэродинамические силы, и моменты зависят от скорости и падения. Чтобы получить подходящую эффективность в конверте рейса, усиления автопилота должны быть настроены в зависимости от и компенсировать изменения в динамике объекта. Этот процесс корректировки называется "табличным управлением" и называется переменными планирования. В модели Simulink расписания усиления реализованы как интерполяционные таблицы, управляемые измерениями и.
Табличное управление является линейным методом для управления нелинейными или изменяющимися во времени объектами. Идея состоит в том, чтобы вычислить линейные аппроксимации объекта в различных условиях работы, настроить усиления контроллера в каждых условиях работы и усиления подкачки в зависимости от условий работы во время операции. Обычное табличное управление включает выполняющий трех существенных шагов.
Обрежьте и линеаризуйте объект в каждых условиях работы
Настройте усиления контроллера для линеаризовавшей динамики в каждых условиях работы
Согласуйте значения усиления, чтобы обеспечить плавный переход между условиями работы.
В этом примере вы комбинируете шаги 2 и 3 путем параметризации усилений автопилота как полиномов первого порядка в и непосредственно настройки полиномиальных коэффициентов для целого конверта рейса. Этот подход устраняет шаг 3 и гарантирует сглаженные изменения усиления в зависимости от и. Кроме того, коэффициенты расписания усиления могут быть автоматически настроены с systune
.
Примите, что падение варьируется между-20 и 20 градусами и что скорость варьируется между 700 и 1 400 м/с. При пренебрежении силы тяжести движущие силы корпуса симметричны в. Поэтому рассмотрите только положительные значения. Используйте 5 9 сетка линейно расположенных с интервалами пар, чтобы покрыть конверт рейса.
nA = 5; % number of alpha values nV = 9; % number of V values [alpha,V] = ndgrid(linspace(0,20,nA)*pi/180,linspace(700,1400,nV));
Для каждого условия рейса линеаризуйте динамику корпуса в обрезке (обнулите нормальное ускорение и подачу момента). Это требует вычисления отклонения лифта и уровня тангажа, которые приводят к устойчивому и. Для этого сначала изолируйте модель корпуса в отдельной модели Simulink.
mdl = 'rct_airframeTRIM';
open_system(mdl)
Используйте operspec
чтобы задать условие для обрезки, используйте findop
вычислить значения для обрезки и и линеаризовать динамику корпуса для получившихся рабочих точек. Для получения дополнительной информации смотрите Обрезку и Линеаризацию Корпуса. Повторите эти шаги для 45 условий рейса.
Вычислите условие для обрезки для каждой пары.
for ct=1:nA*nV alpha_ini = alpha(ct); % Incidence [rad] v_ini = V(ct); % Speed [m/s] % Specify trim condition opspec(ct) = operspec(mdl); % Xe,Ze: known, not steady opspec(ct).States(1).Known = [1;1]; opspec(ct).States(1).SteadyState = [0;0]; % u,w: known, w steady opspec(ct).States(3).Known = [1 1]; opspec(ct).States(3).SteadyState = [0 1]; % theta: known, not steady opspec(ct).States(2).Known = 1; opspec(ct).States(2).SteadyState = 0; % q: unknown, steady opspec(ct).States(4).Known = 0; opspec(ct).States(4).SteadyState = 1; end opspec = reshape(opspec,[nA nV]);
Обрежьте модель для данных технических требований.
Options = findopOptions('DisplayReport','off'); op = findop(mdl,opspec,Options);
Линеаризуйте модель при условиях для обрезки.
G = linearize(mdl,op); G.u = 'delta'; G.y = {'alpha','V','q','az','gamma','h'}; G.SamplingGrid = struct('alpha',alpha,'V',V);
Этот процесс производит 5 9 массив линеаризовавших моделей объекта управления при 45 условиях рейса. Движущие силы объекта варьируются существенно через конверт рейса.
sigma(G)
title('Variations in airframe dynamics')
Автопилот состоит из четырех усилений, которые будут "запланированы" (настроенный) в зависимости от и. Практически, это означает настраивать 88 значений в каждой из соответствующих четырех интерполяционных таблиц. Вместо того, чтобы настраивать каждую запись таблицы отдельно, параметрируйте усиления, когда двумерное усиление появляется, например, поверхности с простой полилинейной зависимостью от и:
.
Это сокращает количество переменных от 88 вниз к 4 для каждой интерполяционной таблицы. Используйте tunableSurface
объект параметрировать каждую поверхность усиления. Обратите внимание на то, что:
TuningGrid
задает "настраивающуюся сетку" (точки проекта). Эта сетка должна совпадать с тем, используемым для линеаризации, но не должна совпадать с табличными точками останова цикла
ShapeFcn
задает основные функции для поверхностной параметризации (и)
Каждая поверхность инициализируется к постоянному усилению с помощью настраивающихся результатов для = 10 градусов и = 1 050 м/с (средний проект).
TuningGrid = struct('alpha',alpha,'V',V); ShapeFcn = @(alpha,V) [alpha,V,alpha*V]; Kp = tunableSurface('Kp',0.1, TuningGrid,ShapeFcn); Ki = tunableSurface('Ki',2, TuningGrid,ShapeFcn); Ka = tunableSurface('Ka',0.001, TuningGrid,ShapeFcn); Kg = tunableSurface('Kg',-1000, TuningGrid,ShapeFcn);
Затем создайте slTuner
интерфейс для настройки поверхностей усиления. Используйте замену блока, чтобы заменить нелинейную модель объекта управления линеаризовавшими моделями по настраивающейся сетке. Используйте setBlockParam
сопоставлять настраиваемое усиление появляется Kp
, Ki
, Ka
, Kg
с блоками Интерполяции того же имени.
BlockSubs = struct('Name','rct_airframeGS/Airframe Model','Value',G); ST0 = slTuner('rct_airframeGS',{'Kp','Ki','Ka','Kg'},BlockSubs); % Register points of interest ST0.addPoint({'az_ref','az','gamma_ref','gamma','delta'}) % Parameterize look-up table blocks ST0.setBlockParam('Kp',Kp,'Ki',Ki,'Ka',Ka,'Kg',Kg);
systune
может автоматически настроить коэффициенты поверхности усиления для целого конверта рейса. Используйте TuningGoal
объекты задать цели эффективности:
цикл: Отследите заданное значение с 1 вторым временем отклика, меньше чем 2%-й установившейся ошибкой и меньше чем 30%-й пиковой ошибкой.
Req1 = TuningGoal.Tracking('gamma_ref','gamma',1,0.02,1.3); viewGoal(Req1)
цикл: Обеспечьте хорошее подавление помех в низкой частоте (чтобы отследить ускоряющие требования) и прошлые 10 рад/с (чтобы быть нечувствительными к шуму измерения). Воздействие введено в az_ref
местоположение .
RejectionProfile = frd([0.02 0.02 1.2 1.2 0.1],[0 0.02 2 15 150]); Req2 = TuningGoal.Gain('az_ref','az',RejectionProfile); viewGoal(Req2)
цикл: Обеспечьте хорошему подавлению помех до 10 рад/с. Воздействие введено во входе delta
объекта.
Req3 = TuningGoal.Gain('delta','az',600*tf([0.25 0],[0.25 1])); viewGoal(Req3)
Переходные процессы: Обеспечьте минимальный коэффициент затухания 0,35 для переходных процессов без колебаний
MinDamping = 0.35; Req4 = TuningGoal.Poles(0,MinDamping);
Используя systune
, настройте 16 коэффициентов поверхности усиления, чтобы лучше всего соответствовать этим требованиям к производительности при всех 45 условиях рейса.
ST = systune(ST0,[Req1 Req2 Req3 Req4]);
Final: Soft = 1.13, Hard = -Inf, Iterations = 57
Окончательное значение объединенной цели близко к 1, указывая, что все требования почти удовлетворяются. Визуализируйте получившиеся поверхности усиления.
% Get tuned gain surfaces. TGS = getBlockParam(ST); % Plot gain surfaces. clf subplot(2,2,1) viewSurf(TGS.Kp) title('Kp') subplot(2,2,2) viewSurf(TGS.Ki) title('Ki') subplot(2,2,3) viewSurf(TGS.Ka) title('Ka') subplot(2,2,4) viewSurf(TGS.Kg) title('Kg')
Сначала подтвердите настроенный автопилот при 45 условиях рейса, рассмотренных выше. Постройте ответ на ступенчатое изменение в углу угла тангажа и ответ на воздействие шага в отклонении лифта.
clf subplot(2,1,1) step(getIOTransfer(ST,'gamma_ref','gamma'),5) grid title('Tracking of step change in flight path angle') subplot(2,1,2) step(getIOTransfer(ST,'delta','az'),3) grid title('Rejection of step disturbance at plant input')
Ответы являются удовлетворительными при всех условиях рейса. Затем подтвердите автопилот против нелинейной модели корпуса. Сначала используйте writeBlockValue
применять настраивающиеся результаты к модели Simulink. Это оценивает каждую формулу поверхности усиления в точках останова, заданных в двух блоках Перед поиском, и написало результат в соответствующем блоке Interpolation.
writeBlockValue(ST)
Симулируйте эффективность автопилота для маневра, который берет корпус через значительную часть его конверта рейса. Код ниже эквивалентен нажатию кнопки воспроизведения в модели Simulink и осмотре ответов в блоках Scope.
% Specify the initial conditions. h_ini = 1000; alpha_ini = 0; v_ini = 700; % Simulate the model. SimOut = sim('rct_airframeGS', 'ReturnWorkspaceOutputs', 'on'); % Extract simulation data. SimData = get(SimOut,'sigsOut'); Sim_gamma = getElement(SimData,'gamma'); Sim_alpha = getElement(SimData,'alpha'); Sim_V = getElement(SimData,'V'); Sim_delta = getElement(SimData,'delta'); Sim_h = getElement(SimData,'h'); Sim_az = getElement(SimData,'az'); t = Sim_gamma.Values.Time; % Plot the main flight variables. clf subplot(2,1,1) plot(t,Sim_gamma.Values.Data(:,1),'r--',t,Sim_gamma.Values.Data(:,2),'b') grid legend('Commanded','Actual','location','SouthEast') title('Flight path angle \gamma in degrees') subplot(2,1,2) plot(t,Sim_delta.Values.Data) grid title('Elevator deflection \delta in degrees')
subplot(2,1,1) plot(t,Sim_alpha.Values.Data) grid title('Incidence \alpha in degrees') subplot(2,1,2) plot(t,Sim_V.Values.Data) grid title('Speed V in m/s')
subplot(2,1,1) plot(t,Sim_h.Values.Data) grid title('Altitude h in meters') subplot(2,1,2) plot(t,Sim_az.Values.Data) grid title('Normal acceleration a_z in g''s')
Отслеживание углового профиля угла тангажа остается хорошим в течение маневра. Обратите внимание на то, что изменения падения и скорости покрывают большую часть конверта рейса, рассмотренного здесь ([-20,20] степени для и [700,1400] для). И в то время как автопилот был настроен для номинальной высоты 3 000 м, он достигает хорошего результата для высоты, изменяющейся от 1 000 до 10 000 м.
Нелинейные результаты симуляции подтверждают, что запланированный на усиление автопилот поставляет последовательно высокую производительность в конверте рейса. "Поверхность усиления настраивающаяся" процедура обеспечивает простые явные формулы для зависимости усиления от переменных планирования. Вместо того, чтобы использовать интерполяционные таблицы, можно использовать эти формулы непосредственно для более эффективной памятью аппаратной реализации.
setBlockParam
| slTuner
| tunableSurface