python预测控制_自动驾驶控制请问有哪位做过基于c++的模型预测控制来做轨迹跟踪控制吗?...
重新修改下吧,增加一些mpcActiveSetSolver的细节关于qpoases 或者osqp的使用就不说了,具体参考apollo的代码(osqp用于mpc参考apollo6.0及以上版本的代码)。从simulink mpc模块直接生成代码也不介绍了,很多现成的demo。mpcActiveSetSolver 是matlab2020b版本提供的一个函数,基于主动集算法求解二次规划问题的函数,可以支
重新修改下吧,增加一些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函数生成二次规划求解的代码
更多推荐
所有评论(0)