Управление инвертированного маятника на тележке

Этот пример использует systune управлять инвертированным маятником на тележке.

Блок маятника/Тележки

Блок тележки/маятника изображен в рисунке 1 и смоделирован в Simulink с помощью Simscape Multibody.

Рисунок 1: Инвертированный маятник на тележке

Рисунок 2: модель Simscape Multibody

Этой системой управляют путем порождения переменной силы$F$ на тележку. Мы должны сохранить маятник вертикально при перемещении тележки в новое положение или когда маятник пошагово перемещают вперед (импульсное воздействие$dF$).

Управляющая структура

Вертикальное положение является неустойчивым равновесием для инвертированного маятника. Нестабильный характер объекта делает задачу управления более сложной. В данном примере мы используем следующую управляющую структуру 2D цикла:

open_system('rct_pendulum.slx')
set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','off');

Внутренний цикл использует контроллер пространства состояний второго порядка, чтобы стабилизировать маятник в его вертикальном положении$\theta$ (управление), в то время как внешний контур использует контроллер Пропорциональной Производной (PD), чтобы управлять положением тележки. Обратите внимание на то, что мы используем PD, а не ПИД-регулятор, потому что объект уже обеспечивает некоторое интегральное действие.

Конструктивные требования

Используйте TuningGoal требования, чтобы задать желаемое поведение с обратной связью. Задайте время отклика в 3 секунды для того, чтобы отследить изменение заданного значения в положении тележки$x$.

% Tracking of x command
req1 = TuningGoal.Tracking('xref','x',3);

Чтобы соответственно отклонить импульсные воздействия$dF$ на совете маятника, используйте штраф LQR формы

$$ \int_0^\infty (16 \theta^2(t) + x^2(t) + 0.01 F^2(t)) dt $$

это подчеркивает маленькое угловое отклонение$\theta$ и ограничивает усилие по управлению$F$.

% Rejection of impulse disturbance dF
Qxu = diag([16 1 0.01]);
req2 = TuningGoal.LQG('dF',{'Theta','x','F'},1,Qxu);

Для робастности потребуйте по крайней мере 6 дБ запаса по амплитуде и 40 градусов запаса по фазе во входе объекта.

% Stability margins
req3 = TuningGoal.Margins('F',6,40);

Наконец, ограничьте затухание и собственную частоту полюсов с обратной связью предотвращать вяленое мясо или underdamped переходные процессы.

% Pole locations
MinDamping = 0.5;
MaxFrequency = 45;
req4 = TuningGoal.Poles(0,MinDamping,MaxFrequency);

Настройка системы управления

Система с обратной связью нестабильна для начальных значений PD и контроллеров пространства состояний (1 и$2/s$, соответственно). Можно использовать systune совместно настроить эти два контроллера. Используйте slTuner интерфейс, чтобы задать настраиваемые блоки и указать вход F объекта как аналитическая точка для измерения запасов устойчивости.

ST0 = slTuner('rct_pendulum',{'Position Controller','Angle Controller'});
addPoint(ST0,'F');

Затем используйте systune чтобы настроить PD и контроллеры пространства состояний подвергают требованиям к производительности, заданным выше. Оптимизируйте отслеживание и эффективность подавления помех (мягкие требования) удовлетворяющий запасам устойчивости и ограничениям местоположения полюса (трудные требования).

rng(0)
Options = systuneOptions('RandomStart',5);
[ST, fSoft] = systune(ST0,[req1,req2],[req3,req4],Options);
Final: Soft = 1.37, Hard = 0.99937, Iterations = 243
Final: Soft = 1.44, Hard = 0.99931, Iterations = 156
Final: Soft = 1.44, Hard = 0.99835, Iterations = 287
Final: Soft = 1.28, Hard = 0.99892, Iterations = 272
Final: Soft = 1.44, Hard = 0.99987, Iterations = 321
Final: Soft = 1.4, Hard = 0.99952, Iterations = 244

Лучший проект достигает значения близко к 1 для мягких требований при удовлетворении трудным требованиям (Hard<1). Это означает, что настроенная система управления почти достигает целевой эффективности для отслеживания и подавления помех при удовлетворении запасам устойчивости и ограничениям местоположения полюса.

Валидация

Используйте viewGoal далее анализировать как лучшие тарифы проекта против каждого требования.

figure('Position',[100   100   575   660]);
viewGoal([req1,req3,req4],ST)

Эти графики подтверждают, что первым двум требованиям почти удовлетворяют, в то время как последние два строго осуществляются. Затем постройте ответы на ступенчатое изменение в положении и к импульсу силы на тележке.

T = getIOTransfer(ST,{'xref','dF'},{'x','Theta'});
figure('Position',[100   100   650   420]);
subplot(121), step(T(:,1),10)
title('Tracking of set point change in position')
subplot(122), impulse(T(:,2),10)
title('Rejection of impulse disturbance')

Ответы являются гладкими с желаемыми временами урегулирования. Смотрите настроенные значения контроллеров.

C1 = getBlockValue(ST,'Position Controller')
C1 =
 
               s    
  Kp + Kd * --------
             Tf*s+1 

  with Kp = 5.89, Kd = 2.01, Tf = 0.0336
 
Name: Position_Controller
Continuous-time PDF controller in parallel form.

C2 = zpk(getBlockValue(ST,'Angle Controller'))
C2 =
 
  -1072.1 (s+13.72) (s+3.992)
  ---------------------------
      (s+102.4) (s-11.93)
 
Name: Angle_Controller
Continuous-time zero/pole/gain model.

Обратите внимание на то, что у углового контроллера есть нестабильный полюс, который разделяет на пары с объектом нестабильный полюс, чтобы стабилизировать инвертированный маятник. Чтобы видеть это, получите передачу разомкнутого контура во входе объекта и постройте корневой годограф.

L = getLoopTransfer(ST,'F',-1);
figure;
rlocus(L)
set(gca,'XLim',[-25 20],'YLim',[-20 20])

Чтобы завершить валидацию, загрузите настроенные значения на Simulink и симулируйте нелинейный ответ блока тележки/маятника. Видео получившейся симуляции появляется ниже.

writeBlockValue(ST)

Рисунок 3: симуляция тележки/маятника с настроенными контроллерами.

Закройте модель после симуляции.

set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','on');
close_system('rct_pendulum',0);