主要内容

带不可测输出约束的直流伺服电机显式MPC控制

这个例子展示了如何使用显式MPC来控制电压和轴扭矩约束下的直流伺服机构。

有关使用传统隐式MPC的类似示例,请参见具有不可测输出约束的直流伺服电机.有关此植物的相关示例,请参见位置伺服机构的MPC控制器设计

定义直流伺服电机模型

mpcmotormodel函数返回示例所需的工厂模型。中定义了线性开环动力学模型植物.的变量τ是最大允许扭矩,这将被用作输出约束。

[plant,tau] = mpcmotormodel;

展示植物的基本特征。

大小(植物)潮湿(植物)
具有2个输出、1个输入和4个状态的状态空间模型。极阻尼频率时间常数(rad/秒)(秒)1.52e-15 -1.00e+00 1.52e-15 -6.59e+14 -7.05e-01 + 7.31e+00i 9.59e-02 7.35e+00 1.42e+00 - 9.59e-02 7.35e+00 -9.79e+00 1.00e+00 9.79e+00 1.02e- 1.02

装置控制输入为直流电压,四个状态变量为负载和电机轴的角位置和速度。可测量的输出是负载的角位置。第二个输出,扭矩,是不可测量的。有关更多信息,请参见位置伺服机构的MPC控制器设计

指定MPC控制器的输入和输出信号类型。

植物= setmpcsignals(植物,“MV”,1,“莫”,1,“UO”2);

指定的约束

被操纵的变量被限制在+/- 220伏之间。由于工厂输入和输出具有不同的数量级,您还可以使用比例因子来促进MPC调优。比例因子的典型选择是上限/下限或操作范围。

MV = struct(“最小值”, -220,“马克斯”, 220,“ScaleFactor”, 440);

+|tau|和-|tau|的扭矩约束仅在前三个预测步骤中施加。还要为两个输出(负载角度和扭矩)指定一个比例因子。

OV = struct(“最小值”,{正无穷,τ,τ;τ;负)},...“马克斯”,{正无穷,τ;τ,τ;正]},...“ScaleFactor”,{2π* 2 *τ});

指定调优权重

控制任务是为角位置获取零跟踪偏移。由于只有一个操纵变量,因此通过将轴扭矩的权重设置为零,允许轴扭矩在其约束范围内浮动。

权重= struct(“MV”0,“MVRate”, 0.1,机汇的, 0.1 [0]);

创建MPC控制器

创建具有采样时间的MPC控制器Ts,预测视界10步骤,并控制地平线2步骤。

Ts = 0.1;mpcobj = mpc(plant,Ts,10,2,Weights,MV,OV);

计算闭环直流增益矩阵

计算闭环的稳态输出灵敏度。零值意味着被测量的设备输出可以跟踪所需的输出参考设定值。

cloffset (mpcobj)
——>转换模型到离散时间。假设测量的输出通道1没有任何扰动。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。Ans = 1.1102e-16

明确的政策委员会

被操纵变量和输出中的约束将MPC控制器的状态空间划分为许多多面体区域,这样在每个区域内,MPC控制律是一个特定的仿射状态和引用函数,其系数取决于区域。显式MPC离线计算所有这些区域及其相对控制律。在线时,控制器只需选择并应用相对于当前区域的预计算解,因此它不必在每个控制步骤中求解约束二次优化问题。有关显式MPC的更多信息,请参见明确的政策委员会

生成显式MPC控制器

显式MPC执行传统MPC控制器定义的MPC控制律的等效显式分段仿射版本。要从传统的MPC控制器生成显式MPC控制器,必须为每个控制器状态、参考信号、操纵变量和测量扰动指定范围。这样做可以确保二次规划问题在由这些范围定义的空间中得到解决。如果在运行时,这些自变量中的一个超出了它的范围,控制器返回一个错误状态,并将被操作的变量设置为它们的最后值。因此,不要低估这些范围是很重要的。

