文档

用自定义QP求解器模拟和生成MPC控制器代码

这个例子展示了如何为使用自定义二次规划(QP)求解器的模型预测控制器模拟和生成代码。本例中的工厂是Simulink®中的直流伺服电机。金宝app

直流伺服电机模型

直流伺服电机模型是[1]中描述的线性动态系统。植物为电机的连续时间状态空间模型。τ是最大允许扭矩,用作输出约束。

[plant,tau] = mpcmotormodel;

MPC控制器设计

装置有一个输入,电机输入电压。MPC控制器使用这个输入作为被操纵的变量(MV)。该装置有两个输出,电机角位置和轴转矩。角度位置是测量的输出(),轴转矩未测量(UO)。

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

将被操纵的变量限制在+/-之间220伏特。由于工厂的输入和输出是不同的数量级,为了便于调整,使用比例因子。比例因子的典型选择是上/下限值或工作范围。

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

对角度位置没有约束。在前三个预测水平步骤中指定轴扭矩的上限和下限。要定义这些边界,使用τ

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

控制任务是实现角位置的零跟踪误差。由于您只有一个可操纵的变量,因此可以通过将其调谐权重设置为零来允许轴扭矩在其约束范围内浮动。

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

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

Ts = 0.1;%采样时间P = 10;%预测范围M = 2;%控制水平mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);

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

要运行剩下的示例,需要使用Simulink。金宝app

