Многоконтурное управление вертолета

Этот пример показывает, как использовать 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')

Система управления состоит из двух обратной связи. Внутренний цикл (статическая выходная обратная связь) обеспечивает повышение стабильности и разъединение. Внешний цикл (контроллеры PI) обеспечивает желаемую производительность отслеживания заданного значения. Основные цели управления следующие:

  • Отследите изменения заданного значения в theta, phi и r с нулевой установившейся ошибкой, временами нарастания приблизительно 2 секунд, минимального перерегулирования и минимальной перекрестной связи

  • Ограничьте пропускную способность управления, чтобы принять меры против заброшенной высокочастотной динамики ротора и шума измерения

  • Обеспечьте сильные многомерные запасы по амплитуде и фазе (робастность к одновременным изменениям усиления/фазы при вводах и выводах объекта, смотрите diskmargin для деталей).

Мы используем фильтры lowpass с сокращением на уровне 40 рад/с, чтобы частично осуществить вторую цель.

Контроллер, настраивающийся

Можно совместно настроить внутренние и внешние циклы с командой systune. Эта команда только требует моделей объекта и контроллера наряду с желаемой пропускной способностью (который является функцией желаемого времени отклика). Когда система управления моделируется в Simulink, можно использовать интерфейс slTuner, чтобы быстро настроить настраивающуюся задачу. Создайте экземпляр этого интерфейса со списком блоков, которые будут настроены.

ST0 = slTuner('rct_helico',{'PI1','PI2','PI3','SOF'});

Каждый настраиваемый блок автоматически параметризован согласно его типу и инициализирован с его значением в модели Simulink (для контроллеров PI и нуля для статического усиления выходной обратной связи). Симуляция модели показывает, что система управления нестабильна для этих начальных значений:

Отметьте представляющие интерес сигналы ввода-вывода для отслеживания заданного значения и идентифицируйте вводы и выводы объекта (управление и сигналы измерения), где запас устойчивости измеряется.

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, r_ref должен напомнить разъединенный ответ первого порядка с константой с одним вторым разом

  • Запасы устойчивости: многомерные запасы по амплитуде и фазе на объекте вводят 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.11, Hard = -Inf, Iterations = 118

Окончательное значение близко к 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)

Осмотрите настроенные значения контроллеров PI и статического усиления выходной обратной связи.

showTunable(ST1)
Block 1: rct_helico/PI1 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 1.1, Ki = 2.21
 
Name: PI1
Continuous-time PI controller in parallel form.

-----------------------------------

Block 2: rct_helico/PI2 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = -0.0849, Ki = -1.22
 
Name: PI2
Continuous-time PI controller in parallel form.

-----------------------------------

Block 3: rct_helico/PI3 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 0.143, Ki = -2.3
 
Name: PI3
Continuous-time PI controller in parallel form.

-----------------------------------

Block 4: rct_helico/SOF =
 
  D = 
              u1         u2         u3         u4         u5
   y1      2.353    -0.3504  -0.001659     0.8087    -0.0207
   y2    -0.1498     -1.146     0.0388   -0.04879    -0.1053
   y3   -0.01064   -0.01002     -1.997   -0.05561    0.03894
 
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, и переходные процессы подтверждают более плохую производительность относительно времени нарастания, перерегулирования и разъединения. Это предполагает, что внутренний цикл имеет важный эффект стабилизации, который должен быть сохранен.

Смотрите также

| | | |

Похожие темы