模拟和生成代码的MPC控制器,带有自定义QP求解

这个例子展示了如何模拟和用于使用自定义二次规划(QP)解算器模型预测控制器生成代码。这个例子的植物是在一个的Simulink直流伺服电机。金宝app

DC-伺服电机型号

直流伺服电机模型是在[1]中描述的线性动态系统。是电动机的连续时间状态空间模型。牛头是允许的最大扭矩,你作为一个输出的制约条件使用。

[植物,tau蛋白] = mpcmotormodel;

设计MPC控制器

该植物具有一个输入,电动机输入电压。MPC控制器使用该输入作为操作变量(MV)。该工厂具有两个输出,电动机的角位置和轴转矩。角位置的测量输出(MO),以及轴转矩不可测量(UO)。

植物= setmpcsignals(植物,'MV'1,'MO'1,'UO',2);

约束操纵变量是介于+/-220伏。由于植物的输入和输出是不同量级的,便于调谐,使用缩放因子。比例因子的典型的选择是上/下限或工作范围。

MV =结构(“最低”,-220,“最大”,220,'比例因子',440);

有对角位置没有限制。上指定和期间的前三个预测水平线步骤降低对轴扭矩界限。要定义这些界限,使用牛头

OV =结构(“最低”,{ - 天道酬勤,[-tau; -tau; -tau; -Inf]},...“最大”{Inf文件,τ; tau蛋白; tau蛋白; Inf文件]},'比例因子',{2 * PI,2 *的tau});

控制任务是实现零的跟踪误差的角度位置。因为你只具有一个操纵变量,允许通过其调谐权重设置为零轴扭矩到浮子其限制内。

权重=结构('MV',0,'MVRate',0.1%,'OV'[0.1 0]);

指定采样时间和视野,并创建MPC控制器,使用作为预测模型。

TS = 0.1;% 采样时间P = 10;%的预测范围m = 2时;%控制范围mpcobj = MPC(植物中,Ts,P,M,重量,MV,OV);

模拟在Simulink与金宝app内置QP求解

要运行剩余的例子,Simulink中是必需的。金宝app

