主要内容

mpcmovecodegeneration.

计算最佳控制与代码生成支持移动万博1manbetx

描述

例子

mnewstateata.] = mpcmovecodegeneration(configdata.stateDataonlineData计算最佳MPC控制移动,并支持部署到实时目标的代码生成。万博1manbetx使用的输入数据结构使用getcodegenerationData.,定义MPC控制器以模拟。

mpcmovecodegeneration.不检查输入参数是否正确的维度和数据类型。

___信息] = mpcmovecodegeneration(___返回关于优化结果的附加信息,包括迭代次数和目标函数成本。

例子

全部收缩

创建一个适当的工厂模型。

植物= RSS(3,1,1);Plant.d = 0;

指定控制器采样时间。

t = 0.1;

创建MPC控制器。

mpcobj = MPC(植物,TS);
mpc对象的“PredictionHorizon”属性是空的。尝试PredictionHorizon = 10。mpc对象的"ControlHorizon"属性为空。假设2。- - - >“权重。米anipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.

创建代码生成数据结构。

[configdata,stateata,onlinedata] = getcodegenerationdata(mpcobj);
- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。

将工厂状态初始化为零以匹配MPC控制器使用的默认状态。

运行闭环仿真。在每个控制间隔,更新在线数据结构并呼叫mpcmovecodegeneration.计算最佳控制移动。

x =零(尺寸(植物,1),1);%初始化植物状态为零(|mpcObj|默认)。Tsim = 20;为了i = 1:圆形(尖/ Ts) + 1%更新工厂输出。y = plant.c * x;%更新在线数据中的测量输出。onlinedata.signals.ym = y;%更新在线数据中的参考信号。onlinedata.signals.ref = 1;%compute控制操作。[u, statedata] = mpcmoveCodeGeneration (configData, statedata onlineData);%更新工厂状态。x = plant.a * x + plant.b * u;结尾

使用MATLAB®Coder™生成MEX功能,指定configdata.作为一个常数。

Func =.'mpcmovecodegeneration';funcoutput =.'mpcmovemex';cfg = coder.config(墨西哥人的);Cfg。DynamicMemoryAllocation ='离开';Codegen('-config'Cfg函数,'-O',funcoutput,“参数”......{coder.constant(configdata),stateata,onlinedata});
代码成功。

输入参数

全部收缩

MPC配置参数在运行时常量,指定为使用的结构getcodegenerationData.

请注意

使用时Codegen.(MATLAB编码器)configdata.必须定义为编码器.Constant.(MATLAB编码器)

控制器在运行时的状态,指定为结构。使用。生成初始状态结构getcodegenerationData..有关后续控制间隔,请使用上一间隔从更新的控制器状态。一般来说,使用newstateata.直接结构。

如果启用了自定义状态估计,则必须手动更新stateData每个控制间隔期间的结构。有关更多信息,请参阅自定义国家估计

stateData有以下字段:

工厂模型状态估计,指定为长度的柱矢量NXP., 在哪里NXP.是植物模型状态的数量。

请注意

如果启用自定义状态估计,请更新植物在每个控制间隔。否则,请勿更改该字段。相反,使用其中一个返回的值getcodegenerationData.要么mpcmovecodegeneration.

未测量的扰动模型状态估计,指定为长度的列向量NXD., 在哪里NXD.是未测量的扰动模型状态的数量。骚乱包含输入干扰模型状态,然后是输出干扰模型状态。

要查看输入和输出干扰模型,请使用getGet推荐分别。

请注意

如果启用自定义状态估计,请更新骚乱在每个控制间隔。否则,请勿更改该字段。相反,使用其中一个返回的值getcodegenerationData.要么mpcmovecodegeneration.

输出测量噪声模型状态估计,指定为长度的列向量NXN., 在哪里NXN.是噪声模型状态的数量。

请注意

如果启用自定义状态估计,请更新噪音在每个控制间隔。否则,请勿更改该字段。相反,使用其中一个返回的值getcodegenerationData.要么mpcmovecodegeneration.

操纵可变控制从先前的控制间隔移动,指定为长度的列向量Nm, 在哪里Nm是操纵变量的数量。

请注意

不要改变价值篮球.始终使用任何一个返回的值getcodegenerationData.要么mpcmovecodegeneration.

用于控制器状态估计的协方差矩阵,指定为对称性N-经过-N阵列,其中N是扩展控制器州的数量;也就是说,总和NXP.NXD., 和NXN.

如果控制器使用自定义状态估计,协方差是空的。

请注意

不要改变价值协方差.始终使用任何一个返回的值getcodegenerationData.要么mpcmovecodegeneration.

有效的不等式约束,其中的不等式的相等部分是真的,指定为长度的逻辑向量.如果IA.)是真的,那么对于最新的QP求解解决方案,不平等是活跃的。

