主要内容

nlmpcmoveCodeGeneration

使用代码生成支持计算非线性MPC控制移动万博1manbetx

描述

例子

[mvnewOnlineData) = nlmpcmoveCodeGeneration (coreDataXlastMVonlinedata.计算最优的非线性MPC控制移动,并支持代码生成以部署到实时目标。万博1manbetx控制移动使用当前预测模型状态(X),则控制从上一个控制间隔(lastMV),以及输入数据结构(coreDatanlOnlineData)生成的使用getCodeGenerationData

nlmpcmoveCodeGeneration不检查输入参数以获得正确的尺寸和数据类型。

[___信息) = nlmpcmoveCodeGeneration (___返回有关优化结果的其他信息,包括迭代次数和目标函数成本。

例子

全部折叠

创建一个具有四个状态,两个输出和一个输入的非线性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)。最小值= -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是好的。model.outputfcn是好的。分析用户提供的模型,成本和约束函数完成。

只有两个植物状态是可衡量的。因此,创建一个扩展的卡尔曼滤波器,用于估计四个工厂状态。它的状态转换功能是定义的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。裁判= [0 0];

为了验证控制器的运行,运行一个模拟10秒。在每个控制间隔期间:

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

  2. 计算最优控制移动使用nlmpcmoveCodeGeneration.这个函数返回计算得到的最佳序列onlinedata..将更新后的数据结构传递给nlmpcmoveCodeGeneration在下一个控制区间中提供最优序列的初始猜测。

  3. 预测模型状态。

  4. 将第一个计算的最佳控制移动到工厂,更新植物状态。

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

  6. 拯救植物状态。

mv = mv0;y = y0;x = x0;时间= 10;xHistory = x0;CT = 1 :(持续时间/ TS)正确的先前预测xk =正确(卡尔曼滤波器,y);%计算最优控制移动[mv, onlineData] = nlmpcmoveCodeGeneration (coreData xk, mv, onlineData);% Predict下一次迭代的预测模型状态预测(卡尔曼滤波器,[mv;Ts]);%实施第一最佳控制移动x = pendulumDT0 (x, mv, Ts);%生成传感器数据Y = X([1 3])+ RANDN(2,1)* 0.01;%保存植物状态xHistory = [xHistory x];结束

用MATLAB®Coder™生成一个MEX函数,指定coreData是一个常数。

func =“nlmpcmoveCodeGeneration”;funcOutput =“nlmpcmoveMEX”;Cfg = coder.config ('mex');cfg.dynamicmemoryallocation =.“关闭”;codegen (“配置”,cfg,func,“o”funcOutput,'-args'...{coder.Constant (coreData), xk, mv, onlineData});
代码生成成功。

输入参数

全部折叠

在运行时恒定的非线性MPC配置参数,指定为使用的结构getCodeGenerationData

笔记

当使用codegen(MATLAB编码器)coreData必须定义为编码器。常数(MATLAB编码器)

当前预测模型状态,指定为长度向量NX,在那里NX为预测模型的状态数。中定义了预测模型状态函数nlobj.Model.StateFcn

由于非线性MPC控制器不执行状态估计,因此必须在每个控制间隔处测量或估计当前预测模型状态。有关非线性MPC预测模型的更多信息,请参阅为非线性MPC指定预测模型

在以前的控制间隔内,设备中使用的控制信号,指定为长度的列向量Nmv,在那里Nmv为被操纵变量的个数。

笔记

指定lastMV随着操纵变量信号在先前的控制间隔中施加到工厂。通常,这些信号是由控制器生成的值(mv).然而,情况并非总是如此。例如,如果您的控制器离线并运行在跟踪模式;即控制器输出不驱动被控对象,然后将实际控制信号馈电给被控对象last_mv当控制器在线切换后,可以帮助实现无闷吸的转移。

必须在运行时更新的在线控制器数据,指定为具有以下字段的结构。使用。生成初始结构getCodeGenerationData.有些结构字段不是必需的,这取决于控制器的配置以及在运行时变化的权重或约束。

植物输出参考值,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。

要在整个预测范围内使用相同的参考值,请指定行向量。

从时间从预测地平线上变化参考值K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的参考值。如果指定小于P.行,最后一行中的值用于预测视界的其余步骤。

如果控制器的成本函数不使用裁判,离开裁判默认值。

被操纵的变量目标,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。

要在整个预测范围内使用相同的操纵变量目标,请指定行向量。

随着时间的推移,在预测视界(预览)范围内改变目标K.时间K.+P.-1,指定一个数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的目标。如果指定小于P.行,最终目标用于预测视界的其余步骤。

如果控制器的成本函数不使用mvTarget,离开mvTarget默认值。

最佳状态解决方案的初始猜测,指定为长度的行矢量万博 尤文图斯NX或一个阵列NX列,NX是状态数。

要在预测地平线上使用相同的初始猜测,请指定行向量。

在不同时间的预测范围内改变最初的猜测K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的初始猜测。如果指定小于P.行,最终猜测用于预测地平线的其余步骤。

通常,在闭环模拟期间,您不需要指定X0你自己。相反,当调用nlmpcmoveCodeGeneration,返回newOnlineData参数,其中包含已更新的X0估计。你就可以通过了newOnlineDataonlinedata.输入参数nlmpcmoveCodeGeneration为下一个控制间隔。

最优操纵变量解的初始猜测,指定为长度的行向量万博 尤文图斯Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。

要在预测地平线上使用相同的初始猜测,请指定行向量。

在不同时间的预测范围内改变最初的猜测K.时间K.+P.-1,指定一个数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的初始猜测。如果指定小于P.行,最终猜测用于预测地平线的其余步骤。

通常,在闭环模拟期间,您不需要指定MV0你自己。相反,当调用nlmpcmoveCodeGeneration,返回newOnlineData参数,其中包含已更新的MV0估计。你就可以通过了newOnlineDataonlinedata.输入参数nlmpcmoveCodeGeneration为下一个控制间隔。

松弛变量在解处的初始猜想,指定为非负标量。

通常,在闭环模拟期间,您不需要指定Slack0你自己。相反,当调用nlmpcmoveCodeGeneration,返回newOnlineData参数,其中包含已更新的Slack0估计。你就可以通过了newOnlineDataonlinedata.输入参数nlmpcmoveCodeGeneration为下一个控制间隔。

测量的扰动值,指定为长度的行向量N医学博士或一个阵列N医学博士列,N医学博士是测量障碍的数量。如果您的控制器有衡量的干扰,则必须指定医学博士.如果控制器没有可测量的扰动,那么getCodeGenerationData省略了这一领域。

要在整个预测视界使用相同的扰动值,请指定行向量。

从时间从预测地平线上变化干扰值K.时间K.+P.,指定最多的数组P.+ 1行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步长的扰动值。如果指定小于P.行,最后一行中的值用于预测视界的其余步骤。

的预测模型、自定义成本函数和自定义约束使用的参数值,指定为长度等于的单元格向量Model.numberof Parameters.属性。如果控制器没有参数,则getCodeGenerationData省略了这一领域。

参数的顺序必须符合为预测模型、自定义成本函数和自定义约束定义的顺序。

在运行时替换默认调优权重的输出变量调优权重,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。如果您希望输出变量权重在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测范围内使用相同的权重,请指定行向量。

根据时间改变预测视界上的权重K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的权重。如果指定小于P.行,最终权重用于预测范围的其余步骤。

操纵可变调谐重量,可在运行时更换默认调谐权重,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果您希望在运行时进行操纵的可变权重,则必须在通话时将此字段添加到在线数据结构getCodeGenerationData

要在整个预测范围内使用相同的权重,请指定行向量。

根据时间改变预测视界上的权重K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的权重。如果指定小于P.行,最终权重用于预测范围的其余步骤。

在运行时替换默认调优权重的操纵可变速率调优权重,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果您希望操作的可变速率重量在运行时会有所不同,则必须在致电时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测范围内使用相同的权重,请指定行向量。

根据时间改变预测视界上的权重K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的权重。如果指定小于P.行,最终权重用于预测范围的其余步骤。

松弛可变率调优权重,它在运行时替换默认调优权重,指定为正标量。如果希望松弛变量权重在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

在运行时替换默认下界的输出变量下界,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。如果您希望输出变量下界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

输出变量上界,在运行时替换默认上界,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。如果希望输出变量上界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

状态下界,在运行时替换默认下界,指定为长度的行向量NX或一个阵列NX列,NX是状态数。如果希望状态下界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

状态上界,在运行时替换默认上界,指定为长度的行向量NX或一个阵列NX列,NX是状态数。如果希望状态上界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

操纵可变的可变下限,替换运行时的默认下限,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果希望操纵变量的下界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

操纵可变的上限,替换运行时的默认上限,指定为长度的行矢量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果希望操纵变量的上界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

在运行时替换默认下界的操纵变量速率下界,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果您希望操纵的可变速率下限在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

在运行时替换默认上限的操纵变量速率上限,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果希望操纵的可变速率上限在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData

要在整个预测视界中使用相同的边界,请指定行向量。

根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。

输出参数

全部折叠

最优操纵变量控制动作,返回为长度的列向量Nmv,在那里Nmv为被操纵变量的个数。

如果求解器会聚到局部最佳解决方案(信息。ExitFlag.是积极的),然后呢mv包含最优解。

如果求解器达到最大迭代次数,找到可行次最优解(信息。ExitFlag = 0):

  • coredata.usesuboptimalsolution真正的, 然后mv包含次优解

  • coredata.usesuboptimalsolution, 然后mv包含lastMV

如果求解器无法找到可行的解决方案(信息。ExitFlag.是负的),然后呢mv包含lastMV

更新在线控制器数据,作为结构返回。这个结构和onlinedata.,除了决策变量初始猜测(X0MV0,Slack0)更新。

对于随后的控制间隔,温暖的开始通过修改在线数据,求解器newOnlineData并将更新的结构传递给nlmpcmoveCodeGeneration作为onlinedata..这样做允许求解器使用判定变量初始猜测作为其解决方案的起点。

解决方案详细信息,作为具有以下字段的结构返回。

最佳操纵变量序列,返回为a(P.+ 1)——-Nmv数组,P.预测的范围是和吗Nmv为被操纵变量的个数。

MVopt(我,:)包含每次计算的最优操纵变量值k +张, 为了我= 1,…,p,在那里K.为当前时间。mvopt(1,:)包含与输出参数相同的操纵变量值mv.由于控制器不计算最优控制移动时刻k + p: MVopt (p + 1)等于MVopt (p,:)

最优预测模型状态序列,返回为(P.+ 1)——-NX数组,P.预测的范围是和吗NX为预测模型中的状态数。

Xopt(我,:)包含时刻的计算状态值k +张, 为了我= 2,…,p + 1,在那里K.为当前时间。: Xopt (1)是否与当前状态相同X

最优输出变量序列,返回为P.+ 1)——-Ny数组,P.预测的范围是和吗Ny为输出数。

