exponenta event banner

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