请注意

不要改变价值IA..始终使用任何一个返回的值getcodegenerationData.要么mpcmovecodegeneration.

您必须在运行时更新的在线控制器数据,指定为具有以下字段的结构。使用初始结构使用getcodegenerationData.

更新的输入和输出信号,指定为具有以下字段的结构:

测量输出,指定为长度的向量Nym., 在哪里Nym.是测量输出的数量。

默认情况下,getcodegenerationData.ym.到控制器的公称测量输出值。

输出引用,指定为以下之一:

  • 长度的行矢量Ny, 在哪里Ny是输出的数量。

  • 如果您使用的是使用隐式或Adaptive MPC预览的参考信号,请指定ap-经过-Ny阵列,其中p是预测视界。

默认情况下,getcodegenerationData.裁判从控制器到标称输出值。

测量的扰动,指定为:

  • 一排矢量长度Nm, 在哪里Nm是测量障碍的数量。

  • 如果您使用使用隐式或Adaptive MPC使用信号预览,请指定ap-经过-Nm大批。

默认情况下,如果您的控制器具有测量的干扰,getcodegenerationData.m从控制器到标称测量的扰动值。否则,此字段为空且忽略mpcmovecodegeneration.

中定义的目标configdata.utarget.,指定为以下之一:

  • 长度矢量Nm, 在哪里Nm是操纵变量的数量

  • []使用定义的默认目标configdata.utarget.

使用显式MPC控制器时忽略此字段。

在外部应用于工厂的操纵变量,指定为:

  • 长度矢量Nm

  • []将最优控制移动到设备上。

更新QP优化权值,指定为结构。如果您不希望在运行时更改调优权重,则忽略它重量.使用显式MPC控制器时忽略此字段。

此结构包含以下字段:

输出可变调谐重量,可在运行时在运行时更换原始控制器输出权重,指定为行向量或非负值阵列。

要在整个预测范围内使用相同的权重,请指定长度的行向量Ny, 在哪里Ny是输出变量的数量。

在预测范围内随时间改变调优权值k+1时间k+p,指定一个数组Ny列和最多p行。在这里,k当前的时间是和p是预测视界。每行包含一个预测水平步骤的输出变量调优权值。如果指定小于p行,最终行中的权重用于预测地平线的剩余步骤。

如果y是空的,[],则使用原MPC控制器中定义的默认权重。

操作变量调优权值替换运行时初始控制器操作变量权值,指定为非负值的行向量或数组。

要在整个预测范围内使用相同的权重,请指定长度的行向量Nm, 在哪里Nm是操纵变量的数量。

在预测范围内随时间改变调优权值k时间k+p-1,指定阵列Nm列和最多p行。在这里,k当前的时间是和p是预测视界。每行包含一个预测地平线步骤的操纵变量调谐权重。如果指定小于p行,最终行中的权重用于预测地平线的剩余步骤。

如果u是空的,[],则使用原MPC控制器中定义的默认权重。

被操纵的可变速率调优权值替换运行时初始控制器被操纵的可变速率权值,指定为非负值的行向量或数组。

要在整个预测范围内使用相同的权重,请指定长度的行向量Nm, 在哪里Nm是操纵变量的数量。