如果~ mpcchecktoolboxinstalled (“金宝app模型”) disp (需金宝app要Simulink来运行这个例子返回结束

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

mdl =“mpc_customQPcodegen”;open_system (mdl)

运行模拟

sim (mdl)
——>将模型转换为离散时间。假设没有干扰添加到测量输出通道#1。——>”模式。没有ise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

将植物输入和输出信号存储在MATLAB工作空间中。

uKWIK = u;yKWIK = y;

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

要检查自定义求解器在相同条件下的行为,请在MPC控制器中启用自定义求解器。

mpcobj.Optimizer.CustomSolver = true;

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

  • 函数名必须为mpcCustomSolver

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

  • 函数必须在MATLAB路径上。

在本例中,使用模板文件中定义的自定义QP求解器mpcCustomSolverCodeGen_TemplateEML.txt,它实现dantzig算法和适合的代码生成。将函数保存在工作文件夹中为mpcCustomSolver.m文件。

SRC =哪(“mpcCustomSolverCodeGen_TemplateEML.txt”);Dest = fullfile(pwd,“mpcCustomSolver.m”);拷贝文件(src,桌子,“f”

模拟直流伺服电机的闭环控制,节省工厂输入和输出。

sim(mdl) uDantzigSim = u;yDantzigSim = y;
——>将模型转换为离散时间。假设没有干扰添加到测量输出通道#1。——>”模式。没有ise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

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

要运行剩下的示例,需要Simulink Coder产品。金宝app

如果~ mpcchecktoolboxinstalled (“金宝appsimulinkcoder”) disp (运金宝app行此示例需要Simulink(R) Coder(TM)。返回结束

若要从使用自定义QP求解器的MPC控制器块生成代码,请启用MPC控制器中用于代码生成选项的自定义求解器。

mpcobj.Optimizer.CustomSolverCodeGen = true;

您还必须提供满足以下所有要求的MATLAB®函数:

  • 函数名必须为mpcCustomSolverCodeGen

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

  • 函数必须在MATLAB路径上。

中定义的自定义求解器mpcCustomSolverCodeGen_TemplateEML.txt。将函数保存在工作文件夹中为mpcCustomSolverCodeGen.m

SRC =哪(“mpcCustomSolverCodeGen_TemplateEML.txt”);Dest = fullfile(pwd,“mpcCustomSolverCodeGen.m”);拷贝文件(src,桌子,“f”

查看已保存的文件mpcCustomSolverCodeGen.m文件。

函数[x, status] = mpcCustomSolverCodeGen(H, f, A, b, x)% # codegen% mpcCustomSolverCodeGen允许用户指定自定义(QP)求解器%用嵌入式MATLAB编写,可用于MPC控制器的代码生成。%的工作流程:%(1)复制此模板文件到您的工作文件夹,并将其重命名为%”mpcCustomSolverCodeGen.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolverCodeGen”。用你的解算器。请注意,您的嵌入式MATLAB求解器必须只使用固定大小的数据。%(3)设置“mpcobj.Optimizer”。CustomSolverCodeGen = true"告诉MPC%控制器在代码生成中使用求解器。%生成代码:在MATLAB中,使用“codegen”命令和“mpcmoveCodeGeneration”(需要MATLAB编码器)在Simu金宝applink中,使用MPC和Adaptive MPC块生成代码(需要Simuink编码器产品)下载188bet金宝搏要在MATLAB和Simulink中使用此求解器进行仿真,您需要:金宝app%(1)复制“mpcCustomSolver.txt”模板文件到你的工作文件夹,然后%重命名为“mpcCustomSolver.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolver”。用你的解算器。%(3)设置“mpcobj.Optimizer”。CustomSolver = true”来告诉MPC%控制器中使用求解器进行仿真。MPC QP问题定义如下:% min J(x) = 0.5*x'*H*x + f'*x, s. A*x >= b。%输入(MPC控制器在运行时提供):% H:一个n × n的黑森矩阵,它是对称的,正定的。% f:一个n × 1列向量。% A:不等式约束系数的m × n矩阵。% b:不等式约束右侧的m × 1向量。% x0:最优解的初始猜测的n × 1向量。%输出(在运行时发送回MPC控制器):% x:必须是最优解的n × 1向量。% status:必须为以下整数:%正值:计算中使用的迭代次数% 0:达到的最大迭代数% -1: QP不可行% -2:由于其他原因未能找到解决方案%请注意:%(1)当求解器无法找到最优解(状态<=0)时,“x”%仍然需要返回。%(2)在MPC中使用次优QP方案,返回次优“x”% with "status = 0"。此外,还需要设置%”mpcobj.Optimizer。UseSuboptimalSolution = true"在MPC控制器。%不改变上面的行此模板使用“Dantzig”算法实现了一个展示QP求解器G. B. Dantzig, A. Orden和P. Wolfe,“广义单纯形法”%用于在线性不等式约束下最小化线性形式”,%数学学报,5(5):183 - 1955,1995。期望用户修改此模板并插入自己的自定义QP求解器%取代“Dantzig”算法。0 = 0“喜欢”、H);ONE = ones“喜欢”、H);% xmin是一个常量项,它加在初始基上,因为“dantzig”%需要正优化变量。固定的“xmin”不起作用%为所有MPC问题。xmin = -1e3*ones(size(f(:)))*ONE;maxiter = 200*ONE;Nvar = length(f);Ncon = length(b);a = -H*xmin(:);H = H\eye(nvar);rhsc = A*xmin(:) - b(:);rsa = a-f(:);TAB = -[h h * a '; a * h * h * a '];basisi = [H*rhsa; rhsc + A*H*rhsa]; ibi = -(1:nvar+ncon)'*ONE; ili = -ibi*ONE;%%调用EML函数"qpdantzg"[基数,基数,基数,基数]= qpdantzg(基数,基数,基数,基数,基数,基数);% #好< ASGLU >% %状态如果iter > maxiter状态= 0;elseifiter < 0 status = - 1;其他的状态= iter;结束%%最佳变量X = 0 (nvar,1,“喜欢”、H);J = 1:nvar如果x(j) = xmin(j);其他的X (j) = basis(il(j))+xmin(j);结束结束

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

rtwbuild (mdl)
mpc_customQPcodegen—>将模型转换为离散时间假设没有干扰添加到测量输出通道#1。——>”模式。没有ise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. ### Successful completion of build procedure for model: mpc_customQPcodegen

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

运行可执行文件。在可执行文件成功完成后(状态= 0),软件添加数据文件mpc_customQPcodegen.mat到您的工作文件夹。将数据文件加载到MATLAB工作空间中,并获得可执行程序生成的植物输入输出信号。

如果Ispc状态= system(mdl);load(mdl) uDantzigCodeGen = u;yDantzigCodeGen = y;其他的disp (这个例子只在Windows系统上运行可执行文件。);结束
**启动模型** **创建mpc_customQPcodegen。垫* *

比较仿真结果

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

如果ispc figure subplot(2,1,1) plot(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,“+”u.time uDantzigCodeGen.signals.values,“o”) subplot(2,1,2) plot(y.time,yKWIK.signals.values,y.time,yDantzigSim.signals.values,“+”y.time yDantzigCodeGen.signals.values,“o”)传说(“KWIK”“Dantzig一场”“Dantzig CodeGen”“位置”“西北”其他的图subplot(2,1,1)图(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,“+”) subplot(2,1,2) plot(y.time,yKWIK.signals.values,y.time,yDantzigSim.signals.values,“+”)传说(“KWIK”“Dantzig一场”“Dantzig CodeGen”“位置”“西北”结束

所有模拟的信号都是一样的。

参考文献

[1]本波拉德,A.和莫斯卡,E.。“通过参考管理实现不确定线性系统的硬约束。”自动化,第34卷第4号,第451-461页,1998年。

bdclose (mdl);
这个话题有帮助吗?