buildMEX

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

Описание

пример

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

mexFcn = buildMEX(nlmpcobj,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.
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')

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

свернуть все

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

Ваш диспетчер должен использовать 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

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

lastMV

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

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

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

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

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

newOnlineData

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

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

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

Введенный в R2020a