Этот пример использует нелинейный прогнозирующий объект контроллера модели и блок, чтобы достигнуть колебания и балансирующегося управления инвертированного маятника на тележке.
Этот пример требует, чтобы программное обеспечение 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
.
Цели управления:
Управление Swing: Первоначально качайте маятник до инвертированного положения равновесия где z = 0
и theta = 0
.
Отслеживание уставки положения тележки: Переместите тележку в новое положение с изменением заданного значения шага, сохранив маятник инвертированным.
Балансировка маятника: Когда импульсное воздействие величины 2
применяется к инвертированному маятнику, сохраните маятник сбалансированным и возвратите тележку в ее исходное положение.
Нисходящее положение равновесия устойчиво, и инвертированное положение равновесия нестабильно, который делает управление колебания более сложным для одного линейного контроллера, который нелинейный MPC обрабатывает легко.
В этом примере у нелинейного контроллера MPC есть следующая настройка ввода-вывода.
Одна переменная, которой управляют: Переменная сила (F)
Два измеренных выходных параметров: положение (z) Тележки и угол маятника (theta)
Два других состояния, скорость тележки (zdot) и скорость вращения маятника (thetadot) не измеримы.
В то время как заданное значение положения тележки, z, может варьироваться, заданным значением угла маятника, theta, всегда является 0
(инвертированное положение равновесия).
Создайте нелинейный контроллер MPC с соответствующими размерностями с помощью nlmpc
объект. В этом примере модель предсказания имеет 4
состояния, 2
выходные параметры и 1
введите (мВ).
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, где выведенное отслеживание уставки и подавление переменной move, которым управляют, осуществляются. Поэтому задайте стандартные настраивающие веса 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, чтобы сгенерировать эффективный пользовательский решатель NLP от nlmpc
возразите и используйте решатель для симуляции и генерации кода.
Во-первых, сгенерируйте пользовательский решатель с помощью nlmpcToForces
команда. Можно выбрать использование или решатель Внутренней точки (IP) или решатель Последовательного квадратичного программирования (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);
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
входной порт блока Nonlinear MPC Controller. Сконфигурировать этот блок шины, чтобы использовать 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
объект и блок Nonlinear MPC Controller, соответственно. В зависимости от определенных нелинейных характеристик объекта и требований управления, детали реализации могут значительно варьироваться. Ключевые проблемы проекта включают:
Выбор соответствующих горизонтов, границ и весов
Разработка нелинейного средства оценки состояния
Разработка пользовательской нелинейной функции стоимости и ограничительной функции
Выбор опций решателя или выбор пользовательского решателя NLP
Можно использовать функции и модель Simulink в этом примере как шаблоны для других нелинейных задач проектирования и симуляции MPC.
Оба nlmpcmoveCodeGeneration
команда из программного обеспечения Model Predictive Control Toolbox и nlmpcmoveForces
команда от ОБЕСПЕЧИВАЕТ Pro генерацию кода поддержки в MATLAB. И блок Nonlinear MPC из программного обеспечения Model Predictive Control Toolbox и FORCES Nonlinear MPC
блок из ОБЕСПЕЧИВАЕТ Pro генерацию кода поддержки в Simulink.
bdclose(mdl)
nlmpc
| Nonlinear MPC Controller