要生成合适的范围,首先要获得控制器状态的一些信息。

显示输入和输出扰动模型的大小

为了得到控制器输入和输出扰动模型,使用getindist而且getoutdist,分别。

大小(getindist (mpcobj))大小(getoutdist (mpcobj))
具有0输出、0输入和0状态的状态空间模型。具有2个输出、0个输入和0个状态的状态空间模型。

该控制器不使用任何扰动模型。

显示控制器初始状态

要显示控制器的初始状态,使用mpcstate

mpcstate (mpcobj)
MPCSTATE对象与字段Plant:[0 0 0 0 0]扰动:[1x0 double]噪声:[1x0 double] LastMove: 0协方差:[4x4 double]

正如预期的那样,Kalman估计器使用的植物模型有4个状态,然后还需要一个额外的状态来保存被操纵变量的最后一个值。

获取一个用于初始化的范围结构

若要创建可以为每个状态、引用和操作变量指定范围的范围结构,请使用generateExplicitRange

range = generateExplicitRange(mpcobj);

指定控制器状态、引用和操纵变量的范围

MPC控制器状态按顺序包括来自植物模型、扰动模型、噪声模型和被操纵变量的最后一个值的状态。当状态与物理参数不对应时,设置状态变量的范围有时很困难。在这种情况下,建议使用典型的参考信号和扰动信号(包括模型不匹配)进行多次开环植物模拟,以收集反映状态范围的数据。

在本例中,由于电机与负载轴之间的传动比为20,因此要高估状态变量(负载角位置、负载角速度、电机轴角位置、电机轴角速度)的实际变化范围,如下所示。

range.State.Min(,) =[4 * 4π*π/ Ts 4 * 4π* 20 *π* 20 / Ts);range.State.Max(,) =[4 * 4π*π/ Ts 4 * 4π* 20 *π* 20 / Ts);

通常你知道在工厂的标称工作点上使用的参考信号的实际范围。用于生成显式MPC控制器的范围必须至少与实际范围一样大。注意,扭矩参考的范围是固定的0由于转矩是不可测量的,因此控制器不使用任何参考信号。

range.Reference.Min = [-5;0];range.Reference.Max = [5;0];

如果操作变量受到约束,则用于生成显式MPC控制器的范围必须至少与这些限制一样大。

range.ManipulatedVariable.Min = MV。Min - 1;range.ManipulatedVariable.Max = MV。Max + 1;

创建具有指定范围的显式MPC控制器。

mpcobjExplicit = generateExplicitMPC(mpcobj,range)
发现/未开拓的地区:77/0明确MPC控制器  --------------------------------------------- 控制器样品时间:0.1(秒)多面区域:77数量的参数:6是解决方案简化:没有状态估计:默认卡尔曼增益  --------------------------------------------- “mpcobjExplicit类型。MPC’的原始隐式MPC设计。“mpcobjExplicit类型。Range'表示有效的参数范围。“mpcobjExplicit类型。OptimizationOptions'用于多参数QP计算的选项。“mpcobjExplicit类型。pieceaffinresolution '用于每个解决方案中的区域和增益。

沿给定截面分段仿射划分

您可以绘制控制器状态空间的2D部分,并查看该部分中的区域。对于本例,绘制由第一个和第二个状态变量(负载角和角速度)定义的状态空间的2D部分。为此,您必须首先创建一个图结构,在其中将所有其他状态(和参考信号)固定为各自范围内的特定值。

若要创建参数结构,可以指定随后绘制哪个2-D部分,请使用generatePlotParameters函数。

plotpars = generatePlotParameters(mpcobjExplicit);

在本例中,您将第一个状态变量与第二个状态变量相对应。所有其他参数必须固定在各自范围内的值。

指定第三和第四个状态变量的索引,并将它们的值固定为零。

plotpars.State.Index = [3 4];plotpars.State.Value = [0 0];

