buildMEX

Создайте файл MEX, который решает (типовую или многоступенчатую) нелинейную задачу MPC управления

Описание

пример

mexFcn = buildMEX(nlobj,mexName,coreData,onlineData) создает файл MEX, который решает нелинейную задачу MPC управления быстрее, чем nlmpcmove. Файл MEX создается в текущей рабочей папке.

mexFcn = buildMEX(nlobj,mexName,coreData,onlineData,mexConfig) генерирует MEX-функцию с помощью объекта строения генерации кода mexConfig. Используйте этот синтаксис для настройки генерации кода MEX.

Примеры

свернуть все

Создайте нелинейный контроллер 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;
params = {Ts};

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

nlobj.Model.OutputFcn = "pendulumOutputFcn";

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

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,[],params);
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);

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

x0 = [0;0;-pi;0];
y0 = [x0(1);x0(3)];
EKF.State = x0;
mv0 = 0;

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

[coreData,onlineData] = getCodeGenerationData(nlobj,x0,mv0,params);

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

onlineData.ref = [0 0];

Создайте MEX-функцию для решения нелинейной задачи MPC управления. Эта MEX-функция создаётся в текущую рабочую директорию.

mexFcn = buildMEX(nlobj,"myController",coreData,onlineData);
Generating MEX function "myController" from nonlinear MPC to speed up simulation.
Code generation successful.

MEX function "myController" successfully generated.

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

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

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

  3. Спрогнозируйте состояния модели.

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

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

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

mv = mv0;
y = y0;
x = x0;
Duration = 10;
xHistory = x0;
for ct = 1:(Duration/Ts)
    % Correct previous prediction
    xk = correct(EKF,y);
    % Compute optimal control move
    [mv,onlineData] = myController(xk,mv,onlineData);
    % 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')

Figure contains 4 axes. Axes 1 with title cart position contains an object of type line. Axes 2 with title cart velocity contains an object of type line. Axes 3 with title pendulum angle contains an object of type line. Axes 4 with title pendulum velocity contains an object of type line.

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

свернуть все

Нелинейный прогнозирующий контроллер модели, заданный как nlmpc или nlmpcMultistage объект.

Ваш контроллер должен использовать значение по умолчанию fmincon решатель с алгоритмом SQP. Кроме того, ваш контроллер не должен использовать анонимные функции для своей модели предсказания, пользовательской функции стоимости или пользовательских функций ограничения.

Имя MEX-функции, заданное как строковый или символьный вектор.

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

Исходные онлайн- контроллеры данные, заданные как структура, сгенерированная с помощью getCodeGenerationData. Для получения дополнительной информации об установке полей onlineData, см. nlmpcmoveCodeGeneration.

Объект строения генерации кода, заданный как MexCodeConfig объект.

Чтобы создать объект строения, используйте следующий код.

mexConfig = coder.config('mex');

Чтобы настроить генерацию кода MEX, измените параметры этого объекта. Для примера, чтобы обнаружить нарушения доступа к памяти во время выполнения во время отладки, установите IntegrityChecks на true.

mexConfig.IntegrityChecks = true;

По умолчанию, чтобы улучшить эффективность сгенерированного кода, проверяет такие как IntegrityChecks и ResponsivenessChecks отключены buildMEX.

buildMEX перезаписывает следующие настройки строения указанными значениями.

Настройка строенияЗначение
cfg.DynamicMemoryAllocation 'AllVariableSizeArrays'
cfg.ConstantInputs'Remove'

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

свернуть все

Сгенерированная MEX-функция, возвращенная как указатель на функцию. Эта MEX-функция имеет следующую сигнатуру.

[mv,newOnlineData,info] = mexFcn(x,lastMV,onlineData)

MEX-функция имеет следующие входные параметры, которые совпадают с соответствующими входными параметрами nlmpcmoveCodeGeneration.

Входной параметрОписание
x

Текущие состояния модели предсказания, заданные как вектор длины Nx, где Nx - количество состояний модели предсказания.

lastMV

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

onlineDataДанные сетевого контроллера, которые необходимо обновить во время исполнения, заданные как структура. Сгенерируйте начальную структуру используя getCodeGenerationData. Для получения дополнительной информации об установке полей onlineData, см. nlmpcmoveCodeGeneration.

MEX-функция имеет следующие выходные аргументы, которые совпадают с выходными аргументами nlmpcmoveCodeGeneration.

Выходной аргументОписание
mv

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

newOnlineData

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

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

Чтобы симулировать контроллер с помощью сгенерированной MEX-функции, используйте начальную онлайн-структуру данных onlineData для первого контрольного интервала. Для последующих контрольных интервалов измените онлайн- данные в newOnlineData и передайте обновленную структуру в MEX-функцию следующим образом onlineData.

Введенный в R2020a