本实例使用模型预测控制器(MPC)来控制小车上的倒立摆。
此示例需要Simulink®控制设计™ 通过金宝app将非线性Simulink模型线性化来定义MPC结构的软件。
如果~mpcchecktoolbox已安装(“slcontrol”) disp (“金宝app需要Simulink控制设计来运行这个例子。”)返回终止
这个例子的工厂是下面的推车/摆总成,其中x推车的位置是和吗西塔为摆角。
该系统通过施加可变力来控制F在车上。控制器需要在将小车移动到新位置时或在脉冲扰动推动摆锤向前移动时保持摆锤直立dF应用于倒立摆的上端。
该工厂使用常用模块在Simulink中建模。金宝app
mdlPlant=“mpc_pendcartPlant”加载系统(mdlPlant)开放系统([mdlPlant“/摆锤和推车系统”],“武力”)
假设小车/摆总成的初始条件如下:
马车停在原地不动x=0
.
倒立摆固定在直立位置西塔=0
.
控制目标是:
车可以移动到一个新的位置之间-10
和10
随着阶跃设定点的改变。
跟踪此类设定点变化时,上升时间应小于4秒(性能),超调量应小于5.
百分比(鲁棒性)。
当脉冲扰动的大小为2.
应用于摆锤时,小车应返回其原始位置,最大位移为1.
.钟摆也应恢复到直立位置,最大角位移为15
学位(0.26
弧度)。
倒立摆的直立位置是一个不稳定的平衡,这使得控制任务更具挑战性。
对于本例,使用单个MPC控制器:
一个操纵变量:可变力F.
两个测量输出:小车位置x和摆角西塔.
一种未测量的干扰:脉冲干扰dF.
mdlMPC=“mpc_pendcartImplicitMPC”;开放式系统(mdlMPC)
虽然车速度x_点和摆角速度θ点是可从工厂模型,使设计情况更现实,他们被排除作为MPC测量。
当小车位置设定值变化时(阶跃输入),摆角设定值不变(0
=直立位置)。
由于MPC控制器需要线性时不变(LTI)对象模型进行预测,因此在初始工作点将Simulink对象模型线性化。金宝app
指定线性化输入和输出点。
io (1) = linio ([mdlPlant“/dF”],1,“openinput”);io (2) = linio ([mdlPlant“楼”],1,“openinput”); io(3)=linio([mdlPlant“/摆锤和推车系统”],1,“openoutput”);io (4) = linio ([mdlPlant“/摆锤和推车系统”],3,“openoutput”);
为电厂初始条件创建操作点规范。
opspec=operspec(mdlPlant);
第一种状态是购物车位置x已知初始状态为0。
opspec.States(1)。知道= true;opspec.States(1)。x = 0;
第三种状态是摆角西塔已知初始状态为0。
操作规范状态(3).Known=true;操作规范状态(3).x=0;
使用这些规格计算工作点。
选择= findopOptions (“显示报告”、假);op = findop (mdlPlant、opspec选项);
在指定的操作点获得线性设备模型。
plant=线性化(mdlPlant、op、io);plant.InputName={“dF”;“F”};工厂。OutputName = {“x”;“西塔”};
检查线性化设备的极点。
极(植物)
ans=0-11.9115-3.21385.1253
工厂有一个积分器和一个不稳定的极点。
bdclose(mdlPlant)
工厂有两个输入,dF和F,以及两项输出,x和西塔.在这个例子中,dF指定为MPC控制器用于更好地抑制干扰的未测量干扰。设置设备信号类型。
工厂=设置MPCSignals(工厂,“ud”,1,“mv”2);
为了控制不稳定的对象,控制器采样时间不能太大(抗干扰能力差)或太小(计算负载过大)。类似地,预测范围不能太长(电厂不稳定模式将占主导地位)或太短(违反约束将是不可预见的)。在此示例中使用以下参数:
t = 0.01;PredictionHorizon = 50;ControlHorizon = 5;mpcobj = mpc(植物、Ts、PredictionHorizon ControlHorizon);
-->“mpc”对象的“Weights.manufacturedVariables”属性为空。“mpc”对象的“Weights.manufacturedVariablesRate”属性为空。“mpc”对象的“Weights.OutputVariables”属性为空。“mpc”对象的“Weights.OutputVariables”属性为空。“mpc”对象的“Weights.OutputVariables”属性为空。假设默认值为1.00000,输出y2的权重为零
在多大的力可以施加到小车上是有限制的,这被指定为操纵变量的硬约束F.
mpcobj.MV.Min = -200;mpcobj.MV.Max = 200;
在设计重量之前,按比例计算工厂的投入和产出是一个很好的做法。在这种情况下,由于被操纵变量的范围比被操作对象输出的范围大两个数量级,因此将输入的MV按比例缩放100
.
mpcobj.MV.ScaleFactor = 100;
为了提高控制器的鲁棒性,增加MV变化率的权重0.1
到1.
.
mpcobj.Weights.MVRate = 1;
为了达到平衡性能,调整工厂产量的权重。第一个重量与车的位置有关x第二个权重与角度相关西塔.
mpcobj.Weights.OV=[1.21];
为了实现更积极的干扰抑制,通过将默认干扰模型增益乘以10
.
更新输入干扰模型。
disturbance_model = getindist (mpcobj);setindist (mpcobj“模型”,扰动_模型*10);
——>模型转换为离散时间。——>”模式。“mpc”对象的干扰属性为空:假设未测输入干扰#1为综合白噪声。假设对测量的输出通道#1没有增加任何干扰。——>假设添加到测量输出通道2上的输出扰动为集成白噪声。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。
更新输出扰动模型。
disturbance_model = getoutdist (mpcobj);setoutdist (mpcobj“模型”,扰动_模型*10);
-->将模型转换为离散时间。“mpc”对象的“model.noise”属性为空。假设未向测量输出通道#1添加干扰。-->假设向测量输出通道#2添加的输出干扰为集成白噪声。-->“mpc”对象的“model.noise”属性为空。假设每个测量输出通道上都存在白噪声。
在Simulink中进行闭环仿真验证MPC设计。金宝app
open_system ([mdlMPC/范围的])sim卡(mdlMPC)
-->将模型转换为离散时间。-->“mpc”对象的“model.Noise”属性为空。假设每个测量的输出通道上都有白噪声。
在非线性仿真中,成功地实现了所有的控制目标。
必须指出,设计的MPC控制器有其局限性。例如,如果将阶跃设定点更改为15
,摇锤在转换过程中无法恢复其垂直位置。
为了在相同的上升时间内达到较长的距离,控制器在开始时对小车施加较大的力。结果,钟摆从它的直立位置被移出一个更大的角度,如60
度。在这种角度下,植物动态与在以下条件下获得的LTI预测模型存在显著差异:西塔=0
.结果,对对象行为的预测误差超过了内置MPC鲁棒性所能处理的范围,控制器无法正常运行。
避免摆锤下落的一个简单解决方法是通过向摆锤添加软输出约束来限制摆锤位移西塔减少约束软化的ECR权重。
mpcobj.OV(2)。Min = -π/ 2;mpcobj.OV(2)。Max =π/ 2;mpcobj.Weights.ECR = 100;
然而,使用这些新的控制器设置,它不再可能在所需的上升时间内达到更长的距离。换句话说,为了避免违背软输出约束,牺牲了控制器的性能。
为了在相同的上升时间内达到更长的距离,控制器需要在不同角度建立更精确的模型,以改进预测。另一个例子小车上倒立摆的增益计划MPC控制演示了如何使用增益调度MPC来实现较长的距离。
关闭Simulink金宝app模型。
bdclose (mdlMPC)