模型预测控制 MPC QP Solver

模型预测控制器QP求解器将线性MPC优化问题转化为一般形式的QP问题

 

X是解向量。
H是Hessian矩阵。当预测模型和调优权重在运行时不发生变化时,这个矩阵是常数。
A是一个线性约束系数矩阵。当您的预测模型在运行时不改变时,这个矩阵是常数。
B和f是向量。

在每个控制间隔开始时,控制器计算H、f、A和b。如果H或A是常数,控制器检索它们的预先计算值。

 

Built-In QP Solvers

模型预测控制工具箱™软件支持解决QP问题的两种内置算法。两个求解器都要求海森矩阵是正定的

﹡Active-set Solver——该求解器可以在单精度和双精度方面为小规模和中等规模的优化问题提供快速和健壮的性能。活动集求解器使用来自[1]的KWIK算法。要使用活动集求解器,请为你的MPC控制器设置Optimizer.Algorithm属性为active-set。要配置算法设置,请使用Optimizer.ActiveSetOptions属性

﹡Interior-point Solver——该求解器可以为大规模优化问题提供卓越的性能,例如MPC应用,在大的预测和控制范围上强制约束。这种内点求解器使用了一种带有Mehrotra预测校正器的原对偶算法。要使用内点求解器,请把MPC控制器设置Optimizer.Algorithm属性为“interior-point”。要配置算法设置,请使用控制器的Optimizer.InteriorPointOptions属性

 

Solver Configuration

在为您的应用程序选择和配置QP求解器时,请考虑以下事项:
MPC问题的大小和配置影响内置QP求解器的性能。要确定哪个求解器最适合您的应用程序,请考虑使用这两个QP求解器跨多个模拟场景模拟控制器。

内点求解器比活动集求解器对求解器参数更敏感。因此,它需要更多的调整来找到性能和鲁棒性之间的最佳平衡。
在测试最优解时,活动集求解器也使用不可调公差。您可以调整内点求解器的最优公差。

由于数值舍入误差,可能会轻微违反一个或多个线性约束。这种违反是正常的,不会产生警告消息。要调整可接受约束违反的容忍度,请为活动集或内点求解器使用ConstrainTolerance设置。
QP解的寻找是一个迭代过程。对于任意一个求解器,您都可以使用相应的MaxIterations设置来指定最大迭代次数。当迭代次数达到最大值时,算法终止。

活动集求解器的默认最大迭代次数为4(nc+ nv),其中nc和nv分别为跨越预测层的约束和优化变量的个数。对于某些控制器配置,此值可能非常大,这可能使QP求解器似乎停止响应。这个值的下界是120。

内点求解器的默认最大迭代次数是50。
如果你的MPC问题在转化为QP问题后包含硬约束,QP不等式约束可能是不可行的(不可能满足)。如果QP求解器检测到不可行性,它立即终止。

 

当求解器检测到一个不可行的问题或达到最大迭代次数而没有找到最优解时,控制器保留最后成功的控制输出。您可以检测异常结果,并根据需要覆盖默认行为

在第一个控制步骤中,QP求解器使用冷启动,其中初始猜测是Unconstrained Model Predictive Control中描述的无约束解。如果x满足约束条件,则为QP最优解,算法终止。否则,至少一个线性不等式约束必须满足作为一个等式,求解器计算最优解。有关后续控制步骤:

活动集求解器使用一个热启动,其中上一个控制步骤中确定的活动约束集成为初始猜测。
内点求解器继续使用冷启动。

 

Suboptimal QP Solution

对于一个有约束的给定MPC应用,没有办法预测需要多少QP求解器迭代才能找到最优解。此外,在实时应用程序中,迭代的数量可以从一个控制间隔到下一个控制间隔发生显著变化。在这种情况下,最坏情况下的执行时间可能超过硬件平台允许的由控制器样本时间确定的限制。

通过在优化迭代次数超过指定的最大值后应用次优解,您可以为MPC控制器设置一个保证的最坏情况执行时间。要设置最坏情况执行时间,首先通过在标称条件下试验控制器来确定单个优化迭代所需的时间。然后,在每个控制区间上设置迭代次数的上界。例如,如果计算硬件上的每个迭代需要大约1毫秒,而控制器采样时间为10毫秒,则将最大迭代次数设置为不大于10。

MPCobj.Optimizer.ActiveSetOptions.MaxIterations = 10;

缺省情况下,MPC控制器对象对活动集求解器的最大迭代次数的下界为120。
默认情况下,当求解器达到没有最优解的求解器迭代的最大数量时,控制器保持其以前的值操纵变量。要使用最终迭代后达到的次优解决方案,请将UseSuboptimalSolution选项设置为true。

MPCobj.Optimizer.UseSuboptimalSolution = true;

当解决方案不是最优的,MPC控制器调整解决方案,使其满足所有指定的约束。
并不能保证次优解比保持控制器输出恒定时表现得更好。您可以使用这两种方法模拟您的系统,并选择提供更好的控制器性能的配置。

For an example, see Use Suboptimal Solution in Fast MPC Applications.

 

Custom QP Applications自定义QP应用程序

