Этот пример использует запланированный на усиление образцовый прогнозирующий контроллер, чтобы управлять инвертированным маятником на корзине.
Этот пример требует, чтобы программное обеспечение Simulink® Control Design™ задало структуру MPC путем линеаризации нелинейной модели Simulink.
if ~mpcchecktoolboxinstalled('slcontrol') disp('Simulink Control Design is required to run this example.') return end
Добавьте папку в качестве примера в путь MATLAB®.
addpath(fullfile(matlabroot,'examples','mpc','main'));
Объект для этого примера является следующим блоком корзины/маятника, где x является положением корзины, и тета является углом маятника.
Этой системой управляют путем проявления переменной силы F на корзине. Контроллер должен сохранить маятник вертикально при перемещении корзины в новое положение или когда маятник пошагово перемещает вперед импульсное воздействие dF примененный в верхнем конце инвертированного маятника.
Этот объект моделируется в Simulink с обычно используемыми блоками.
mdlPlant = 'mpc_pendcartPlant'; load_system(mdlPlant) open_system([mdlPlant '/Pendulum and Cart System'],'force')
Примите следующие начальные условия для блока корзины/маятника:
Корзина является стационарной в x = 0
.
Инвертированный маятник является стационарным в вертикальной тете положения = 0
.
Цели управления:
Корзина может быть перемещена в новое положение между -15
и 15
с изменением заданного значения шага.
При отслеживании такого изменения заданного значения время нарастания должно составить меньше чем 4 секунды (для производительности), и перерегулирование должно быть меньше, чем процент 5
(для робастности).
Когда импульсное воздействие значения 2
применяется к маятнику, корзина должна возвратить в ее исходное положение смещение имеющее 1
. Маятник должен также возвратиться к вертикальному положению с пиковым угловым смещением степеней 15
(радиан 0.26
).
Вертикальное положение является неустойчивым равновесием для инвертированного маятника, который делает задачу управления более сложной.
В Управлении Инвертированного Маятника на Корзине один контроллер MPC может переместить корзину в новое положение между-10 и 10. Однако, если вы увеличиваете изменение заданного значения шага в 15, маятнику не удается восстановить его вертикальное положение во время перехода.
Чтобы достигнуть более долгого расстояния в том же времени нарастания, контроллер прикладывает больше силы к корзине вначале. В результате маятник перемещен от его вертикального положения большим углом, таким как степени 60
. Под такими углами движущие силы объекта значительно отличаются от прогнозирующей модели LTI, полученной в тете = 0
. В результате ошибки в прогнозе поведения объекта превышают то, что может обработать встроенная робастность MPC, и диспетчеру не удается выполнить правильно.
Простое обходное решение, чтобы избежать падения маятника должно ограничить смещение маятника путем добавления мягких выходных ограничений в тету и сокращения веса ECR на ограничительном смягчении.
mpcobj.OV(2).Min = -pi/2; mpcobj.OV(2).Max = pi/2; mpcobj.Weights.ECR = 100;
Однако с этими новыми настройками контроллера более не возможно достигнуть более долгого расстояния в необходимом времени нарастания. Другими словами, производительность контроллера принесена в жертву, чтобы избежать нарушения мягких выходных ограничений.
Чтобы переместить корзину в новое положение между-15 и 15 при поддержании того же времени нарастания, у контроллера должны быть более точные модели под различными углами так, чтобы диспетчер мог использовать их для лучшего прогноза. Запланированный на усиление MPC позволяет вам решать нелинейную проблему управления путем разработки нескольких контроллеров MPC в различных рабочих точках и переключения между ними во время выполнения.
В данном примере используйте один контроллер MPC с:
Одна переменная, которой управляют: Переменная сила F.
Два измеренных выходных параметров: положение x Корзины и угловая тета маятника.
Одно неизмеренное воздействие: Импульсное воздействие dF.
mdlMPC = 'mpc_pendcartGSMPC';
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');
Создайте спецификации для следующих трех рабочих точек, где и корзина и маятник являются стационарными:
Маятник в 80 градусах, указывая право (тета = -4*pi/9
)
Маятник является вертикальным (тета = 0
)
Маятник в 80 градусах, указывая оставленный (тета = 4*pi/9
)
angles = [-4*pi/9 0 4*pi/9];
for ct=1:length(angles)
Создайте спецификацию рабочей точки.
opspec(ct) = operspec(mdlPlant);
Первое состояние является положением x корзины.
opspec(ct).States(1).Known = true; opspec(ct).States(1).x = 0;
Второе состояние является скоростью корзины x_dot (не в устойчивом состоянии).
opspec(ct).States(2).SteadyState = false;
Третье состояние является угловой тетой маятника.
opspec(ct).States(3).Known = true; opspec(ct).States(3).x = angles(ct);
Четвертое состояние является угловой скоростью theta_dot (не в устойчивом состоянии).
opspec(ct).States(4).SteadyState = false;
end
Вычислите рабочие точки с помощью этих спецификаций.
options = findopOptions('DisplayReport',false);
[op,opresult] = findop(mdlPlant,opspec,options);
Получите линейную модель объекта управления в заданных рабочих точках.
plants = linearize(mdlPlant,op,io);
bdclose(mdlPlant)
В каждой рабочей точке разработайте контроллер MPC с соответствующей линейной моделью объекта управления.
status = mpcverbosity('off'); for ct=1:length(angles)
Получите одну модель объекта управления.
plant = plants(:,:,ct); plant.InputName = {'dF'; 'F'}; plant.OutputName = {'x'; 'theta'};
Объект имеет два входных параметров, dF и F, и два выходных параметров, x и тету. В этом примере dF задан как неизмеренное воздействие, используемое контроллером MPC для прогноза. Установите типы сигнала объекта.
plant = setmpcsignals(plant,'ud',1,'mv',2);
Чтобы управлять нестабильным объектом, шаг расчета контроллера не может быть слишком большим (плохое подавление помех) или слишком маленьким (чрезмерная загрузка вычисления). Точно так же горизонт прогноза не может быть слишком длинным (объект, над которым нестабильный режим доминировал бы), или слишком короткий (ограничительные нарушения будут непредвидены). Используйте следующие параметры для этого примера:
Ts = 0.01; PredictionHorizon = 50; ControlHorizon = 5; mpcobj = mpc(plant,Ts,PredictionHorizon,ControlHorizon);
Задайте номинальные значения ввода и вывода на основе рабочей точки.
mpcobj.Model.Nominal.Y = [0;opresult(ct).States(3).x]; mpcobj.Model.Nominal.X = [0;0;opresult(ct).States(3).x;0]; mpcobj.Model.Nominal.DX = [0;opresult(ct).States(2).dx;0;opresult(ct).States(4).dx];
Существует ограничение на то, сколько силы мы можем обратиться к корзине, которая задана как трудные ограничения на переменную F, которой управляют.
mpcobj.MV.Min = -200; mpcobj.MV.Max = 200;
Это - хорошая практика, чтобы масштабировать вводы и выводы объекта прежде, чем разработать веса. В этом случае, поскольку область значений переменной, которой управляют, больше, чем область значений объекта выходные параметры двумя порядками величины, масштабируйте вход MV 100.
mpcobj.MV.ScaleFactor = 100;
Чтобы улучшить робастность контроллера, увеличьте вес на скорости изменения мВ от 0.1
до 1
.
mpcobj.Weights.MVRate = 1;
Чтобы достигнуть сбалансированной производительности, настройте веса на объекте выходные параметры. Первый вес сопоставлен с положением x корзины, и второй вес сопоставлен с угловой тетой.
mpcobj.Weights.OV = [1.2 1];
Чтобы достигнуть более агрессивного подавления помех, увеличьте усиление средства оценки состояния путем умножения усилений возмущения по умолчанию на фактор 10
.
Обновите входное возмущение.
disturbance_model = getindist(mpcobj);
setindist(mpcobj,'model',disturbance_model*10);
Обновите выходное возмущение.
disturbance_model = getoutdist(mpcobj);
setoutdist(mpcobj,'model',disturbance_model*10);
Сохраните контроллер MPC в рабочее пространство MATLAB.
assignin('base',['mpc' num2str(ct)],mpcobj);
end
mpcverbosity(status);
Подтвердите проект MPC с симуляцией с обратной связью в Simulink.
open_system([mdlMPC '/Scope'])
sim(mdlMPC)
-->Converting model to discrete time. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
В нелинейной симуляции успешно достигаются все цели управления.
Удалите папку в качестве примера из пути MATLAB и близкую модель Simulink.
rmpath(fullfile(matlabroot,'examples','mpc','main')); bdclose(mdlMPC)