Этот пример использует systune
чтобы сгенерировать графики плавного усиления для автопилота с тремя циклами.
Этот пример использует модель трех степеней свободы динамики оси тангажа планера. Состояниями являются координаты Земли, координаты тела, угол тангажа и скорость тангажа. На следующем рисунке суммируется отношение между инерционной системой координат и каркасами кузова, угол траектории полета, угол падения и угол тангажа.
Мы используем классическую трехконтурную структуру автопилота, чтобы контролировать угол угла тангажа. Этот автопилот настраивает угол тангажа, доставляя адекватные пакеты нормального ускорения (ускорения вдоль). В свою очередь, нормальное ускорение создается путем регулировки отклонения лифта, чтобы вызвать наклон и изменить величину подъема. Автопилот использует Пропорционально-Интегральное (PI) управление в цикле скорости тангажа и пропорциональное управление в циклах и. Система с обратной связью (планер и автопилот) моделируются в Simulink.
open_system('rct_airframeGS')
Динамика планера нелинейна, и аэродинамические силы и моменты зависят от скорости и частоты падения. Чтобы получить подходящую эффективность на протяжении всей огибающей рейса, коэффициент усиления автопилота должен быть скорректирован как функция и чтобы компенсировать изменения в динамике объекта. Этот процесс корректировки называется «табличным управлением» и называется переменными планирования. В модели Simulink графики усиления реализованы как интерполяционные таблицы, управляемые измерениями и.
Табличное управление является линейным методом для управления нелинейными или изменяющимися во времени объектами. Идея состоит в том, чтобы вычислить линейные приближения объекта при различных рабочих условиях, настроить коэффициент усиления контроллера при каждом рабочем состоянии и изменить коэффициент усиления как функцию от рабочего состояния во время работы. Обычное табличное управление включает в себя следующие три основных этапа.
Обрезка и линеаризация объекта при каждом рабочем условии
Настройка коэффициентов усиления контроллера для линеаризированной динамики при каждом рабочем условии
Согласование значений усиления для обеспечения плавного перехода между рабочими условиями.
В этом примере вы комбинируете шаги 2 и 3, параметрируя коэффициент усиления автопилота как полиномы первого порядка и непосредственно настраивая полиномиальные коэффициенты для всей огибающей рейса. Этот подход устраняет шаг 3 и гарантирует плавность изменений усиления как функцию и. Кроме того, коэффициенты графика усиления могут автоматически настраиваться с помощью systune
.
Предположим, что заболеваемость варьируется от -20 до 20 степени и что скорость варьируется от 700 до 1400 м/с. При пренебрежении гравитацией динамика планера симметрична в. Поэтому учитывайте только положительные значения. Используйте сетку 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
для вычисления значений обрезки и, и линеаризации динамики планера для результирующих рабочих точек. Для получения дополнительной информации смотрите Обрезка и Линеаризация планера (Simulink Control Design). Повторите эти шаги для 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 o и = 1050 м/с (проект среднего уровня).
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. Это оценивает каждую формулу поверхности усиления в точках останова, заданных в двух блоках Prelookup, и записывает результат в соответствующий блок Interpolation.
writeBlockValue(ST)
Симулируйте эффективность автопилота для маневра, который принимает планер через большой фрагмент его рейса огибающей. Приведенный ниже код эквивалентен нажатию кнопки Play в модели 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] для). И в то время как автопилот был настроен на номинальную высоту 3000 м, он хорошо оплачивается для изменения высоты от 1000 до 10 000 м.
Нелинейные результаты симуляции подтверждают, что запланированный по усилению автопилот обеспечивает стабильно высокую эффективность на протяжении всей огибающей рейса. Процедура «настройки поверхности усиления» предоставляет простые явные формулы для зависимости усиления от переменных планирования. Вместо использования интерполяционных таблиц можно использовать эти формулы непосредственно для более эффективной для памяти аппаратной реализации.
tunableSurface
| setBlockParam
(Simulink Control Design) | slTuner
(Simulink Control Design)