在预测范围内随时间改变调优权值k时间k+p-1,指定阵列Nm列和最多p行。在这里,k当前的时间是和p是预测视界。每行包含一个预测地平线步骤的操纵可变速率调谐权重。如果指定小于p行,最终行中的权重用于预测地平线的剩余步骤。

如果是空的,[],则使用原MPC控制器中定义的默认权重。

用于约束软化的松弛变量的重量,指定为非负标量。

如果eCR.是空的,[],使用原始MPC控制器中定义的默认重量。

更新的输入和输出约束,作为结构指定。如果您不期望约束在运行时更改,则忽略限制.使用显式MPC控制器时忽略此字段。

此结构包含以下字段:

输出可变下限,指定为长度的列向量Nyymin(i)取代outputvariables(i).min来自原始控制器的约束。如果outputvariables(i).min控制器的属性被指定为向量,ymin(i)替换这个向量中的第一个有限项,并移动其余的值以保持相同的约束概要。

如果ymin是空的,[],使用原始MPC控制器中定义的默认界限。

输出变量上限,指定为长度的列向量Nyymax(我)取代OutputVariables(我)。马克斯来自原始控制器的约束。如果OutputVariables(我)。马克斯控制器的属性被指定为向量,ymax(我)替换这个向量中的第一个有限项,并移动其余的值以保持相同的约束概要。

如果ymax.是空的,[],使用原始MPC控制器中定义的默认界限。

被操纵可变下限,指定为长度的列向量Nm嗯(i)取代Manipulatedvariables(i).min来自原始控制器的约束。如果Manipulatedvariables(i).min控制器的属性被指定为向量,嗯(i)替换这个向量中的第一个有限项,并移动其余的值以保持相同的约束概要。

如果um是空的,[],使用原始MPC控制器中定义的默认界限。

被操纵的可变上限,指定为长度的柱矢量Nmumax(i)取代Manipulatedvariables(i).max来自原始控制器的约束。如果Manipulatedvariables(i).max控制器的属性被指定为向量,umax(i)替换这个向量中的第一个有限项,并移动其余的值以保持相同的约束概要。

如果umax.是空的,[],使用原始MPC控制器中定义的默认界限。

更新了自定义混合输入/输出约束,指定为结构。使用显式MPC控制器时忽略此字段。

此结构具有以下字段:

操纵变量约束常数,指定为一个Nc-经过-Nm阵列,其中Nc是约束的数量,和Nm是操纵变量的数量。

如果E是空的,[],使用原始MPC控制器中定义的相应约束。

受控输出约束常量,指定为一个Nc-经过-Ny阵列,其中Ny是受控输出的数量(测量和未测量)。

混合输入/输出约束常数,指定为长度的列向量Nc

测量的干扰约束常数,指定为一个Nc-经过-Nm阵列,其中Nm是测量障碍的数量。

更新了控制器视野,指定为结构。要在运行时变化视野,首先使用使用数据结构getcodegenerationData.设置udervarifehorizo​​n.名称 - 值对真的.当您改变视野时,必须指定预测地平线和控制范围。有关更多信息,请参阅在运行时调整视野

使用显式MPC控制器时忽略此字段。

此结构具有以下字段:

预测地平线,取代了价值configData.p在运行时,指定为正整数。

指定p更改:

  • 返回的最佳序列中的行数信息

  • 中字段的最大尺寸模型什么时候configdata.isltv.真的

