В этом примере показано, как использовать slTuner и systune настроить многоконтурный контроллер для винтокрыла.
Этот пример использует модель вертолета с 8 состояниями при наводящем условии для обрезки. Вектор состояния x = [u,w,q,theta,v,p,phi,r] состоит из
Продольная скорость u (m/s)
Поперечная скорость v (m/s)
Нормальная скорость w (m/s)
Угол тангажа theta (градус)
Крен phi (градус)
Уровень крена p (градус/с)
Уровень тангажа q (градус/с)
Уровень рыскания r (градус/с).
Контроллер генерирует команды ds,dc,dT в градусах для продольного циклического, циклического бокового, и ротор хвоста коллективные измерения использования theta, phiPQ, и r.
Следующая модель Simulink изображает архитектуру управления:
open_system('rct_helico')

Система управления состоит из двух контуров обратной связи. Внутренний цикл (статическая выходная обратная связь) обеспечивает повышение стабильности и разъединение. Внешний контур (ПИ-контроллеры) обеспечивает желаемую эффективность отслеживания заданного значения. Основные цели управления следующие:
Отследите изменения заданного значения в theta, phi, и r с нулевой установившейся ошибкой, временами нарастания приблизительно 2 секунд, минимального перерегулирования и минимальной перекрестной связи
Ограничьте полосу пропускания управления, чтобы принять меры против заброшенной высокочастотной динамики ротора и шума измерения
Обеспечьте сильные многомерные запасы по амплитуде и фазе (робастность к одновременным изменениям усиления/фазы при вводах и выводах объекта, смотрите diskmargin для деталей).
Мы используем фильтры lowpass с сокращением на уровне 40 рад/с, чтобы частично осуществить вторую цель.
Можно совместно настроить внутренние циклы и внешние контуры с systune команда. Эта команда только требует моделей объекта и контроллера наряду с желаемой полосой пропускания (который является функцией желаемого времени отклика). Когда система управления моделируется в Simulink, можно использовать slTuner взаимодействуйте через интерфейс, чтобы быстро настроить настраивающуюся задачу. Создайте экземпляр этого интерфейса со списком блоков, которые будут настроены.
ST0 = slTuner('rct_helico',{'PI1','PI2','PI3','SOF'});
Каждый настраиваемый блок автоматически параметрируется согласно его типу и инициализируется своим значением в модели Simulink (
для ПИ-контроллеров и нуля для статического усиления выходной обратной связи). Симуляция модели показывает, что система управления нестабильна для этих начальных значений:

Отметьте представляющие интерес сигналы ввода-вывода для отслеживания заданного значения и идентифицируйте вводы и выводы объекта (управление и сигналы измерения), где запас устойчивости измеряется.
addPoint(ST0,{'theta-ref','phi-ref','r-ref'}) % setpoint commands
addPoint(ST0,{'theta','phi','r'}) % corresponding outputs
addPoint(ST0,{'u','y'});
Наконец, получите конструктивные требования с помощью TuningGoal объекты. Мы используем следующие требования для этого примера:
Отслеживание требования: ответ theta, phiR продвигаться команды theta_ref, phi_refrref должен напомнить разъединенный ответ первого порядка с константой с одним вторым разом
Запасы устойчивости: многомерные запасы по амплитуде и фазе на объекте вводят u и объект выходные параметры y должны быть по крайней мере 5 дБ и 40 градусов
Быстрая динамика: величина полюсов с обратной связью не должна превышать 25, чтобы предотвратить быструю динамику и судорожные переходные процессы
% Less than 20% mismatch with reference model 1/(s+1) TrackReq = TuningGoal.StepTracking({'theta-ref','phi-ref','r-ref'},{'theta','phi','r'},1); TrackReq.RelGap = 0.2; % Gain and phase margins at plant inputs and outputs MarginReq1 = TuningGoal.Margins('u',5,40); MarginReq2 = TuningGoal.Margins('y',5,40); % Limit on fast dynamics MaxFrequency = 25; PoleReq = TuningGoal.Poles(0,0,MaxFrequency);
Можно теперь использовать systune совместно настроить все параметры контроллера. Это возвращает настроенную версию ST1 из системы управления ST0.
AllReqs = [TrackReq,MarginReq1,MarginReq2,PoleReq]; ST1 = systune(ST0,AllReqs);
Final: Soft = 1.12, Hard = -Inf, Iterations = 71
Окончательное значение близко к 1, таким образом, требования почти удовлетворяются. Постройте настроенные ответы на команды шага в theta, phi, r:
T1 = getIOTransfer(ST1,{'theta-ref','phi-ref','r-ref'},{'theta','phi','r'});
step(T1,5)

Время нарастания составляет приблизительно две секунды без перерегулирования и мало перекрестной связи. Можно использовать viewGoal для более полной валидации каждого требования, включая визуальную оценку многомерных запасов устойчивости (см. diskmargin для деталей):
figure('Position',[100,100,900,474])
viewGoal(AllReqs,ST1)

Смотрите настроенные значения ПИ-контроллеров и статического усиления выходной обратной связи.
showTunable(ST1)
Block 1: rct_helico/PI1 =
1
Kp + Ki * ---
s
with Kp = 1.04, Ki = 2.07
Name: PI1
Continuous-time PI controller in parallel form.
-----------------------------------
Block 2: rct_helico/PI2 =
1
Kp + Ki * ---
s
with Kp = -0.0994, Ki = -1.35
Name: PI2
Continuous-time PI controller in parallel form.
-----------------------------------
Block 3: rct_helico/PI3 =
1
Kp + Ki * ---
s
with Kp = 0.138, Ki = -2.2
Name: PI3
Continuous-time PI controller in parallel form.
-----------------------------------
Block 4: rct_helico/SOF =
D =
u1 u2 u3 u4 u5
y1 2.214 -0.3123 -0.003393 0.7855 -0.01528
y2 -0.1918 -1.293 0.01821 -0.08494 -0.1195
y3 -0.02143 -0.01528 -1.897 -0.002676 0.06789
Name: SOF
Static gain.
Можно задаться вопросом, необходима ли статическая выходная обратная связь и не ли ПИД-регуляторов достаточно, чтобы управлять вертолетом. На этот вопрос легко отвечают путем перенастройки контроллера с открытым внутренним циклом. Сначала повредите внутренний цикл путем добавления цикла, открывающегося после SOF блок:
addOpening(ST0,'SOF')
Затем удалите SOF блок из настраиваемого черного списка и повторно параметрирует блоки PI как полноценный PIDs с правильными знаками цикла (как выведено из первого проекта).
PID = pid(0,0.001,0.001,.01); % initial guess for PID controllers removeBlock(ST0,'SOF'); setBlockParam(ST0,... 'PI1',tunablePID('C1',PID),... 'PI2',tunablePID('C2',-PID),... 'PI3',tunablePID('C3',-PID));
Повторно настройте эти три ПИД-регулятора и постройте переходные процессы с обратной связью.
ST2 = systune(ST0,AllReqs);
Final: Soft = 4.94, Hard = -Inf, Iterations = 67
T2 = getIOTransfer(ST2,{'theta-ref','phi-ref','r-ref'},{'theta','phi','r'});
figure, step(T2,5)

Окончательное значение больше не близко к 1, и переходные процессы подтверждают более плохую эффективность относительно времени нарастания, перерегулирования и разъединения. Это предполагает, что внутренний цикл оказывает важное влияние стабилизации, которое должно быть сохранено.
systune (slTuner) | slTuner | TuningGoal.StepTracking | TuningGoal.Margins | TuningGoal.Poles