Этот пример использует нелинейный прогнозирующий объект контроллера модели и блок, чтобы достигнуть колебания и балансирующегося управления инвертированного маятника на корзине.
Этот пример требует, чтобы программное обеспечение 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
применяется к инвертированному маятнику, сохраните маятник сбалансированным и возвратите корзину в ее исходное положение.
Нисходящее положение равновесия устойчиво, и инвертированное положение равновесия нестабильно, который делает управление колебания более сложным для одного линейного контроллера, который нелинейный 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)
Nonlinear MPC Controller | nlmpc