如果〜mpcchecktoolboxinstalled('金宝appSIMULINK')DISP(的金宝appSimulink需要运行这个例子。“返回结束

打开使用MPC金宝app控制器的直流伺服电机模拟了闭环控制Simulink模型。默认情况下,MPC采用的是内置的QP求解器使用的KWIK算法。

MDL ='mpc_customQPcodegen';open_system(MDL)

运行仿真

SIM(MDL)
- >转换模型,以离散时间。假设没有干扰加到测量到的输出信道#1。- >的“MPC”对象的“Model.Noise”属性是空的。假设在每个测得的输出信道的白噪声。

存储在工作区MATLAB植物输入和输出信号。

uKWIK = U;yKWIK = Y;

模拟在Simulink中金宝app使用自定义QP求解

要研究如何自定义求解器的行为相同的条件下,能够在MPC控制器定制求解。

mpcobj.Optimizer.CustomSolver = TRUE;

您还必须提供一个MATLAB®函数满足以下要求:

  • 函数名称必须是mpcCustomSolver

  • 输入和输出参数必须在模板文件中的参数相匹配。

  • 函数必须在MATLAB的路径。

在这个例子中,使用在模板文件中定义的自定义QP求解mpcCustomSolverCodeGen_TemplateEML.txt,它实现了算法,适合于代码生成。保存功能在你的工作文件夹mpcCustomSolver.m

SRC =其中('mpcCustomSolverCodeGen_TemplateEML.txt');DEST =完整文件(PWD,'mpcCustomSolver.m');的CopyFile(SRC,DEST,'F'

模拟闭环直流伺服马达的控制,并保存该植物的输入和输出。

SIM(MDL)uDantzigSim = U;yDantzigSim = Y;
- >转换模型,以离散时间。假设没有干扰加到测量到的输出信道#1。- >的“MPC”对象的“Model.Noise”属性是空的。假设在每个测得的输出信道的白噪声。

生成代码使用自定义QP求解

要运行剩余的例子,Simulink的编码器产品是必需的。金宝app

如果〜mpcchecktoolboxinstalled('金宝appsimulinkcoder')DISP(的金宝appSimulink(R)编码器(TM)需要运行这个例子。“返回结束

为了从使用自定义QP求解器的MPC控制器块码,启用对MPC控制器代码生成选项定制解算器。

mpcobj.Optimizer.CustomSolverCodeGen = TRUE;

您还必须提供一个MATLAB®函数,满足下列所有条件:

  • 函数名称必须是mpcCustomSolverCodeGen

  • 输入和输出参数必须在模板文件中的参数相匹配。

  • 函数必须在MATLAB的路径。

在这个例子中,使用解算器所定义的相同的自定义mpcCustomSolverCodeGen_TemplateEML.txt。保存功能在你的工作文件夹mpcCustomSolverCodeGen.m

SRC =其中('mpcCustomSolverCodeGen_TemplateEML.txt');DEST =完整文件(PWD,'mpcCustomSolverCodeGen.m');的CopyFile(SRC,DEST,'F'

查看保存的mpcCustomSolverCodeGen.m文件。

功能[X,状态] = mpcCustomSolverCodeGen(H,F,A,B,X0)%#代码生成%mpcCustomSolverCodeGen允许用户指定自定义(QP)解算器%写在嵌入式MATLAB由MPC控制器在代码生成中使用。%工作流程:%(1)该模板文件复制到你的工作文件夹,重命名为% “mpcCustomSolverCodeGen.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolverCodeGen.m”用你的解算器。%请注意,您的嵌入式MATLAB求解器只能使用固定大小的数据。%(3)设置 “mpcobj.Optimizer.CustomSolverCodeGen = true” 将告诉MPC%控制器以使用在代码生成的解算器。%要生成的代码:%在MATLAB中,使用 “CODEGEN” 与 “mpcmoveCodeGeneration” 命令(需要MATLAB编码器)%在Sim金宝appulink中,生成与MPC和MPC自适应代码块(需要Simuink编码器产品)下载188bet金宝搏%若要使用该解算器中的仿真MATLAB和Simulink,您需要:金宝app%(1)复制“mpcCustomSolver.txt”模板文件到您的工作文件夹%其重命名为“mpcCustomSolver.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolver.m”用你的解算器。%(3)设置 “mpcobj.Optimizer.CustomSolver = true” 将告诉MPC%控制器使用解算器中仿真。%的MPC QP问题定义如下:%分钟Ĵ(X)= 0.5 * X '* H * X + F' * X,S.T.A * X> = B。%输入(由MPC控制器在运行时提供):%H:正乘n Hessian矩阵,这是对称和正定的。%F:一个n乘1的列向量。%A:不等式约束系数的m乘n矩阵。%B:的不等式约束的右手侧的一个m乘1向量。%X0:最优解的初始猜测的n乘1向量。%输出(发送回MPC控制器在运行时):%×:必须是最佳的解决方案的n乘1向量。%状态:必须是整数:%正值:迭代次数的计算中使用的%0:达到最大迭代次数%-1:QP是不可行%-2:无法找到一个解决方案由于其他原因% 注意:%(1)当求解器未能找到最佳的解决方案(状态<= 0),“×”%仍需要返回。%(2)在使用MPC亚最佳QP溶液,则返回该次优的“x”%与 “状态= 0”。此外,你需要设置%在MPC控制器 “mpcobj.Optimizer.UseSuboptimalSolution =真”。%不要改变线的上方%该模板求解采用了农具的展示QP“丹”算法%由G. B.丹,A.奥登和P.沃尔夫,“广义单纯形法%下线性不等式约束最小化的线性的形式”,数学,5%太平洋J.:183-195,1955。%的用户预计将修改此模板和插件自定义的QP求解%,取代了“丹”的算法。ZERO =零('喜欢',H);ONE =一('喜欢',H);%XMIN是常数项,增加了初步基础,因为“丹”%需要积极优化变量。固定的“XMIN”不工作%对于所有MPC问题。XMIN = -1e3 *酮(尺寸(F(:)))* ONE;MAXITER = 200 * ONE;NVAR =长度(F);NCON =长度(B);一个= -H * XMIN(:);H = H ^ \眼(NVAR);RHSC = A * XMIN(:)  -  B(:);的rHSA = A-F(:);TAB =  -  [H H * A '; A * H A * H * A'];basisi = [H *的rHSA; rhsc + A*H*rhsa]; ibi = -(1:nvar+ncon)'*ONE; ili = -ibi*ONE;%%呼叫EML功能 “qpdantzg”[基础,IB,IL,ITER] = qpdantzg(TAB,basisi,IBI,伊犁,MAXITER);%#确定%% 状态如果ITER> MAXITER状态= ZERO;ELSEIFITER 其他状态= ITER;结束%%最佳变量X =零(NVAR,1,'喜欢',H);对于J = 1:NVAR如果IL(J)<= ZERO X(j)的= XMIN(J);其他X(j)的基础=(IL(J))+ XMIN(J);结束结束

从使用Simulink模型生成可执行代码金宝apprtwbuild从编码器的Simulink金宝app命令。

rtwbuild(MDL)
###开始构建过程为:mpc_customQPcodegen  - >转换模型离散时间。假设没有干扰加到测量到的输出信道#1。- >的“MPC”对象的“Model.Noise”属性是空的。假设在每个测得的输出信道的白噪声。###构建过程的顺利完成为:mpc_customQPcodegen

在Windows系统上,构建过程完成后,软件会将可执行文件mpc_customQPcodegen.exe你的工作文件夹。

运行可执行文件。成功的可执行文件完成后(状态= 0),该软件增加了数据文件mpc_customQPcodegen.mat你的工作文件夹。数据文件的加载到MATLAB工作区中,并获得由可执行所产生的植物的输入和输出信号。

如果ISPC状态=系统(MDL);负载(MDL)uDantzigCodeGen = U;yDantzigCodeGen = Y;其他DISP(“这个例子只能运行在Windows系统上可执行。”);结束
这个例子只能运行在Windows系统上的可执行文件。

比较模拟结果

比较来自所有模拟工厂输入和输出信号。

如果ISPC图副区(2,1,1)图(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,...'+',u.time,uDantzigCodeGen.signals.values,'O')副区(2,1,2)图(y.time,yKWIK.signals.values,y.time,yDantzigSim.signals.values,...'+',y.time,yDantzigCodeGen.signals.values,'O')图例('KWIK'“丹思慕”“丹的CodeGen”'位置''西北'其他图副区(2,1,1)图(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,'+')副区(2,1,2)图(y.time,yKWIK.signals.values,y.time,yDantzigSim.signals.values,'+')图例('KWIK'“丹思慕”'位置''西北'结束

从所有的模拟信号是相同的。

参考

[1] Bemporad,A。和莫斯卡,E.“通过引用管理履行在不确定系统硬约束”。。自动化卷。34,第4号,第451-461,1998。

bdclose(MDL)

也可以看看

功能

相关话题