要访问需要在线解决QP问题的应用程序的QP求解器,use the mpcActiveSetSolver and mpcInteriorPointSolver functions适用于:

超出模型预测控制工具箱软件范围的高级MPC应用程序。
自定义QP应用程序,包括需要代码生成的应用程序。

 

Custom QP Solver

模型预测控制工具箱软件允许您指定自定义的QP求解器为您的MPC控制器。这个求解器在每个控制间隔被调用来代替内置求解器。这个选项对以下情况很有用:

验证您的模拟结果或使用您信任的内部第三方解决方案生成代码。
内置解决程序不能为您的特定问题提供令人满意的性能的应用程序。

您可以为模拟或代码生成定义自定义求解器。在任何一种情况下,您都可以使用自定义函数定义自定义求解器,并配置控制器以使用该自定义函数。

 

Custom Solver for Simulation

要使用自定义QP求解器模拟MPC控制器,请执行以下步骤。
1.复制求解器模板文件到您的工作文件夹或MATLAB路径上的任何地方,并将其重命名为mpcCustomSolver.m。要将求解器模板复制到当前工作文件夹中,请在MATLAB命令行中键入以下内容。

src = which('mpcCustomSolver.txt');

dest = fullfile(pwd,'mpcCustomSolver.m');

copyfile(src,dest,'f');

2.修改mpcCustomSolver.m通过添加自己的自定义求解器。你的求解器必须能够在MATLAB中运行,并在MATLAB脚本或MEX文件中实现。
3.配置您的MPC控制器MPCobj以使用自定义求解器。

MPCobj.Optimizer.CustomSolver = true;

该软件现在使用您的自定义求解器进行模拟,取代内置的QP KWIK求解器。

4.模拟控制器。

 

Custom Solver for Code Generation

您可以为MPC控制器生成代码,使用自定义QP求解器编写的C/ c++代码或适合代码生成的MATLAB代码。
要在命令行中做到这一点,您必须拥有MATLAB Coder™软件。
要在Simulink中做到这一点,你必须有Simulink Coder或Simulink PLC Coder™软件。

要为使用自定义QP求解器的MPC控制器生成代码,执行以下步骤。
1.将求解器模板文件复制到您的工作文件夹或MATLAB路径的任何地方,并将其重命名为mpcCustomSolverCodeGen.m。要将MATLAB代码模板复制到当前工作文件夹中,请在MATLAB命令行中键入以下内容。

src = which('mpcCustomSolverCodeGen_TemplateEML.txt');

dest = fullfile(pwd,'mpcCustomSolverCodeGen.m');

copyfile(src,dest,'f');

或者,您可以使用C模板。

src = which('mpcCustomSolverCodeGen_TemplateC.txt');

dest = fullfile(pwd,'mpcCustomSolverCodeGen.m');

copyfile(src,dest,'f');

2.修改mpcCustomSolverCodeGen.m通过添加自己的自定义求解器。
3.配置您的MPC控制器MPCobj以使用自定义求解器。

MPCobj.Optimizer.CustomSolverCodeGen = true;

该软件现在使用您的自定义求解器来生成代码,而不是内置的QP KWIK求解器。

4.为控制器生成代码,For more information, see Generate Code and Deploy Controller to Real-Time Targets.

For an example, see Simulate and Generate Code for MPC Controller with Custom QP Solver.

 

Custom Solver for both Simulation and Code Generation

您可以为模拟和代码生成实现相同的定制QP求解器。这样做:

Set both Optimizer.CustomSolver and Optimizer.CustomSolverCodeGen to true.

Create both mpcCustomSolver.m and mpcCustomSolverCodeGen.m.

在模拟过程中,你的控制器使用mpcCustomSolver.m自定义函数。对于代码生成,控制器使用mpcCustomSolverCodeGen.m自定义函数。
您可以在两个自定义求解器函数中指定相同的MATLAB代码,提供适合代码生成的代码。

如果你实现mpcCustomSolverCodeGen.m使用C/ C++代码,创建一个MEX文件使用的代码。然后可以从mpcCustomSolver.m调用这个MEX文件。有关创建和使用MEX文件的更多信息,see C MEX File Applications.

 

Custom Solver Function Implementation

当你实现一个自定义QP求解器时,你的自定义函数必须有以下签名之一:
自定义求解仿真:

function [x,status] = mpcCustomSolver(H,f,A,b,x0)

代码生成的自定义求解器:

function [x,status] = mpcCustomSolverCodeGen(H,f,A,b,x0)

对于模拟和代码生成,您的自定义求解器具有以下输入和输出参数。

H是一个Hessian矩阵,指定为n × n对称正定矩阵,其中n为优化变量的个数。
F是目标函数线性项的乘子,指定为长度为n的列向量。
A是一个线性不等式约束系数矩阵,指定为m × n矩阵,其中m为约束的个数。
B是不等式约束方程的右边,指定为长度为m的列向量。

X0是解的初始猜想,指定为长度为n的列向量。
X是最优解,作为长度为n的列向量返回。
Status是解决方案有效性指示器,以整数形式返回,如下表所示。

 

