带不可测输出约束的直流伺服电机显式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)