Этот пример использует нелинейный образцовый прогнозирующий объект контроллера и блок, чтобы достигнуть колебания и балансирующегося управления инвертированного маятника на корзине.
Этот пример требует, чтобы программное обеспечение Optimization Toolbox™ обеспечило решатель нелинейного программирования по умолчанию для нелинейного MPC, чтобы вычислить перемещения оптимального управления в каждом интервале управления.
if ~mpcchecktoolboxinstalled('optim') disp('Optimization Toolbox is required to run this example.') return end
Объект для этого примера является блоком маятника/корзины, где z является положением корзины, и тета является углом маятника. Переменная, которой управляют, для этой системы является переменной силой F действующий на корзину. Область значений силы между -100
и 100
. Импульсивное воздействие dF может продвинуть маятник также.
Примите следующие начальные условия для блока маятника/корзины:
Корзина является стационарной в z = 0
.
Маятник находится в нисходящем положении равновесия где тета = -pi
.
Цели управления:
Управление Swing: Первоначально качайте маятник до инвертированного положения равновесия где z = 0
и тета = 0
.
Отслеживание уставки положения корзины: Переместите корзину в новое положение с изменением заданного значения шага, сохранив маятник инвертированным.
Балансировка маятника: Когда импульсное воздействие значения 2
будет применено к инвертированному маятнику, сохраните маятник сбалансированным и возвратите корзину в ее исходное положение.
Нисходящее положение равновесия является stabl, e, и инвертированное положение равновесия нестабильно, который делает управление колебания более сложным для одного линейного контроллера, который нелинейный MPC обрабатывает легко.
В этом примере нелинейный MPC имеет следующую настройку ввода-вывода:
Одна переменная, которой управляют: Переменная сила (F)
Два измеренных выходных параметров: положение (z) Корзины и угол маятника (тета)
Два других состояния, скорость корзины (zdot) и маятник угловая скорость (thetadot) не измеримы.
В то время как заданное значение положения корзины, z, может отличаться, заданным значением угла маятника, теты, всегда является 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;
Два объекта выходные параметры являются первым и третьим состоянием в модели, положении корзины и углу маятника, соответственно. Задайте соответствующую выходную функцию с помощью анонимной функции.
nlobj.Model.OutputFcn = @(x,u,Ts) [x(1); x(3)];
Это - лучшая практика обеспечить аналитические Функции Якоби, когда это возможно, поскольку они значительно улучшают скорость симуляции. В этом примере обеспечьте якобиан для выходной функции.
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.
Маятник находится в нисходящем положении равновесия, тета = -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
.
Этот пример также требует, чтобы программное обеспечение 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
и маятник к инвертированному положению равновесия.
Ни объект nlmpc
, ни блок Nonlinear MPC Controller не поддерживают генерацию кода.
Этот пример иллюстрирует общий рабочий процесс, чтобы разработать и моделировать нелинейный MPC в MATLAB и Simulink с помощью объекта nlmpc
и блока Nonlinear MPC Controller, соответственно. В зависимости от определенных нелинейных характеристик объекта и требований управления, детали реализации могут значительно отличаться. Ключевые проблемы проекта включают:
Выбор соответствующих горизонтов, границ и весов
Разработка нелинейного средства оценки состояния
Разработка пользовательской нелинейной функции стоимости и ограничительной функции
Выбор опций решателя или выбор пользовательского решателя NLP
Можно использовать функции и модель Simulink в этом примере как шаблоны для другого нелинейного проекта MPC и задач симуляции.
bdclose(mdl)
Нелинейный контроллер MPC | nlmpc