В этом примере показано, как использовать 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
, phi
P
Q
, и 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
, phi
R
продвигаться команды theta_ref
, phi_ref
rref
должен напомнить разъединенный ответ первого порядка с константой с одним вторым разом
Запасы устойчивости: многомерные запасы по амплитуде и фазе на объекте вводят 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 = 73
Окончательное значение близко к 1, таким образом, требования почти удовлетворяются. Постройте настроенные ответы на команды шага в тете, 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.05, Ki = 2.08 Name: PI1 Continuous-time PI controller in parallel form. ----------------------------------- Block 2: rct_helico/PI2 = 1 Kp + Ki * --- s with Kp = -0.105, Ki = -1.35 Name: PI2 Continuous-time PI controller in parallel form. ----------------------------------- Block 3: rct_helico/PI3 = 1 Kp + Ki * --- s with Kp = 0.131, 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.218 -0.3119 -0.003341 0.786 -0.01519 y2 -0.1897 -1.28 0.01844 -0.08337 -0.1191 y3 -0.01849 -0.0073 -1.891 0.002557 0.06633 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 = 66
T2 = getIOTransfer(ST2,{'theta-ref','phi-ref','r-ref'},{'theta','phi','r'}); figure, step(T2,5)
Окончательное значение больше не близко к 1, и переходные процессы подтверждают более плохую производительность относительно времени нарастания, перерегулирования и разъединения. Это предполагает, что внутренний цикл оказывает важное влияние стабилизации, которое должно быть сохранено.
TuningGoal.Margins
| TuningGoal.Poles
| TuningGoal.StepTracking
| slTuner
| systune (slTuner)