Этот пример использует systune
, чтобы управлять инвертированным маятником на корзине.
Блок корзины/маятника изображен в рисунке 1 и смоделирован в Simulink с помощью Simscape Multibody.
Рисунок 1: Инвертированный маятник на корзине
Рисунок 2: модель Simscape Multibody
Этой системой управляют путем проявления переменной силы на корзине. Мы должны сохранить маятник вертикально при перемещении корзины в новое положение или когда маятник пошагово перемещают вперед (импульсное воздействие).
Вертикальное положение является неустойчивым равновесием для инвертированного маятника. Нестабильный характер объекта делает задачу управления более сложной. В данном примере мы используем следующую управляющую структуру 2D цикла:
open_system(fullfile(matlabroot,'examples','control','rct_pendulum.slx')) set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','off');
Внутренний цикл использует контроллер пространства состояний второго порядка, чтобы стабилизировать маятник в его вертикальном положении (управление), в то время как внешний цикл использует контроллер Пропорциональной Производной (PD), чтобы управлять положением корзины. Обратите внимание на то, что мы используем PD, а не ПИД-регулятор, потому что объект уже обеспечивает некоторое интегральное действие.
Используйте требования TuningGoal
, чтобы задать желаемое поведение с обратной связью. Задайте время отклика в 3 секунды для того, чтобы отследить изменение заданного значения в положении корзины.
% Tracking of x command req1 = TuningGoal.Tracking('xref','x',3);
Чтобы соответственно отклонить импульсные воздействия на совете маятника, используйте штраф LQR формы
это подчеркивает маленькое угловое отклонение и ограничивает усилие по управлению.
% 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 и, соответственно). Можно использовать 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.36, Hard = 0.9993, Iterations = 385 Final: Soft = 1.44, Hard = 0.99762, Iterations = 127 Final: Soft = 1.27, Hard = 0.99796, Iterations = 300 Final: Soft = 1.27, Hard = 0.9992, Iterations = 254 Final: Soft = 1.44, Hard = 0.99937, Iterations = 236 Final: Soft = 1.26, Hard = 0.99984, Iterations = 314
Лучший проект достигает значения близко к 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.64, Kd = 1.65, Tf = 0.0489 Name: Position_Controller Continuous-time PDF controller in parallel form.
C2 = zpk(getBlockValue(ST,'Angle Controller'))
C2 = -1611.9 (s+13.19) (s+4.042) --------------------------- (s+135) (s-14.41) 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);