Явное MPC управление инвертированным маятником на тележке

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

Требование к продукту

Этот пример требует, чтобы программное обеспечение Simulink® Control Design™ задало структуру MPC путем линеаризации нелинейной модели Simulink.

if ~mpcchecktoolboxinstalled('slcontrol')
    disp('Simulink Control Design is required to run this example.')
    return
end

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

Объект для этого примера является следующим блоком тележки/маятника, где x является положением тележки, и theta является углом маятника.

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

Этот объект моделируется в Simulink с обычно используемыми блоками.

mdlPlant = 'mpc_pendcartPlant';
load_system(mdlPlant)
open_system([mdlPlant '/Pendulum and Cart System'],'force')

Управляйте целями

Примите следующие начальные условия для блока тележки/маятника:

  • Тележка является стационарной в x = 0.

  • Инвертированный маятник является стационарным в вертикальной theta положения = 0.

Цели управления:

  • Тележка может быть перемещена в новое положение между -10 и 10 с изменением заданного значения шага.

  • При отслеживании такого изменения заданного значения время нарастания должно быть меньше 4 секунд (для эффективности), и перерегулирование должно быть меньше 5 процент (для робастности).

  • Когда импульсное воздействие величины 2 применяется к маятнику, тележка должна возвратить в ее исходное положение смещение имеющее 1. Маятник должен также возвратиться к вертикальному положению с пиковым угловым смещением 15 степени (0.26 радиан).

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

Структура управления

В данном примере используйте один контроллер MPC с:

  • Одна переменная, которой управляют: переменная сила F.

  • Два измеренных выходных параметров: положение x Тележки и угловая theta маятника.

  • Одно неизмеренное воздействие: Импульсное воздействие dF.

mdlMPC = 'mpc_pendcartExplicitMPC';
open_system(mdlMPC)

Несмотря на то, что скорость тележки x_dot и скорость вращения маятника theta_dot доступна от модели объекта управления, чтобы сделать случай проекта более реалистичным, они исключены как измерения MPC.

В то время как заданное значение положения тележки варьируется (вход шага), угловое заданное значение маятника является постоянным (0 = вертикальное положение).

Линейная модель объекта управления

Поскольку контроллер MPC требует модели объекта управления линейного независимого от времени (LTI) для предсказания, линеаризуйте модель объекта управления Simulink в начальной рабочей точке.

Задайте точки ввода и вывода линеаризации

io(1) = linio([mdlPlant '/dF'],1,'openinput');
io(2) = linio([mdlPlant '/F'],1,'openinput');
io(3) = linio([mdlPlant '/Pendulum and Cart System'],1,'openoutput');
io(4) = linio([mdlPlant '/Pendulum and Cart System'],3,'openoutput');

Создайте технические требования рабочей точки для начальных условий объекта.

opspec = operspec(mdlPlant);

Первое состояние является положением x тележки, которое имеет известное начальное состояние 0.

opspec.States(1).Known = true;
opspec.States(1).x = 0;

Третье состояние является угловой theta маятника, которая имеет известное начальное состояние 0.

opspec.States(3).Known = true;
opspec.States(3).x = 0;

Вычислите рабочую точку с помощью этих технических требований.

options = findopOptions('DisplayReport',false);
op = findop(mdlPlant,opspec,options);

Получите линейную модель объекта управления в заданной рабочей точке.

plant = linearize(mdlPlant,op,io);
plant.InputName = {'dF';'F'};
plant.OutputName = {'x';'theta'};

Исследуйте полюса линеаризовавшего объекта.

pole(plant)
ans =

         0
  -11.9115
   -3.2138
    5.1253

Объект имеет интегратор и нестабильный полюс.

bdclose(mdlPlant)

Традиционный (неявный) проект MPC

Объект имеет два входных параметров, dF и F, и два выходных параметров, x и theta. В этом примере dF задан как неизмеренное воздействие, используемое контроллером MPC для лучшего подавления помех. Установите типы сигнала объекта.

plant = setmpcsignals(plant,'ud',1,'mv',2);

Чтобы управлять нестабильным объектом, шаг расчета контроллера не может быть слишком большим (плохое подавление помех) или слишком маленьким (чрезмерная загрузка расчета). Точно так же горизонт предсказания не может быть слишком длинным (объект, над которым нестабильный режим доминировал бы), или слишком короткий (нарушения ограничений будут непредвидены). Используйте следующие параметры для этого примера:

