基于非线性模型预测控制的摆锤起摆控制
本例采用非线性模型预测控制器对象和块实现了倒立摆在推车上的摆起和平衡控制。
本例需要最优化工具箱软件为非线性MPC提供默认的非线性规划求解器,以计算每个控制区间的最优控制移动。
摆/车总成
本例中的工厂是一个摆/推车组件,其中z推车位置和θ是摆角。这个系统的操纵变量是一个可变的力F在推车上行动。力的范围在-100年
而且One hundred.
.脉冲干扰dF也可以推动钟摆。
控制目标
假设摆/推车组件的初始条件如下。
马车停在z=
0
.钟摆处于向下的平衡位置θ=
-π
.
控制目标为:
摆起控制:最初将摆摆摆到倒平衡位置z=
0
而且θ=0
.推车位置参考跟踪:将推车移动到一个新的位置,改变步长设定值,保持摆摆倒立。
摆平衡:当有量级的脉冲扰动时
2
应用于倒立摆,保持摆的平衡,并使推车回到原来的位置。
向下的平衡位置是稳定的,而反向的平衡位置是不稳定的,这使得单线性控制器的起摆控制更具挑战性,而非线性MPC很容易处理。
控制结构
在本例中,非线性MPC控制器具有以下I/O配置。
一个操纵变量:可变力(F)
两个测量输出:小车位置(z)和摆角(θ)
另外两个状态,推车速度(zdot)和钟摆角速度(thetadot)是不可测量的。
而购物车位置的设定值,z,可以变化,摆角的设定值,θ,总是0
(倒平衡位)。
创建非线性MPC控制器
创建一个具有适当尺寸的非线性MPC控制器nlmpc
对象。在本例中,预测模型具有4
州,2
输出,1
输入(MV)。
Nx = 4;Ny = 2;Nu = 1;Nlobj = nlmpc(nx, ny, nu);
在标准代价函数中,默认情况下对一个或多个ov应用零权重,因为mv比ov少。
预测模型的采样时间为0.1
秒,与控制器采样时间相同。
Ts = 0.1;nlobj。Ts=Ts;
设置预测水平为10
这段时间足够捕捉植物的主要动态,但又不会长到影响计算效率。
nlobj。PredictionHorizon = 10;
将控制水平设置为5
,这段时间足够给控制器足够的自由度来处理不稳定模式,而不引入过多的决策变量。
nlobj。ControlHorizon = 5;
指定非线性植物模型
非线性模型预测控制的主要好处是,它使用非线性动态模型来预测未来大范围运行条件下的工厂行为。
这种非线性模型通常是由一组微分方程和代数方程(DAEs)组成的第一原理模型。在本例中,定义了一个离散时间推车和摆系统pendulumDT0
函数。这个函数集成了连续时间模型,pendulumCT0
,在控制区间之间使用多步前向欧拉方法。非线性状态估计器也使用了相同的函数。
nlobj.Model.StateFcn =“pendulumDT0”;
要使用离散时间模型,请设置模型。IsContinuousTime
属性假
.
nlobj.Model.IsContinuousTime = false;
预测模型使用一个可选参数,Ts
,表示采样时间。使用此参数意味着,如果在设计过程中更改了预测样本时间,则不必修改pendulumDT0
文件。
nlobj.Model.NumberOfParameters = 1;
两个植物输出分别是模型中的第一和第三状态,小车位置和摆角。方法中定义了相应的输出函数pendulumOutputFcn
函数。
nlobj.Model.OutputFcn =“pendulumOutputFcn”;
最好的做法是尽可能提供分析雅可比函数,因为它们可以显著提高模拟速度。在本例中,使用匿名函数为输出函数提供雅可比矩阵。
nlobj.Jacobian.OutputFcn = @(x,u,Ts) [1 0 0 0;0 0 10 0];
由于不为状态函数提供雅可比矩阵,非线性MPC控制器在优化过程中使用数值扰动估计状态函数雅可比矩阵。这样做在一定程度上降低了模拟速度。
定义成本和约束条件
与线性MPC一样,非线性MPC在每个控制区间解决一个有约束的优化问题。然而,由于工厂模型是非线性的,非线性MPC将最优控制问题转化为具有非线性代价函数和非线性约束的非线性优化问题。
本例中使用的代价函数与线性MPC使用的标准代价函数相同,其中强制执行输出引用跟踪和操纵变量移动抑制。因此,请指定标准MPC调优权重。
nlobj.Weights.OutputVariables = [3 3];nlobj.Weights.ManipulatedVariablesRate = 0.1;
推车位置受范围限制-10
来10
.
nlobj.OV(1)。Min = -10;nlobj.OV(1)。Max = 10;
力的范围在-100年
而且One hundred.
.
nlobj.MV.Min = -100;nlobj.MV.Max = 100;
验证非线性MPC控制器
在设计了一个非线性MPC控制器对象之后,最好检查为预测模型定义的函数、状态函数、输出函数、自定义代价和自定义约束,以及它们的雅可比矩阵。要做到这一点,请使用validateFcns
命令。该函数检测这些函数中的任何维度和数值不一致。
X0 = [0.1;0.2;-pi/2;0.3];U0 = 0.4;validateFcns (nlobj x0,情况,[],{Ts});
模型。StateFcn是OK的。模型。OutputFcn是OK。雅可比矩阵。OutputFcn是OK。分析了用户提供的模型、成本和约束函数。
状态估计
在这个例子中,只有两个植物状态(推车位置和摆角)是可测量的。因此,您可以使用扩展卡尔曼滤波器来估计四种植物状态。其状态转移函数定义在pendulumStateFcn.m
其测量函数定义为pendulumMeasurementFcn.m
.
EKF = extendedKalmanFilter(@pendulumStateFcn, @pendulumMeasurementFcn);
MATLAB®闭环仿真
通过设置初始设备状态和输出值指定模拟的初始条件。另外,指定扩展卡尔曼滤波器的初始状态。
模拟区域的初始条件如下。
马车停在z= 0。
钟摆处于向下的平衡位置,θ=
-π
.
X = [0;0;-pi;0];Y = [x(1);x(3)];卡尔曼滤波器。状态= x;
mv
是在任意控制间隔上计算的最优控制移动。初始化mv
到零,因为一开始作用在推车上的力是零。
Mv = 0;
在模拟的第一阶段,钟摆从向下的平衡位置摆动到反向的平衡位置。此阶段的状态引用全部为零。
Yref1 = [0 0];
在那时10
几秒钟后,推车离开了位置0
来5
.设置此位置的状态引用。
Yref2 = [5 0];
使用nlmpcmove
命令,计算每个控制间隔的最优控制移动。此函数构造一个非线性规划问题,并使用fmincon
函数。
属性指定预测模型参数nlmpcmoveopt
对象,并将该对象传递给nlmpcmove
.
Nloptions = nlmpcmoveopt;nloptions。参数= {Ts};
运行模拟20.
秒。
持续时间= 20;Hbar = waitbar(0,“模拟进展”);xHistory = x;为ct = 1:(20/Ts)%设置引用如果ct*Ts<10 yref = yref1;其他的Yref = yref2;结束使用当前的测量来纠正先前的预测。xk = correct(EKF, y);计算最优控制步数。[mv,nloptions,info] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions);预测下一次迭代的预测模型状态。预测(卡尔曼滤波器,[mv;Ts]);实现第一次最优控制移动和更新工厂状态。x = pendulumDT0(x,mv,Ts);生成带有白噪声的传感器数据。Y = x([1 3]) + randn(2,1)*0.01;保存植物状态以供显示。xHistory = [xHistory x];% #好< * AGROW >waitbar(百巴ct * Ts / 20日);结束关上(百巴)
绘制闭环响应图。
图subplot(2,2,1) plot(0:Ts:Duration,xHistory(1,:)) xlabel(“时间”) ylabel (“z”)标题(“车位置”) subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:)) xlabel(“时间”) ylabel (“zdot”)标题(“车速度”) subplot(2,2,3) plot(0:Ts:Duration,xHistory(3,:)) xlabel(“时间”) ylabel (“θ”)标题(“摆角”) subplot(2,2,4) plot(0:Ts:Duration,xHistory(4,:)) xlabel(“时间”) ylabel (“thetadot”)标题(“摆速度”)
的摆角图显示钟摆在两秒内成功摆动起来。在起摆过程中,小车位移的峰值偏差为-1
,并回到原来的位置2
秒。
的车的位置图中显示推车成功移动到z=5
两秒钟。当推车移动时,摆的位移峰值偏差为1
弧度(57
度),并在大约的时间返回到反向平衡位置12
秒。
用MATLAB中的FORCESPRO求解器进行闭环仿真
您可以轻松地使用第三方非线性规划求解器以及使用模型预测控制工具箱软件设计的非线性MPC对象。例如,如果你安装了Embotech的FORCESPRO软件,你可以使用他们的MPC工具箱插件生成一个有效的自定义NLP求解器nlmpc
对象,并使用求解器进行仿真和代码生成。
方法生成自定义求解器nlmpcToForces
命令。可以选择使用内点(IP)求解器或使用顺序二次规划(SQP)求解器nlmpcToForcesOptions
命令。
选项= nlmpcToForcesOptions();选项。SolverName =“MyIPSolver”;选项。SolverType =“InteriorPoint”;选项。参数= Ts;选项。X0 = [0;0;-pi;0];选项。mv0=0;[coredata, onlinedata] = nlmpcToForces(nlobj,options);
的nlmpcToForces
function生成自定义MEX函数nlmpcmove_MyIPSolver
,您可以使用它来加速闭环模拟。
X = [0;0;-pi;0];Mv = 0;卡尔曼滤波器。状态= x;Y = [x(1);x(3)];Hbar = waitbar(0,“模拟进展”);xHistory = x;为ct = 1:(20/Ts)%设置引用如果ct * Ts < 10 onlinedata。Ref = repmat(yref1,10,1);其他的onlinedata。Ref = repmat(yref2,10,1);结束使用当前的测量来纠正先前的预测。xk = correct(EKF, y);使用FORCESPRO求解器计算最优控制移动。[mv,onlinedata,info] = nlmpcmove_MyIPSolver(xk,mv,onlinedata);预测下一次迭代的预测模型状态。预测(卡尔曼滤波器,[mv;Ts]);实现第一次最优控制移动和更新工厂状态。x = pendulumDT0(x,mv,Ts);生成带有白噪声的传感器数据。Y = x([1 3]) + randn(2,1)*0.01;保存植物状态以供显示。xHistory = [xHistory x];% #好< * AGROW >waitbar(百巴ct * Ts / 20日);结束关上(百巴)
正如预期的那样,闭环响应与使用fmincon
像预期的那样。
Simulink中的闭环仿真金宝app
在Simulink中对非线性MPC控制器进行闭环仿真验证。金宝app
打开Simulin金宝appk模型。
mdl =“mpc_pendcartNMPC”;open_system (mdl)
在这个模型中,非线性MPC控制器块被配置为使用先前设计的控制器,nlobj
.
为了在预测模型中使用可选参数,该模型有一个Simulink总线块连接到金宝app参数个数
非线性MPC控制器块的输入端口。配置此总线块以使用Ts
参数,在MATLAB工作空间中创建一个总线对象,并配置总线创建器块以使用该对象。要做到这一点,请使用createParameterBus
函数。在本例中,命名Bus对象“myBusObject”
.
(mdl createParameterBus (nlobj/非线性MPC控制器),“myBusObject”, {Ts});
在M金宝appATLAB工作区中创建了一个Simulink总线对象“myBusObject”,并配置了总线创建器块“mpc_pendcartNMPC/非线性MPC控制器”来使用它。
运行模拟30.
秒。
open_system ([mdl/范围的]) sim (mdl)
与MATLAB仿真相比,Simulink中的非线性仿真得金宝app到了相同的摇摆和小车位置跟踪结果。还有一个推(脉冲干扰)dF
)的时间作用于倒立摆20.
秒。非线性MPC控制器成功地抑制了扰动,使小车恢复正常z=5
把钟摆摆到倒立的平衡位置。
用Simulink中的FORCESPRO求解器进行闭环仿真金宝app
您还可以使用Embotech FORCESPRO软件中的FORCES非线性MPC块,使用生成的自定义NLP求解器来模拟非线性MPC。
如果您安装了FORCESPRO软件,请打开mpc_pendcartFORCESPRO
建模并运行到完成。闭环响应与所使用的响应相似fmincon
.
结论
本例介绍了在MATLAB和Simulink中使用MATLAB语言设计和模拟非线性MPC的一般工作流程金宝appnlmpc
对象和非线性MPC控制器块。根据具体的非线性装置特性和控制要求,实现细节可能有很大差异。主要设计挑战包括:
选择适当的视野、界限和权重
设计一种非线性状态估计器
设计自定义非线性代价函数和约束函数
选择解算器选项或选择自定义NLP解算器
您可以使用本例中的函数和Simulink模型作为其他非线性M金宝appPC设计和仿真任务的模板。
这两个nlmpcmoveCodeGeneration
命令从模型预测控制工具箱软件和nlmpcmoveForces
命令来自FORCESPRO支持MATLAB代码金宝app生成。无论是非线性MPC块从模型预测控制工具箱软件和非线性MPC
block from FORCESPRO支金宝app持在Simulink中生成代码。金宝app