Этот пример использует systune
, чтобы сгенерировать сглаженные расписания усиления для автопилота с тремя циклами.
Этот пример использует три модели степени свободы динамики оси подачи корпуса. Состояния являются Наземными координатами, координатами тела, углом подачи и уровнем подачи. Рисунок 1 обобщает отношение между инерционными и каркасами кузова, углом курса полета, углом установки и углом подачи.
Рисунок 1: динамика Корпуса.
Мы используем классическую структуру автопилота с тремя циклами, чтобы управлять углом курса полета. Этот автопилот настраивает курс полета путем поставки соответствующих пакетов нормального ускорения (ускорение вперед). В свою очередь нормальное ускорение производится путем корректировки отклонения лифта, чтобы вызвать подачу и отличаться объем подъема. Автопилот использует управление Пропорциональным Интегралом (PI) в цикле уровня подачи и пропорциональное управление в и циклах. Система с обратной связью (корпус и автопилот) моделируется в Simulink.
addpath(fullfile(matlabroot,'examples','control','main')) % add example data 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.
open_system('rct_airframeTRIM')
Используйте operspec
, чтобы задать условие для обрезки, использовать findop
, чтобы вычислить значения для обрезки и и линеаризовать динамику корпуса для получившейся рабочей точки. Смотрите "Обрезку и Линеаризацию Корпуса" пример в Simulink Control Design для деталей. Повторите эти шаги для 45 условий рейса.
% Compute trim condition for each (alpha,V) pair clear op for ct=1:nA*nV alpha_ini = alpha(ct); % Incidence [rad] v_ini = V(ct); % Speed [m/s] % Specify trim condition opspec = operspec('rct_airframeTRIM'); % Xe,Ze: known, not steady opspec.States(1).Known = [1;1]; opspec.States(1).SteadyState = [0;0]; % u,w: known, w steady opspec.States(3).Known = [1 1]; opspec.States(3).SteadyState = [0 1]; % theta: known, not steady opspec.States(2).Known = 1; opspec.States(2).SteadyState = 0; % q: unknown, steady opspec.States(4).Known = 0; opspec.States(4).SteadyState = 1; % TRIM Options = findopOptions('DisplayReport','off'); op(ct) = findop('rct_airframeTRIM',opspec,Options); end % Linearize at trim conditions G = linearize('rct_airframeTRIM',op); G = reshape(G,[nA nV]); G.u = 'delta'; G.y = {'alpha' 'V' 'q' 'az' 'gamma' 'h'};
Это производит 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 рад/с (чтобы быть нечувствительными к шуму измерения).
% Note: The disturbance is injected at the az_ref location 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 = 59
Окончательное значение объединенной цели близко к 1, указывая, что все требования почти удовлетворяются. Визуализируйте получившиеся поверхности усиления.
% Get tuned gain surfaces TGS = getBlockParam(ST); % Plot gain surfaces clf subplot(221), viewSurf(TGS.Kp), title('Kp') subplot(222), viewSurf(TGS.Ki), title('Ki') subplot(223), viewSurf(TGS.Ka), title('Ka') subplot(224), viewSurf(TGS.Kg), title('Kg')
Сначала подтвердите настроенный автопилот при 45 условиях рейса, рассмотренных выше. Постройте ответ на ступенчатое изменение в углу курса полета и ответ на воздействие шага в отклонении лифта.
clf subplot(211), step(getIOTransfer(ST,'gamma_ref','gamma'),5), grid title('Tracking of step change in flight path angle') subplot(212), step(getIOTransfer(ST,'delta','az'),3), grid title('Rejection of step disturbance at plant input')
Ответы являются удовлетворительными при всех условиях рейса. Затем подтвердите автопилот против нелинейной модели корпуса. Сначала используйте writeBlockValue
, чтобы применить настраивающиеся результаты к модели Simulink. Это оценивает каждую формулу поверхности усиления в точках останова, заданных в двух блоках Перед поиском, и написало результат в соответствующем блоке Interpolation.
writeBlockValue(ST)
Теперь моделируйте производительность автопилота для маневра, который берет корпус через значительную часть его конверта рейса. Код ниже эквивалентен нажатию кнопки воспроизведения в модели Simulink и осмотре ответов в блоках Scope.
% Initial conditions h_ini = 1000; alpha_ini = 0; v_ini = 700; % Simulate 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(211) 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(212) plot(t,Sim_delta.Values.Data), grid title('Elevator deflection \delta in degrees')
subplot(211) plot(t,Sim_alpha.Values.Data), grid title('Incidence \alpha in degrees') subplot(212) plot(t,Sim_V.Values.Data), grid title('Speed V in m/s')
subplot(211) plot(t,Sim_h.Values.Data), grid title('Altitude h in meters') subplot(212) 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 м.
Нелинейные результаты симуляции подтверждают, что запланированный на усиление автопилот поставляет последовательно высокую производительность в конверте рейса. "Поверхность усиления настраивающаяся" процедура обеспечивает простые явные формулы для зависимости усиления от переменных планирования. Вместо того, чтобы использовать интерполяционные таблицы, можно использовать эти формулы непосредственно для более эффективной памятью аппаратной реализации.
rmpath(fullfile(matlabroot,'examples','control','main')) % remove example data
setBlockParam
| slTuner
| tunableSurface