指定输出参考信号的索引并将其固定到π而且0,分别。

plotpars.Reference.Index = [1 2];plotpars.Reference.Value = [pi 0];

指定被操纵变量的索引,并将其值固定为零。

plotpars.ManipulatedVariable.Index = 1;plotpar . manipulatedvariable . value = 0;

绘制指定的2-D部分。

plotSection (mpcobjExplicit plotpars);轴([-。3 .3 -2 2]);网格标题(分区的部分(x3 (t) = 0 x4 (t) = 0, u (t - 1) = 0, r (t) =π)”)包含(“x1 (t)”) ylabel (“x2 (t)”

使用模拟控制器sim卡函数

比较了传统(隐式)MPC控制器和显式MPC控制器的闭环仿真结果。

Tstop = 8;%秒Tf = round(Tstop/Ts);%模拟迭代R = [pi 0];%参考信号[y1,t1,u1] = sim(mpcobj,Tf,r);%模拟与传统MPC[y2,t2,u2] = sim(mpcobjExplicit,Tf,r);%模拟显式MPC
——>转换模型到离散时间。假设测量的输出通道1没有任何扰动。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。

仿真结果基本一致。

流(隐式和显式MPC轨迹的差异= %g\n...规范(u2-u1) +规范(y2-y1));
隐式和显式MPC轨迹的差异= 6.79044e-12

使用Simulink进行模拟金宝app

在Simulink中模拟线性植物模型的闭环控制。金宝app显式MPC控制器块配置为使用mpcobjExplicit作为控制器。

mdl =“empc_motor”;open_system (mdl) sim (mdl)

所设计的闭环响应与传统MPC控制器相同具有不可测输出约束的直流伺服电机

使用次优显式MPC控制

要减少内存占用,可以使用简化函数减少区域的数量。例如,可以删除切比雪夫半径小于的区域0.08.然而,你所付出的代价是,在这些区域内,控制器的性能是次优的。

mpcobjExplicitSimplified =简化(mpcobjExplicit, mpcobjExplicit,“半径”, 0.08)
Regions to analyze: 77/ 77——>删除37个区域。明确的MPC控制器  --------------------------------------------- 控制器样品时间:0.1(秒)多面区域:40多的参数:6是解决方案简化:是的状态估计:默认卡尔曼增益  --------------------------------------------- “mpcobjExplicitSimplified类型。MPC’的原始隐式MPC设计。“mpcobjExplicitSimplified类型。Range'表示有效的参数范围。“mpcobjExplicitSimplified类型。OptimizationOptions'用于多参数QP计算的选项。“mpcobjExplicitSimplified类型。pieceaffinresolution '用于每个解决方案中的区域和增益。

减少了分段仿射区域的数量。

比较了次优显式MPC和显式MPC的闭环仿真结果。

[y3,t3,u3] = sim(mpcobjExplicitSimplified, Tf, r);
——>转换模型到离散时间。假设测量的输出通道1没有任何扰动。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。

模拟结果不尽相同。

流(“精确和次优显式MPC轨迹的差异= %g\n”...规范(u3-u2) +规范(y3-y2));
精确和次优显式MPC轨迹之间的差异= 439.399

阴谋的结果。

图(t1,y1(:,1),t3,y3(:,1),“:”)网格标题(“角(rad)”)传说(“明确”“次优显式”) subplot(3,1,2) subplot(t1,y1(:,2),t3,y3(:,2),“:”)网格标题(“转矩(Nm)”)传说(“明确”“次优显式”) subplot(3,1,3) subplot(t1,u1,t3,u3,“:”)网格标题(“电压(V)”)传说(“明确”“次优显式”

仿真结果表明,次优显式MPC的性能略差于显式MPC。

参考文献

[1] A. Bemporad和E. Mosca,“利用引用管理实现不确定线性系统中的硬约束”,自动化,第34卷,no。4,页451-461,1998。

bdclose (mdl)

相关的话题