Этот пример использует объект и блок прогнозирующего контроллера нелинейной модели, чтобы достичь управления качанием и балансировкой инвертированного маятника на тележке.
Этот пример требует Optimization Toolbox™ программного обеспечения, чтобы предоставить решатель нелинейного программирования по умолчанию для нелинейного MPC, чтобы вычислить оптимальные перемещения управления на каждом контрольном интервале.
if ~mpcchecktoolboxinstalled('optim') disp('Optimization Toolbox is required to run this example.') return end
Объект для этого примера является маятником/тележкой, где z - положение тележки, а theta - угол маятника. Манипулированная переменная для этой системы является переменной силой F, действующей на тележку. Область значений силы находится между -100
и 100
. Импульсное нарушение порядка dF также может подтолкнуть маятник.
Примите следующие начальные условия для маятника/сборки тележки.
Тележка является стационарной в z = 0
.
Маятник находится в положении нисходящего равновесия, где theta = -pi
.
Целями управления являются:
Управление качанием: Первоначально качайте маятник до перевернутого положения равновесия, где z = 0
и theta = 0
.
Положение тележки отслеживания уставки: Переместите тележку в новое положение с изменением уставки шага, сохраняя маятник инвертированным.
Балансировка маятника: Когда импульсное нарушение порядка величины 2
применяется к перевернутому маятнику, сохраняет маятник сбалансированным и возвращает тележку в исходное положение.
Положение нисходящего равновесия стабильно, и положение инвертированного равновесия нестабильно, что делает управление качанием более сложным для одного линейного контроллера, с которым легко справляется нелинейный MPC.
В этом примере нелинейный контроллер MPC имеет следующее строение ввода-вывода.
Одна управляемая переменная: Переменная сила (F)
Два измеренных выхода: Положение тележки (z) и угол маятника (theta)
Два других состояния, скорость тележки (zdot) и скорость вращения маятника (thetadot), не поддаются измерению.
В то время как уставка положения тележки, z, может варьироваться, уставка угла маятника, theta, всегда 0
(инвертированное положение равновесия).
Создайте нелинейный контроллер MPC с соответствующими размерностями с помощью nlmpc
объект. В этом примере модель предсказания имеет 4
состояния, 2
выходы и 1
вход (MV).
nx = 4; ny = 2; nu = 1; nlobj = nlmpc(nx, ny, nu);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.
Модель предсказания имеет шаг расчета 0.1
секунд, что совпадает со шагом расчета контроллером.
Ts = 0.1; nlobj.Ts = Ts;
Установите горизонт предсказания равным 10
, что достаточно долго, чтобы захватить большую динамику на объекте, но не так долго, чтобы это вредит вычислительной эффективности.
nlobj.PredictionHorizon = 10;
Установите контрольный горизонт равным 5
, что достаточно долго, чтобы дать контроллеру достаточно степеней свободы, чтобы обрабатывать нестабильный режим, не вводя чрезмерных переменных принятия решений.
nlobj.ControlHorizon = 5;
Основным преимуществом нелинейного прогнозирующего управления моделью является то, что он использует нелинейную динамическую модель для предсказания поведения объекта в будущем в широкой области значений рабочих условий.
Эта нелинейная модель обычно является первой моделью принципа, состоящей из множества дифференциальных и алгебраических уравнений (ДАУ). В этом примере система тележки и маятника в дискретном времени определяется в pendulumDT0
функция. Эта функция интегрирует модель в непрерывном времени, pendulumCT0
, между контрольными интервалами с использованием многостадийного прямого метода Эйлера. Та же функция также используется нелинейным оценщиком состояния.
nlobj.Model.StateFcn = "pendulumDT0";
Чтобы использовать модель в дискретном времени, установите Model.IsContinuousTime
свойство контроллера, чтобы false
.
nlobj.Model.IsContinuousTime = false;
Модель предсказания использует необязательный параметр, Ts
, для представления шага расчета. Использование этого параметра означает, что, если вы измените шаг расчета предсказания во время проекта, вы не должны изменять pendulumDT0
файл.
nlobj.Model.NumberOfParameters = 1;
Два выхода объекта являются первым и третьим состояниями в модели, положением тележки и углом маятника, соответственно. Соответствующая выходная функция определяется в pendulumOutputFcn
функция.
nlobj.Model.OutputFcn = 'pendulumOutputFcn';
Наилучшей практикой является предоставление аналитических якобианских функций по возможности, поскольку они значительно улучшают скорость симуляции. В этом примере предоставьте якобиан для выходной функции, используя анонимную функцию.
nlobj.Jacobian.OutputFcn = @(x,u,Ts) [1 0 0 0; 0 0 1 0];
Поскольку вы не предоставляете Якобиан для функции состояния, нелинейный контроллер MPC оценивает функцию состояния Якобиан во время оптимизации с помощью численного возмущения. Это замедляет симуляцию до некоторой степени.
Как и линейный MPC, нелинейный MPC решает ограниченную задачу оптимизации на каждом контрольном интервале. Однако, поскольку модель объекта управления является нелинейной, нелинейный MPC преобразует оптимальную задачу управления в нелинейную задачу оптимизации с нелинейной функцией затрат и нелинейными ограничениями.
Функция затрат, используемая в этом примере, является такой же функцией стандартных затрат, используемой линейным MPC, где применяются выходные отслеживания уставки и манипулируемое подавление перемещения. Поэтому задайте стандартные веса настройки MPC.
nlobj.Weights.OutputVariables = [3 3]; nlobj.Weights.ManipulatedVariablesRate = 0.1;
Положение тележки ограничено областью значений -10
на 10
.
nlobj.OV(1).Min = -10; nlobj.OV(1).Max = 10;
Сила имеет область значений между -100
и 100
.
nlobj.MV.Min = -100; nlobj.MV.Max = 100;
После разработки нелинейного объекта контроллера MPC лучшей практики проверить функции, которые вы определили для модели предсказания, функции состояния, выходной функции, пользовательских затрат и пользовательских ограничений, а также их якобианов. Для этого используйте validateFcns
команда. Эта функция обнаруживает любые размерные и числовые несоответствия в этих функциях.
x0 = [0.1;0.2;-pi/2;0.3]; u0 = 0.4; validateFcns(nlobj,x0,u0,[],{Ts});
Model.StateFcn is OK. Model.OutputFcn is OK. Jacobian.OutputFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.
В этом примере могут быть измерены только два состояния объекта (положение тележки и угол маятника). Поэтому вы оцениваете четыре состояния объекта с помощью расширенного фильтра Калмана. Его функция перехода к состоянию задана в pendulumStateFcn.m
и его функция измерения определена в pendulumMeasurementFcn.m
.
EKF = extendedKalmanFilter(@pendulumStateFcn, @pendulumMeasurementFcn);
Задайте начальные условия для симуляций путем установки начального состояния объекта и выходных значений. Кроме того, задайте начальное состояние расширенного фильтра Калмана.
Начальные условия областей симуляции следуют.
Тележка является стационарной в z = 0.
Маятник находится в положении нисходящего равновесия, theta = -pi
.
x = [0;0;-pi;0]; y = [x(1);x(3)]; EKF.State = x;
mv
- оптимальный ход управления, вычисленный на любом контрольном интервале. Инициализация mv
в ноль, поскольку сила, приложенная к тележке, равна нулю в начале.
mv = 0;
На первом этапе симуляции маятник качается вверх из положения нисходящего равновесия в положение инвертированного равновесия. Все ссылки на состояние для этого этапа равны нулю.
yref1 = [0 0];
Во время 10
секунд, тележка перемещается с позиции 0
на 5
. Установите ссылки на состояние для этой позиции.
yref2 = [5 0];
Использование nlmpcmove
команда, вычисление оптимальных перемещений управления на каждом контрольном интервале. Эта функция создает нелинейную задачу программирования и решает ее, используя fmincon
функция из Optimization Toolbox.
Задайте параметр модели предсказания с помощью nlmpcmoveopt
и передайте этот объект в nlmpcmove
.
nloptions = nlmpcmoveopt; nloptions.Parameters = {Ts};
Запустите симуляцию для 20
секунд.
Duration = 20; hbar = waitbar(0,'Simulation Progress'); xHistory = x; for ct = 1:(20/Ts) % Set references if ct*Ts<10 yref = yref1; else yref = yref2; end % Correct previous prediction using current measurement. xk = correct(EKF, y); % Compute optimal control moves. [mv,nloptions,info] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions); % Predict prediction model states for the next iteration. predict(EKF, [mv; Ts]); % Implement first optimal control move and update plant states. x = pendulumDT0(x,mv,Ts); % Generate sensor data with some white noise. y = x([1 3]) + randn(2,1)*0.01; % Save plant states for display. xHistory = [xHistory x]; %#ok<*AGROW> waitbar(ct*Ts/20,hbar); end close(hbar)
Постройте график обратной связи.
figure subplot(2,2,1) plot(0:Ts:Duration,xHistory(1,:)) xlabel('time') ylabel('z') title('cart position') subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:)) xlabel('time') ylabel('zdot') title('cart velocity') subplot(2,2,3) plot(0:Ts:Duration,xHistory(3,:)) xlabel('time') ylabel('theta') title('pendulum angle') subplot(2,2,4) plot(0:Ts:Duration,xHistory(4,:)) xlabel('time') ylabel('thetadot') title('pendulum velocity')
График угла маятника показывает, что маятник успешно качается вверх за две секунды. В процессе качания тележка перемещается с пиковым отклонением -1
, и вернулся к своему исходному положению около времени 2
секунд.
График положения тележки показывает, что тележка успешно переходит к z = 5
за две секунды. Во время движения тележки маятник перемещается с пиковым отклонением 1
радиан (57
степени) и вернулся в перевернутое равновесное положение около времени 12
секунд.
Можно легко использовать сторонний решатель нелинейного программирования вместе с нелинейным объектом MPC, разработанным с помощью программного обеспечения Model Predictive Control Toolbox. Например, если у вас установлено программное обеспечение FORCES PRO от Embotech, можно использовать их плагин MPC Toolbox, чтобы сгенерировать эффективный пользовательский решатель NLP от вашего nlmpc
объект и используйте решатель для симуляции и генерации кода.
Во-первых, сгенерируйте пользовательский решатель, используя nlmpcToForces
команда. Можно выбрать использование решателя Interior-Point (IP) или решателя Sequential Quadratic Programming (SQP) с помощью nlmpcToForcesOptions
команда.
options = nlmpcToForcesOptions(); options.SolverName = 'MyIPSolver'; options.SolverType = 'InteriorPoint'; options.Parameter = Ts; options.x0 = [0;0;-pi;0]; options.mv0 = 0; [coredata, onlinedata] = nlmpcToForces(nlobj,options);
The nlmpcToForces
функция генерирует пользовательскую MEX-функцию nlmpcmove_MyIPSolver
, который можно использовать, чтобы ускорить симуляцию с обратной связью.
x = [0;0;-pi;0]; mv = 0; EKF.State = x; y = [x(1);x(3)]; hbar = waitbar(0,'Simulation Progress'); xHistory = x; for ct = 1:(20/Ts) % Set references if ct*Ts<10 onlinedata.ref = repmat(yref1,10,1); else onlinedata.ref = repmat(yref2,10,1); end % Correct previous prediction using current measurement. xk = correct(EKF, y); % Compute optimal control moves using FORCES PRO solver. [mv,onlinedata,info] = nlmpcmove_MyIPSolver(xk,mv,onlinedata); % Predict prediction model states for the next iteration. predict(EKF, [mv; Ts]); % Implement first optimal control move and update plant states. x = pendulumDT0(x,mv,Ts); % Generate sensor data with some white noise. y = x([1 3]) + randn(2,1)*0.01; % Save plant states for display. xHistory = [xHistory x]; %#ok<*AGROW> waitbar(ct*Ts/20,hbar); end close(hbar)
Как ожидалось, реакция с обратной связью аналогична реакции, полученной с помощью fmincon
как и ожидалось.
Этот пример также требует, чтобы программное обеспечение Simulink ® моделировало нелинейное управление MPC моделью маятника в Simulink.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink is required to run this example.') return end
Проверьте нелинейный контроллер MPC с симуляцией замкнутой системы в Simulink.
Откройте модель Simulink.
mdl = 'mpc_pendcartNMPC';
open_system(mdl)
В этой модели блок Nonlinear MPC Controller сконфигурирован, чтобы использовать ранее разработанный контроллер, nlobj
.
Чтобы использовать дополнительные параметры в модели предсказания, модель имеет блок Simulink Bus, соединенный с params
входной порт блока нелинейного контроллера MPC. Чтобы сконфигурировать этот блок шины для использования Ts
параметр, создайте объект Bus в рабочем пространстве MATLAB и сконфигурируйте блок Bus Creator, чтобы использовать этот объект. Для этого используйте createParameterBus
функция. В этом примере назовите объект Bus 'myBusObject'
.
createParameterBus(nlobj,[mdl '/Nonlinear MPC Controller'],'myBusObject',{Ts});
A Simulink Bus object "myBusObject" created in the MATLAB Workspace, and Bus Creator block "mpc_pendcartNMPC/Nonlinear MPC Controller" is configured to use it.
Запустите симуляцию для 30
секунд.
open_system([mdl '/Scope'])
sim(mdl)
Нелинейное моделирование в Simulink дает одинаковые результаты отслеживания качания и положения тележки по сравнению с симуляцией MATLAB. Кроме того, толчок (импульсное нарушение порядка dF
) применяется к инвертированному маятнику во время 20
секунд. Нелинейный контроллер MPC успешно отвергает нарушение порядка и возвращает тележку к z = 5
и маятник в перевернутое равновесное положение.
Можно также использовать блок FORCES Nonlinear MPC из программного обеспечения Embotech FORCES PRO, чтобы симулировать нелинейный MPC с помощью сгенерированного пользовательского решателя NLP.
Если у вас установлено программное обеспечение FORCES PRO, откройте mpc_pendcartFORCESPRO
модель и запустить ее до завершения. Реакция с обратной связью подобна той, которая использует fmincon
.
Этот пример иллюстрирует общий рабочий процесс разработки и симуляции нелинейного MPC в MATLAB и Simulink с помощью nlmpc
объект и нелинейный блок MPC Controller, соответственно. В зависимости от конкретных нелинейных характеристик объекта и требований к управлению, детали реализации могут значительно варьироваться. Основные задачи проекта включают:
Выбор правильных горизонтов, границ и весов
Разработка оценщика нелинейного состояния
Разработка пользовательской нелинейной функции затрат и ограничительной функции
Выбор опций решателя или выбор пользовательского решателя NLP
Можно использовать функции и модель Simulink в этом примере в качестве шаблонов для других нелинейных задач проектирования и симуляции MPC.
Оба nlmpcmoveCodeGeneration
команда из программного обеспечения Model Predictive Control Toolbox и nlmpcmoveForces
команда от генерации кода поддержки FORCES PRO в MATLAB. И блок Nonlinear MPC из программного обеспечения Model Predictive Control Toolbox, и FORCES Nonlinear MPC
блок от генерации кода поддержки FORCES PRO в Simulink.
bdclose(mdl)
nlmpc
| Nonlinear MPC Controller