Этот пример использует systune
для управления инвертированным маятником на тележке.
Блок тележки/маятника изображен на фигуре 1 и смоделирован в Simulink ® с использованием Simscape™ Multibody™.
Фигура 1: Перевернутый маятник на тележке
Фигура 2: Модель Simscape Multibody
Управление этой системой осуществляется путем приложения переменной силы к тележке. Контроллер должен держать маятник вертикально, перемещая тележку в новое положение или когда маятник подталкивается вперед (импульсное нарушение порядка).
Вертикальное положение является нестабильным равновесием для перевернутого маятника. Нестабильная природа объекта делает задачу управления более сложной. В данном примере используется следующая двухконтурная структура управления:
open_system('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);
Наконец, ограничьте демпфирование и естественную частоту полюсов с обратной связью, чтобы предотвратить рывкообразные или недостаточно демпфированные переходные процессы.
% Pole locations
MinDamping = 0.5;
MaxFrequency = 45;
req4 = TuningGoal.Poles(0,MinDamping,MaxFrequency);
Система с обратной связью нестабильна для начальных значений ПД и контроллеров пространства состояний (1 и, соответственно). Можно использовать systune
совместно настроить эти два контроллера. Используйте slTuner
интерфейс для определения настраиваемых блоков и регистрации входных параметров объекта F
как точка анализа для измерения запасов устойчивости.
ST0 = slTuner('rct_pendulum',{'Position Controller','Angle Controller'}); addPoint(ST0,'F');
Далее используйте systune
настройка ПД и контроллеров пространства состояний в соответствии с указанными выше требованиями к эффективности. Оптимизируйте отслеживание и подавление помех эффективности (мягкие требования) с учетом ограничений по местоположению запасов устойчивости и шеста (жесткие требования).
rng(0)
Options = systuneOptions('RandomStart',5);
[ST, fSoft] = systune(ST0,[req1,req2],[req3,req4],Options);
Final: Soft = 1.36, Hard = 0.99983, Iterations = 244 Final: Soft = 1.44, Hard = 0.99921, Iterations = 138 Final: Soft = 1.44, Hard = 0.99955, Iterations = 311 Final: Soft = 1.26, Hard = 0.99808, Iterations = 270 Final: Soft = 1.44, Hard = 0.99998, Iterations = 266 Final: Soft = 1.27, Hard = 0.99673, Iterations = 236
Лучший проект достигает значения, близкого к 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.92, Kd = 1.95, Tf = 0.0513 Name: Position_Controller Continuous-time PDF controller in parallel form.
C2 = zpk(getBlockValue(ST,'Angle Controller'))
C2 = -1611.4 (s+12.86) (s+4.368) --------------------------- (s+135.1) (s-14.26) 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);