主要内容

buildMEX

建立MEX文件,解决一个(通用或多级)非线性MPC控制问题

描述

例子

mexFcn= buildMEX (nlobjmexNamecoreDataonlineData建立一个MEX文件,解决非线性MPC控制问题比nlmpcmove.该MEX文件是在当前工作文件夹中创建。

mexFcn= buildMEX (nlobjmexNamecoreDataonlineDatamexConfig生成使用所述码生成配置对象一个MEX函数mexConfig.使用此语法自定义MEX代码生成。

例子

全部折叠

创建一个具有四个状态,两个输出和一个输入的非线性MPC控制器。

nlobj = nlmpc (4 2 1);
在标准代价函数中,默认情况下对一个或多个OVs应用零权,因为mv比OVs少。

指定采样时间和所述控制器的视野。

t = 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)最大= 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是OK。Model.OutputFcn是OK。用户提供的模型,成本和约束函数的分析完成。

只有两个工厂的状态是可测量的。因此,用于估计四种植物状态创建扩展卡尔曼滤波器。其状态转换函数定义在pendulumStateFcn.m和它的测量功能中所定义pendulumMeasurementFcn.m

EKF = extendedKalmanFilter (@pendulumStateFcn @pendulumMeasurementFcn);

限定的初始条件为模拟,初始化扩展卡尔曼滤波器的状态,并指定一个零初始操纵变量的值。

x0 =[0, 0, -π;0];x0 y0 = (x0 (1); (3)];卡尔曼滤波器。状态= x0;mv0 = 0;

用于控制器创建代码生成数据结构,指定初始条件和参数。

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

在在线数据结构中指定输出参考值。

onlineData。Ref = [0 0];

构建MEX函数求解非线性MPC控制问题。该MEX函数是在当前工作目录中创建。

mexFcn = buildMEX (nlobj,“myController的”、coreData onlineData);
从非线性MPC生成MEX函数“myController”,加速仿真。代码生成成功。成功生成MEX函数“myController”。

运行下面的模拟10.秒。在每个控制间隔期间:

  1. 使用当前的测量值修正先前的预测。

  2. 计算最优控制移动使用MEX函数。该函数返回所计算的最佳序列中onlineData.在下一个控制区间将更新的数据结构传递给MEX函数可以提供对最优序列的初始猜测。

  3. 预测模型状态。

  4. 应用首先计算最优控制转移到工厂,更新设备的状态。

  5. 产生带有白噪声的传感器数据。

  6. 拯救植物状态。

MV = MV0;Y = Y0;X = X0;持续时间= 10;xHistory = X0;为了CT = 1:(持续时间/ Ts)的%正确先前预测xk =正确(卡尔曼滤波器,y);%计算最优控制移动[MV,onlineData] = myController的(XK,MV,onlineData);% Predict下一次迭代的预测模型状态预测(卡尔曼滤波器,[mv;Ts]);%首次实现最优控制的举动x = pendulumDT0 (x, mv, Ts);%生成的传感器数据Y = X([1 3])+ randn(2,1)* 0.01;%保存植物状态xHistory = [xHistory x];结束

绘制结果状态轨迹。

图副区(2,2,1)情节(0:TS:持续时间,xHistory(1,:))xlabel('时间') ylabel (“z”)标题(“车位置”) subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:))'时间') ylabel ('zdot')标题(“车速度”)子plot(0,2,3) plot(0:Ts:Duration,xHistory(3,:))'时间') ylabel (“θ”)标题(“摆角”)副区(2,2,4)情节(0:TS:持续时间,xHistory(4,:))xlabel('时间') ylabel ('thetadot')标题(“摆速度”

图包含4个轴对象。轴加工对象物1与标题车位置包含型线的对象。轴对象2与标题车速度包含型线的对象。轴对象3与标题摆角包含型线的对象。轴对象4标题摆速度包含型线的对象。

输入参数

全部折叠

非线性模型预测控制器,指定为nlmpcnlmpcMultistage对象。

你的控制器必须使用默认fmincon用SQP算法求解。此外,您的控制器不能为其预测模型、自定义成本函数或自定义约束函数使用匿名函数。

MEX函数名,指定为字符串或字符向量。

非线性MPC配置参数是在运行时间常数,指定为使用所生成的一个结构getCodeGenerationData

初始在线控制器数据,指定为结构生成使用getCodeGenerationData.的字段设置的详细信息onlineData, 看nlmpcmoveCodeGeneration

代码生成配置对象,指定为MexCodeConfig对象。

要创建配置对象,请使用以下代码。

mexConfig = coder.config ('MEX');

要自定义MEX代码生成,请修改此对象的设置。例如,要在调试期间检测运行时内存访问冲突,请设置IntegrityChecks真正的

mexConfig。IntegrityChecks = true;

默认情况下,要提高生成代码的性能,可以进行诸如IntegrityChecksResponsivenessChecks被禁用的buildMEX

buildMEX用指定的值覆盖以下配置设置。

配置设置 价值
cfg。DynamicMemoryAllocation 'AllVariableSizeArrays'
cfg.ConstantInputs '消除'

输出参数

全部折叠

生成的MEX函数,作为函数句柄返回。这个MEX函数具有以下签名。

(mv, newOnlineData信息)= mexFcn (x, lastMV onlineData)

MEX函数有以下输入参数,它们与对应的输入参数相同nlmpcmoveCodeGeneration

输入参数 描述
X

当前预测模型状态,指定为长度向量N.X,在那里N.X为预测模型的状态数。

lastMV

在先前控制时间间隔植物中使用的控制信号,指定为长度的矢量N.mv,在那里N.mv是操纵变量的数量。

onlineData 必须在运行时更新的在线控制器数据,指定为结构。使用。生成初始结构getCodeGenerationData.的字段设置的详细信息onlineData, 看nlmpcmoveCodeGeneration

MEX函数有以下输出参数,它们与的输出参数相同nlmpcmoveCodeGeneration

输出参数 描述
mv

最优操纵变量控制动作,返回为长度的列向量N.mv,在那里N.mv是操纵变量的数量。

newOnlineData

更新在线控制器数据,作为结构返回。这个结构和onlineData,只是更新了决策变量的初始猜测。

信息 解决方案细节,作为结构返回。

为了模拟使用所生成的MEX功能的控制器,使用初始在线数据结构onlineData第一控制间隔。对于后续的控制区间,修改在线数据newOnlineData并通过更新结构到MEX功能onlineData

介绍了R2020a