Yopt(我,:)在时间包含计算的输出值k +张, 为了我= 2,…,p + 1,在那里K.为当前时间。Yopt(1,:)是基于当前状态计算的X测量到的电流会干扰医学博士,如果任何。

预测水平时间序列,返回为长度的列向量P.+ 1,P.是预测视界。Topt包含时间序列K.时间K.+P.,在那里K.为当前时间。

Topt (1)= 0表示当前时间。随后的时间步长Topt(我)Ts *(张),在那里Ts为控制器采样时间。

使用Topt当策划mvopt.Xopt,或Yopt序列。

最优松弛变量ε用于约束软化,返回为非负标量值。

  • ε = 0 -在整个预测视界内,所有软约束均得到满足。

  • ε > 0 -至少违反了一个软约束。当违反多个约束时,ε表示最坏情况的软约束违反(根据每个约束的ECR值进行缩放)。

优化退出代码,返回如下内容之一:

  • 正整数-找到最优解

  • 0.-最大迭代次数后找到的可行次最优解

  • 负整数 - 找不到可行的解决方案

求解器使用的迭代次数,返回为正整数。

目标函数代价,作为非负标量值返回。成本量化了控制人员实现其目标的程度。

成本值只有在ExitFlag.是非负面的。

扩展功能

介绍了R2020a