nlmpcmove

Вычислите действие оптимального управления для нелинейного контроллера MPC

Синтаксис

mv = nlmpcmove(nlmpcobj,x,lastmv)
mv = nlmpcmove(nlmpcobj,x,lastmv,ref)
mv = nlmpcmove(nlmpcobj,x,lastmv,ref,md)
mv = nlmpcmove(nlmpcobj,x,lastmv,ref,md,options)
[mv,opt] = nlmpcmove(___)
[mv,opt,info] = nlmpcmove(___)

Описание

mv = nlmpcmove(nlmpcobj,x,lastmv) вычисляет оптимальное действие управления переменными, которым управляют, в течение текущего времени. Чтобы моделировать нелинейное MPC управление с обратной связью, вызывайте nlmpcmove неоднократно.

пример

mv = nlmpcmove(nlmpcobj,x,lastmv,ref) задает ссылочные значения для объекта выходные параметры. Если вы не задаете ссылочные значения, nlmpcmove использует нули по умолчанию.

mv = nlmpcmove(nlmpcobj,x,lastmv,ref,md) указывает, что время выполнения измерило значения воздействия. Если ваш контроллер измерил воздействия, необходимо задать md.

пример

mv = nlmpcmove(nlmpcobj,x,lastmv,ref,md,options) задает дополнительные опции во время выполнения для вычисления перемещений оптимального управления. Используя options, вы можете задать исходные предположения для состояния и управляли переменными траекториями, настраивающими весами обновления при ограничениях, или измените параметры модели прогноза.

пример

[mv,opt] = nlmpcmove(___) возвращает объект nlmpcmoveopt, который содержит исходные предположения для состояния и траекторий, которыми управляют, которые будут использоваться в следующем интервале управления.

пример

[mv,opt,info] = nlmpcmove(___) возвращает дополнительные детали решения, включая итоговое значение функции стоимости оптимизации и оптимальную переменную, которой управляют, состояние и выходные траектории.

Примеры

свернуть все

Создайте нелинейный контроллер MPC с шестью состояниями, шестью выходными параметрами и четырьмя входными параметрами.

nx = 6;
ny = 6;
nu = 4;
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.

Задайте шаг расчета контроллера и горизонты.

Ts = 0.4;
p = 30;
c = 4;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = p;
nlobj.ControlHorizon = c;

Задайте функцию состояния модели прогноза и якобиан функции состояния. В данном примере используйте модель летающего робота.

nlobj.Model.StateFcn = "FlyingRobotStateFcn";
nlobj.Jacobian.StateFcn = "FlyingRobotStateJacobianFcn";

Задайте пользовательскую функцию стоимости для контроллера, который заменяет стандартную функцию стоимости.

nlobj.Optimization.CustomCostFcn = @(X,U,e,data) Ts*sum(sum(U(1:p,:)));
nlobj.Optimization.ReplaceStandardCost = true;

Задайте пользовательскую ограничительную функцию для контроллера.

nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';

Задайте линейные ограничения на переменные, которыми управляют.

for ct = 1:nu
    nlobj.MV(ct).Min = 0;
    nlobj.MV(ct).Max = 1;
end

Подтвердите модель прогноза и пользовательские функции в начальных состояниях (x0) и начальные входные параметры (u0) робота.

x0 = [-10;-10;pi/2;0;0;0];
u0 = zeros(nu,1); 
validateFcns(nlobj,x0,u0);
Model.StateFcn is OK.
Jacobian.StateFcn is OK.
No output function specified. Assuming "y = x" in the prediction model.
Optimization.CustomCostFcn is OK.
Optimization.CustomEqConFcn is OK.
Analysis of user-provided model, cost, and constraint functions complete.

Вычислите оптимальное состояние, и управлял переменными траекториями, которые возвращены в info.

[~,~,info] = nlmpcmove(nlobj,x0,u0);
Slack variable unused or zero-weighted in your custom cost function. All constraints will be hard.

Постройте оптимальные траектории.

FlyingRobotPlotPlanning(info)
Optimal fuel consumption =   4.712383

Создайте нелинейный контроллер MPC с четырьмя состояниями, двумя выходными параметрами и одним входом.

nlobj = nlmpc(4,2,1);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.

Задайте шаг расчета и горизонты контроллера.

Ts = 0.1;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = 10;
nlobj.ControlHorizon = 5;

Задайте функцию состояния для контроллера, который находится в файле pendulumDT0.m. Эта модель дискретного времени интегрирует непрерывную модель времени, заданную в pendulumCT0.m с помощью многоступенчатого прямого Метода Эйлера.

nlobj.Model.StateFcn = "pendulumDT0";
nlobj.Model.IsContinuousTime = false;

Модель прогноза использует дополнительный параметр, Ts, чтобы представлять шаг расчета. Задайте количество параметров.

nlobj.Model.NumberOfParameters = 1;

Задайте выходную функцию модели, передав параметр шага расчета как входной параметр.

nlobj.Model.OutputFcn = @(x,u,Ts) [x(1); x(3)];