Ts = 0.01;
PredictionHorizon = 50;
ControlHorizon = 5;
mpcobj = mpc(plant,Ts,PredictionHorizon,ControlHorizon);
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000.
-->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000.
-->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
   for output(s) y1 and zero weight for output(s) y2 

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

mpcobj.MV.Min = -200;
mpcobj.MV.Max = 200;

Это - хорошая практика, чтобы масштабировать вводы и выводы объекта прежде, чем спроектировать веса. В этом случае, поскольку область значений переменной, которой управляют, больше области значений объекта выходные параметры двумя порядками величины, масштабируйте вход MV 100.

mpcobj.MV.ScaleFactor = 100;

Чтобы улучшить робастность контроллера, увеличьте вес на скорости изменения мВ от 0.1 к 1.

mpcobj.Weights.MVRate = 1;

Чтобы достигнуть сбалансированной эффективности, настройте веса на объекте выходные параметры. Первый вес сопоставлен с положением x тележки, и второй вес сопоставлен с угловой theta.

mpcobj.Weights.OV = [1.2 1];

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

Обновите входное возмущение.

disturbance_model = getindist(mpcobj);
setindist(mpcobj,'model',disturbance_model*10);
-->Converting model to discrete time.
-->The "Model.Disturbance" property of "mpc" object is empty:
   Assuming unmeasured input disturbance #1 is integrated white noise.
   Assuming no disturbance added to measured output channel #1.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Обновите выходное возмущение.

disturbance_model = getoutdist(mpcobj);
setoutdist(mpcobj,'model',disturbance_model*10);
-->Converting model to discrete time.
   Assuming no disturbance added to measured output channel #1.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Явная генерация MPC

Простой неявный контроллер MPC, без потребности в ограничении или изменениях веса во времени выполнения, может быть преобразован в явный контроллер MPC с той же эффективностью управления. Ключевое преимущество использования Явного MPC - то, что это избегает оптимизации в реальном времени, и в результате подходит для промышленного применения тот спрос быстрый шаг расчета. Компромисс - то, что явный MPC имеет место верхней памяти, потому что оптимальные решения для всех выполнимых областей предварительно вычисляются оффлайн и хранятся для доступа во время выполнения.

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

range = generateExplicitRange(mpcobj);
range.State.Min(:) = -20;   % largest range comes from cart position x
range.State.Max(:) = 20;
range.Reference.Min = -20;  % largest range comes from cart position x
range.Reference.Max = 20;
range.ManipulatedVariable.Min = -200;
range.ManipulatedVariable.Max = 200;
-->Converting model to discrete time.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

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

mpcobjExplicit = generateExplicitMPC(mpcobj,range);

Regions found / unexplored:       92/       0

Чтобы использовать явный контроллер MPC в Simulink, задайте его в диалоговом окне блока Explicit MPC Controller в вашей модели Simulink.

Симуляция с обратной связью

Подтвердите проект MPC с симуляцией с обратной связью в Simulink.

open_system([mdlMPC '/Scope'])
sim(mdlMPC)

В нелинейной симуляции успешно достигаются все цели управления.

Соответствуя результатам Управления Инвертированного Маятника на Тележке, неявные и явные контроллеры MPC поставляют идентичную эффективность как ожидалось.

Обсуждение

Важно указать, что спроектированный контроллер MPC имеет свои ограничения. Например, если вы увеличиваете изменение заданного значения шага в 15, маятнику не удается восстановить его вертикальное положение во время перехода.

Чтобы достигнуть более долгого расстояния в том же времени нарастания, контроллер прикладывает больше силы к тележке вначале. В результате маятник перемещен от его вертикального положения большим углом, таким как 60 степени. Под такими углами движущие силы объекта значительно отличаются от прогнозной модели LTI, полученной в theta = 0. В результате ошибки в предсказании поведения объекта превышают то, что может обработать встроенная робастность MPC, и диспетчеру не удается выполнить правильно.

Простое обходное решение, чтобы избежать падения маятника должно ограничить смещение маятника путем добавления мягких выходных ограничений в theta и сокращения веса ECR на ограничительном смягчении.

mpcobj.OV(2).Min = -pi/2;
mpcobj.OV(2).Max = pi/2;
mpcobj.Weights.ECR = 100;

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

Чтобы достигнуть более долгих расстояний в том же времени нарастания, контроллеру нужны более точные модели под различным углом, чтобы улучшить предсказание. Запланированное на усиление MPC управление другого примера Инвертированным Маятником на Тележке показывает, как использовать табличное управление MPC, чтобы достигнуть более долгих расстояний.

Закройте модель Simulink.

bdclose(mdlMPC)

Похожие темы