控制地平线,取代了值configData.m在运行时,指定为以下之一:

  • 正整数,, 之间1p,包容,在哪里p是预测的地平线(horizons.p)。在这种情况下,控制器计算自由控制动作时有发生k通过k+-1,并保持控制器输出常数,用于剩余的预测地平线步骤k+通过k+p-1。在这里,k是当前的控制间隔。用于最佳轨迹规划集等于p

  • 矢量阳性整数,[12,其中整数的和等于预测视界,p.在这种情况下,控制器计算自由移动块,在哪里是控制地平线矢量的长度。第一个免费移动适用于时间k通过k+1-1,第二个自由举动适用于时间k+1通过k+1+2-1,等等。与默认情况相比,使用块移动可以提高控制器的稳健性。

更新的植物和自适应MPC和时变MPC标称值,指定为一个结构。模型仅在指定时可用isadaptive.要么ISLTV.作为真的创建代码生成数据结构时。

此结构包含以下字段:

离散时间状态空间对象模型的状态矩阵,具体为:

  • Nx-经过-Nx在使用自适应MPC时,

  • Nx-经过-Nx-经过-(p+1)使用时变MPC时的数组,

在哪里Nx是植物的数量。

离散时间空间工厂模型的输入到状态矩阵,指定为:

  • Nx-经过-Nu在使用自适应MPC时,

  • Nx-经过-Nu-经过-(p+1)使用时变MPC时的数组,

在哪里Nu是植物输入的数量。

离散时间 - 空间工厂模型的状态到输出矩阵,指定为:

  • Ny-经过-Nx当使用自适应MPC时。

  • Ny-经过-Nx-经过-(p使用时变MPC时的+1)阵列。

离散时间 - 空间植物模型的馈通矩阵,指定为:

  • Ny-经过-Nu当使用自适应MPC时。

  • Ny-经过-Nu-经过-(p使用时变MPC时的+1)阵列。

由于MPC控制器不支持直接馈通的工厂,因此指定万博1manbetxD作为一系列零。

名义植物国家,指定为:

  • 长度的柱矢量Nx使用Adaptive MPC时。

  • 一个Nx-by-1-by-(p使用时变MPC时的+1)阵列。

标称植物投入,指定为:

  • 长度的柱矢量Nu使用Adaptive MPC时。

  • 一个Nu-by-1-by-(p使用时变MPC时的+1)阵列。

标称植物产出,指定为:

  • 长度的柱矢量Ny使用Adaptive MPC时。

  • 一个Ny-by-1-by-(p使用时变MPC时的+1)阵列。

名义植物状态衍生物,指定为:

  • 长度的柱矢量Nx使用Adaptive MPC时。

  • 一个Nx-by-1-by-(p使用时变MPC时的+1)阵列。

输出参数

全部收缩

最优操纵变量移动,返回为长度的列向量Nm, 在哪里Nm是操纵变量的数量。

如果控制器检测到不可行的优化问题或遇到解决不良优化问题的数值困难,m仍然是最近成功的解决方案,XC.LastMove.

否则,如果优化问题是可行的,并且求解器达到指定的最大迭代次数而不找到最佳解决方案,m

  • 仍然是最近的成功解决方案优化器.Usesuboptimalsolution.控制器的财产是错误的

  • 在最终迭代后是否达到次最优解优化器.Usesuboptimalsolution.控制器的财产是真的.有关更多信息,请参阅次优QP解决方案

更新的控制器状态,作为结构返回。对于后续的控制间隔,通过newstateata.mpcmovecodegeneration.作为stateData

如果启用了自定义状态估计,请使用newstateata.在下一个控制间隔之前手动更新状态结构。有关更多信息,请参阅自定义国家估计

控制器优化信息,作为结构返回。

如果您使用的是隐式或Adaptive MPC,信息包含以下字段:

场地 描述
迭代 QP Solver迭代的数量
QPCode. QP求解器状态代码
成本 客观函数成本
Uopt. 最佳操纵变量调整
Yopt. 最优预测输出变量序列
XOPT. 最佳预测状态变量序列
top 时间间隔
松弛 限制软化的松弛变量

如果configdata.onlyComputecost.真的,最佳序列信息,Uopt.Yopt.XOPT.top, 和松弛,不可用:

有关更多信息,请参阅mpcmovempcmoveAdaptive

如果您使用的是显式MPC,信息包含以下字段:

场地 描述
地区 找到最佳解决方案的区域
ExitCode. 解决方案状态码

有关更多信息,请参阅mpcmoveexplict.

扩展能力

介绍了R2016a