Создайте файл MEX, который решает нелинейную задачу MPC управления
создает файл MEX, который решает нелинейную задачу MPC управления быстрее, чем использование mexFcn
= buildMEX(nlmpcobj
,mexName
,coreData
,onlineData
)nlmpcmove
. Файл 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
секунды. Во время каждого контрольного интервала:
Откорректируйте предыдущее предсказание с помощью текущего измерения.
Вычислите перемещения оптимального управления с помощью MEX-функции, Эта функция возвращает вычисленные оптимальные последовательности в onlineData
. Передача обновленной структуры данных к MEX-функции в следующем контрольном интервале обеспечивает исходные предположения для оптимальных последовательностей.
Предскажите состояния модели.
Примените первое вычисленное перемещение оптимального управления к объекту, обновив состояния объекта.
Сгенерируйте данные о датчике с белым шумом.
Сохраните состояния объекта.
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')
nlmpcobj
— Нелинейный прогнозирующий контроллер моделиnlmpc
объектНелинейный прогнозирующий контроллер модели в виде nlmpc
объект.
Ваш диспетчер должен использовать fmincon
по умолчанию решатель с алгоритмом SQP. Кроме того, ваш диспетчер не должен использовать анонимные функции в ее модели предсказания, пользовательской функции стоимости или пользовательских ограничительных функциях.
mexName
— Имя MEX-функцииИмя MEX-функции в виде строки или вектора символов.
coreData
— Нелинейные параметры конфигурации MPCНелинейные параметры конфигурации MPC, которые являются постоянными во время выполнения в виде структуры, сгенерированной с помощью getCodeGenerationData
.
onlineData
— Начальные онлайновые данные контроллераНачальные онлайновые данные контроллера в виде структуры, сгенерированной с помощью getCodeGenerationData
. Для получения дополнительной информации о настройках поля на onlineData
, смотрите nlmpcmoveCodeGeneration
.
mexConfig
— Объект настройки генерации кодаMexCodeConfig
объектНастройка генерации кода возражает в виде MexCodeConfig
объект.
Чтобы создать объект настройки, используйте следующий код.
mexConfig = coder.config('mex');
Чтобы настроить вашу генерацию кода MEX, измените настройки этого объекта. Например, чтобы обнаружить нарушения доступа к памяти во время выполнения во время отладки, установите IntegrityChecks
к true
.
mexConfig.IntegrityChecks = true;
По умолчанию, чтобы улучшать производительность сгенерированного кода, проверки, такие как IntegrityChecks
и ResponsivenessChecks
отключены buildMEX
.
buildMEX
перезаписывает следующие параметры конфигурации с обозначенными значениями.
Параметр конфигурации | Значение |
---|---|
cfg.DynamicMemoryAllocation | 'AllVariableSizeArrays' |
cfg.ConstantInputs | 'Remove' |
mexFcn
— Сгенерированная MEX-функцияСгенерированная 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 | Обновленные онлайновые данные контроллера, возвращенные как структура. Эта структура совпадает с |
info | Детали решения, возвращенные как структура. |
Чтобы симулировать контроллер, использующий сгенерированную MEX-функцию, используйте начальную онлайновую структуру данных onlineData
для первого контрольного интервала. Для последующих контрольных интервалов измените онлайновые данные в newOnlineData
и передайте обновленную структуру MEX-функции как onlineData
.
getCodeGenerationData
| nlmpc
| nlmpcmove
| nlmpcmoveCodeGeneration
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.