python预测控制_自动驾驶控制请问有哪位做过基于c++的模型预测控制来做轨迹跟踪控制吗?...

重新修改下吧,增加一些mpcActiveSetSolver的细节

关于qpoases 或者osqp的使用就不说了,具体参考apollo的代码(osqp用于mpc参考apollo6.0及以上版本的代码)。

从simulink mpc模块直接生成代码也不介绍了,很多现成的demo。

mpcActiveSetSolver 是matlab2020b版本提供的一个函数,基于主动集算法求解二次规划问题的函数,可以支持代码生成。

具体使用方法请help mpcActiveSetSolver

这里介绍一个例子: 用mpc控制双积分系统的例子

用simulink搭建(simulink代码生成的文件比较集中,便于集成)

初始状态是[-1;0]

MPC Controller用matlab function来实现(也可以用matlab system来实现)

输入是当前状态x,输出是一个步长的控制量u。控制目标写在程序里,是[0;0]

具体的代码:

functionu =MPC(x)%#codegen

A = [1.0000 0.1000

0 1.0000];

B = [0.0050

0.1000];

N = 4;

R = 1;

Q = [100 0

0 0];

Qoverline = zeros(2*N, 2*N);

for i = 1:N

idxs = 2*i-1;

idxe = 2*i;

Qoverline(idxs:idxe, idxs:idxe) = Q;

end

Roverline = zeros(N, N);

for i = 1:N

Roverline(i, i) = R;

end

Toverline = zeros(2*N, 2);

for i = 1:N

idxs = 2*i-1;

idxe = 2*i;

Toverline(idxs:idxe,1:2) = A^i;

end

Soverline = zeros(2*N, N);

for i = 1:N

idxs = 2*i-1;

idxe = 2*i;

for j = 1:N

if i >= j

Soverline(idxs:idxe, j) = A^(i-j)*B;

end

end

end

H = 2*(Roverline + Soverline.'*Qoverline*Soverline);

F = (2*(x.')*Toverline.'*Qoverline*Soverline).';

opt = mpcActiveSetOptions('double');

opt.IntegrityChecks = false;

opt.UseHessianAsInput = true;

opt.MaxIterations = 200;

opt.ConstraintTolerance = 0.00001;

[uMPC,~] = mpcActiveSetSolver(H,F,zeros(0,4),zeros(0,1),zeros(0,4),zeros(0,1),false(4,1),opt);

u = uMPC(1);

运行结果:

当然,这里目的是介绍代码生成,就没有很好地去调校这个控制系统(实际上控制目标并不是从[-1;0]到[0;0]突变的,可以加入目标轨迹,这样控制效果会更好,另外就是调整一些权重参数)。

生成代码的样子:

原回答:

对于mpc控制的话,从matlab转到c++的难点可能在于二次规划求解,如果有现成的库调用的话就好办了。一条路是参考apollo的代码,矩阵操作用eigen,二次规划用qpoases,建议参考早期的版本,移植出来并不是很麻烦。另一条路就是matlab代码生成,matlab可以从simulink的mpc模块直接生成代码,另外新版的matlab也可以从mpcActiveSetSolver函数生成二次规划求解的代码

你可能感兴趣的:(python预测控制)