MPC控制器期望自定义求解函数来求解受线性不等式约束Ax≥b的QP问题。如果您的自定义求解器使用Ax≤b,您必须在将它们传递到您的自定义求解器代码之前改变A和b的符号。

 

Integration with FORCES PRO Solver(集成与FORCES PRO求解器)

您可以使用FORCES PRO,一个由Embotech AG开发的实时嵌入式优化软件工具,来模拟和生成使用Model Predictive Control Toolbox软件设计的MPC控制器的代码。从FORCES PRO 2.0开始,Embotech提供了一个插件,利用模型预测控制工具箱软件的设计能力和FORCES PRO的计算性能。使用插件,您可以生成一个定制的QP求解器,允许部署在实时硬件上,并根据您的特定MPC问题高度优化,以实现满意的实时性能特别是长期MPC问题可以非常有效地解决

有关使用FORCES PRO解算器和模型预测控制工具箱软件的信息,see Implement MPC Controllers using Embotech FORCES PRO Solvers.

 

****************************************转自MathWorks官网********************************************

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Sumo和模型预测控制(MPC)结合的交通流控制的完整代码示例: ```python import traci import numpy as np from casadi import * from collections import deque # 定义模型预测控制的参数 N = 10 T = 1 L = 100 v_max = 10 a_max = 2 j_max = 3 # 定义交通流控制的参数 MAX_SPEED = 13.9 MIN_SPEED = 0 ACCEL = 2.5 DECEL = 4.5 DISTANCE = 150 # 定义模型预测控制的变量 x = MX.sym('x', N) v = MX.sym('v', N) a = MX.sym('a', N) # 定义目标函数 J = 0 for i in range(N-1): J += (v[i+1]-v[i])**2 + a[i]**2 # 定义约束 g = [] for i in range(N-1): g.append(x[i+1]-x[i]-v[i]*T) g.append(v[i+1]-v[i]-a[i]*T) g.append(a[i+1]-a[i]-j_max*T) g.append(x[0]) g.append(v[0]) g.append(a[0]) g.append(x[N-1]-L) g.append(v[N-1]) # 构建NLP问题 nlp = {'x':vertcat(x,v,a), 'f':J, 'g':vertcat(*g)} solver = nlpsol('solver', 'ipopt', nlp) # 定义交通流控制的变量 vehicles = [] positions = deque(maxlen=1000) # 初始化SUMO sumoBinary = "sumo" sumoCmd = [sumoBinary, "-c", "sumo_config.sumocfg"] traci.start(sumoCmd) # 开始交通流控制 while traci.simulation.getMinExpectedNumber() > 0: # 获取车辆信息 for veh_id in traci.vehicle.getIDList(): if veh_id not in vehicles: vehicles.append(veh_id) positions.append([traci.vehicle.getPosition(veh_id)[0] for veh_id in vehicles]) # 构建模型预测控制问题 x0 = positions[-1] v0 = [traci.vehicle.getSpeed(veh_id) for veh_id in vehicles] a0 = [0]*len(vehicles) lbx = [-inf]*N + [MIN_SPEED]*N + [-a_max]*N ubx = [inf]*N + [MAX_SPEED]*N + [a_max]*N lbg = [0]*(3*(N-1)) + x0 + v0 + [0] ubg = [0]*(3*(N-1)) + x0 + v0 + [0] sol = solver(x0=vertcat(x0,v0,a0), lbx=lbx, ubx=ubx, lbg=lbg, ubg=ubg) x_opt = sol['x'][:N] v_opt = sol['x'][N:2*N] a_opt = sol['x'][2*N:] # 更新车辆速度和位置 for i in range(len(vehicles)): traci.vehicle.setSpeed(vehicles[i], v_opt[i]) traci.vehicle.moveTo(vehicles[i], x_opt[i]) # 更新车辆列表 for veh_id in vehicles: if traci.vehicle.getSpeed(veh_id) < MIN_SPEED: vehicles.remove(veh_id) # 控制车辆的加速度和减速度 for veh_id in vehicles: front_vehicle = traci.vehicle.getLeader(veh_id) if front_vehicle is None: traci.vehicle.setAcceleration(veh_id, ACCEL) else: distance = traci.vehicle.getDistance(veh_id, front_vehicle) if distance > DISTANCE: traci.vehicle.setAcceleration(veh_id, ACCEL) elif distance < 2: traci.vehicle.setAcceleration(veh_id, -DECEL) else: front_vehicle_speed = traci.vehicle.getSpeed(front_vehicle) if front_vehicle_speed < traci.vehicle.getSpeed(veh_id): traci.vehicle.setAcceleration(veh_id, -DECEL) else: traci.vehicle.setAcceleration(veh_id, ACCEL) # 更新SUMO traci.simulationStep() # 结束SUMO traci.close() ``` 此代码将每辆车视为一个模型预测控制问题的变量,并将其作为NLPSOL的输入。每次迭代,它将计算每辆车的最佳速度和加速度,并将其设置为SUMO的速度和加速度。此外,它还将检查前方车辆的距离,并相应地调整每辆车的加速度和减速度,以确保交通流的平稳和安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值