Задайте стандартные ограничения для контроллера.

nlobj.Weights.OutputVariables = [3 3];
nlobj.Weights.ManipulatedVariablesRate = 0.1;
nlobj.OV(1).Min = -10;
nlobj.OV(1).Max = 10;
nlobj.MV.Min = -100;
nlobj.MV.Max = 100;

Подтвердите функции модели прогноза.

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.
Analysis of user-provided model, cost, and constraint functions complete.

Только два из состояний объекта измеримы. Поэтому создайте расширенный Фильтр Калмана для оценки четырех состояний объекта. Его функция изменения состояния задана в pendulumStateFcn.m, и его функция измерения задана в pendulumMeasurementFcn.m.

EKF = extendedKalmanFilter(@pendulumStateFcn,@pendulumMeasurementFcn);

Задайте начальные условия для симуляции, инициализируйте расширенное состояние Фильтра Калмана и укажите, что нулевая начальная буква управляла значением переменных.

x = [0;0;-pi;0];
y = [x(1);x(3)];
EKF.State = x;
mv = 0;

Задайте выходное значение ссылки.

yref = [0 0];

Создайте объект nlmpcmoveopt и задайте параметр шага расчета.

nloptions = nlmpcmoveopt;
nloptions.Parameters = {Ts};

Запустите симуляцию в течение секунд 10. Во время каждого интервала управления:

  1. Исправьте предыдущий прогноз с помощью текущего измерения.

  2. Вычислите перемещения оптимального управления с помощью nlmpcmoveopt. Эта функция возвращает вычисленные оптимальные последовательности в nloptions. Передача обновленного объекта опций к nlmpcmoveopt в следующем интервале управления обеспечивает исходные предположения для оптимальных последовательностей.

  3. Предскажите образцовые состояния.

  4. Примените первое вычисленное перемещение оптимального управления к объекту, обновив состояния объекта.

  5. Сгенерируйте данные о датчике с белым шумом.

  6. Сохраните состояния объекта.

Duration = 10;
xHistory = x;
for ct = 1:(Duration/Ts)
    % Correct previous prediction
    xk = correct(EKF,y);
    % Compute optimal control moves
    [mv,nloptions] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions);
    % Predict prediction model states for the next iteration
    predict(EKF,[mv; Ts]);
    % Implement first optimal control move
    x = pendulumDT0(x,mv,Ts);
    % Generate sensor data
    y = x([1 3]) + randn(2,1)*0.01;
    % Save plant states
    xHistory = [xHistory x];
end

Постройте получившиеся траектории состояния.

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')

Входные параметры

свернуть все

Нелинейный контроллер MPC, заданный как объект nlmpc.

Текущие состояния модели прогноза, заданные как вектор lengthNx, где Nx является количеством состояний модели прогноза. Поскольку нелинейный контроллер MPC не выполняет оценку состояния, необходимо или измерить или оценить текущие состояния модели прогноза в каждом интервале управления.

Управляющие сигналы использовали на объекте в предыдущем интервале управления, заданном как вектор lengthNmv, где Nmv является количеством переменных, которыми управляют.

Примечание

Задайте last_mv, когда сигналы мВ применились к объекту в предыдущем интервале управления. Как правило, эти сигналы мВ являются значениями, сгенерированными контроллером, хотя это не всегда имеет место. Например, если ваш контроллер является оффлайновым и рабочим в режиме отслеживания; то есть, контроллер вывел, не управляет объектом, затем питание фактического управляющего сигнала к last_mv может помочь достигнуть передачи bumpless, когда контроллер переключается назад онлайн.

Выходные значения ссылки объекта, заданные как вектор - строка из длины Ny или массив со столбцами Ny, где Ny является количеством выходных переменных. Если вы не задаете ref, ссылочные значения по умолчанию являются нулем.

Чтобы использовать те же ссылочные значения через горизонт прогноза, задайте вектор - строку.

Чтобы отличаться ссылочные значения по горизонту прогноза со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом прогноза. Каждая строка содержит ссылочные значения для одного шага горизонта прогноза. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта прогноза.

Измеренные значения воздействия, заданные как вектор - строка из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш контроллер измерил воздействия, необходимо задать md. Если у вашего контроллера нет измеренных воздействий, задайте md как [].

Чтобы использовать те же значения воздействия через горизонт прогноза, задайте вектор - строку.

Чтобы отличаться значения воздействия по горизонту прогноза со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом прогноза. Каждая строка содержит значения воздействия для одного шага горизонта прогноза. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта прогноза.

Опции во время выполнения, заданные как объект nlmpcmoveopt. Используя эти опции, вы можете:

  • Настройте веса контроллера

  • Обновите линейные ограничения

  • Поставьте переменные цели, которыми управляют,

  • Задайте параметры модели прогноза

  • Обеспечьте исходные предположения для состояния, и управлял переменными траекториями

Эти опции применяются только к текущему моменту времени nlmpcmove.

Чтобы повысить эффективность решателя, это - лучшая практика задать исходные предположения для состояния и управляло переменными траекториями.

Выходные аргументы

свернуть все

Оптимальное действие управления переменными, которым управляют, возвращенное как вектор-столбец длины Nmv, где Nmv является количеством переменных, которыми управляют.

Если решатель сходится к решению для локального оптимума (info.ExitFlag положителен), то mv содержит оптимальное решение.

Если решатель достигает максимального количества итераций, не находя оптимальное решение (info.ExitFlag = 0) и:

  • nlmpcobj.Optimization.UseSuboptimalSolution является true, затем mv содержит субоптимальное решение

  • nlmpcobj.Optimization.UseSuboptimalSolution является false, затем mv содержит lastmv

Если решатель перестал работать (info.ExitFlag отрицателен), то mv содержит lastmv.

Опции во время выполнения с исходными предположениями для состояния и переменных траекторий, которыми управляют, которые будут использоваться в следующем интервале управления, возвращенном как объект nlmpcmoveopt. Любые опции во время выполнения, что вы задали использование options, такой как веса, ограничения или параметры, копируются в opt.

Исходные предположения для состояний (opt.X0) и переменные, которыми управляют (opt.MV0) являются оптимальными траекториями, вычисленными nlmpcmove, и соответствуют последнему p-1 строка info.Xopt и info.MVopt, соответственно.

Чтобы использовать эти исходные предположения в следующем интервале управления, задайте opt как входной параметр options к nlmpcmove.

Детали решения, возвращенные как структура со следующими полями.

Оптимальная переменная последовательность, которой управляют, возвращенная как (p +1)-by-Nmv массив, где p является горизонтом прогноза и Nmv, является количеством переменных, которыми управляют.

MVopt(i,:) содержит расчетные оптимальные значения переменных, которыми управляют, во время k+i-1 для i = 1,...,p, где k является текущим временем. MVopt(1,:) содержит те же значения переменных, которыми управляют, как выходной аргумент mv. Поскольку контроллер не вычисляет перемещения оптимального управления во время k+p, MVopt(p+1,:) равен MVopt(p,:).

Оптимальная модель прогноза утверждает последовательность, возвращенную как (p +1)-by-Nx массив, где p является горизонтом прогноза, и Nx является количеством состояний в модели прогноза.

Xopt(i,:) содержит расчетные значения состояния во время k+i-1 для i = 2,...,p+1, где k является текущим временем. Xopt(1,:) совпадает с текущими состояниями в x.

Оптимальная последовательность выходной переменной, возвращенная как (p +1)-by-Ny массив, где p является горизонтом прогноза и Ny, является количеством выходных параметров.

Yopt(i,:) содержит расчетные выходные значения во время k+i-1 для i = 2,...,p+1, где k является текущим временем. Yopt(1,:) вычисляется на основе текущих состояний в x и текущих измеренных воздействий в md, если таковые имеются.

Последовательность времени горизонта прогноза, возвращенная как вектор-столбец длины p +1, p является горизонтом прогноза. Topt содержит последовательность времени со времени k ко времени k +p, где k является текущим временем.

Topt(1) = 0 представляет текущее время. Последующим Topt(i) временных шагов является Ts*(i-1), где Ts = nlmpcobj.Ts является шагом расчета контроллера.

Используйте Topt при графическом выводе Uopt, Xopt или последовательностей Yopt.

Ослабьте переменную, ε, используемый в ограничительном смягчении, возвращенном как неотрицательное скалярное значение.

  • ε = 0 — Все мягкие ограничения удовлетворены по целому горизонту прогноза.

  • ε> 0 — По крайней мере одно мягкое ограничение нарушено. Когда больше чем одно ограничение нарушено, ε представляет худший случай мягкое ограничительное нарушение (масштабируемый вашими значениями ECR для каждого ограничения).

Код выхода оптимизации, возвращенный как одно из следующего:

  • Положительное Целое число — Решатель сходился к оптимальному решению

  • 0 — Максимальное количество итераций, достигнутых, не сходясь на оптимальное решение

  • Отрицательное целое число — Решатель перестал работать

Стоимость целевой функции, возвращенная как неотрицательное скалярное значение. Стоимость определяет количество степени, до которой контроллер достиг ее целей.

Величина затрат только значима, когда ExitFlag является неотрицательным.

Советы

Во время симуляций с обратной связью это - лучшая практика к горячему запуску нелинейный решатель при помощи предсказанного состояния и управляло переменными траекториями от предыдущего интервала управления как исходные предположения для текущего интервала управления. Использовать эти траектории в качестве исходных предположений:

  1. Возвратите выходной аргумент opt при вызове nlmpcmove. Этот объект nlmpcmoveopt содержит любые опции во время выполнения, которые вы задали в предыдущем вызове nlmpcmove, наряду с исходными предположениями для состояния (opt.X0) и управляли переменной (opt.MV0) траектории.

  2. Передайте этот объект в как входной параметр options к nlmpcmove для следующего интервала управления.

Эти шаги являются лучшой практикой, даже если вы не задаете никакие другие опции во время выполнения.

Введенный в R2018b