最近看了许多关于MPC控制相关的资料,许多好的方法感兴趣的可以到我的哔哩哔哩视频看看:Imitation Learning from MPC for Quadrupedal Multi-Gait Control (ICRA 2021 Presen_哔哩哔哩_bilibili
这里面放了目前放的都是与优化控制相结合的东西。
目前MPC相关算法有:
1. MPCC
2.GD-MPC
3.LMPC
4.与模仿学习相结合的MPC
5.与强化学习相结合的MPC
6.Tube-MPC
等等,这里举的例子都是很常用的算法,还有好多这里就不举例了。
以前讲过一个MPCC工程(GitHub - alexliniger/MPCC: Model Predictive Contouring Controller (MPCC) for Autonomous Racing)中边界通过滚动优化形成,模型部分就是线性化以及注意代码中变量归一化,其他没什么难度,其实这个例子可以拿来把自己的想法加进去实现,最近我也在这个代码的基础上加了好多自己的想法实现,这里给出使用Yalmip解算器去实现这个解。
代码使用Yalmip解算器需要改几个地方,不然会报错以及运行很慢:
1.首先simulation.m文件中27行改为这个:
由MPC_vars.interface = 'hpipm';
改为
MPC_vars.interface = 'Yalmip';
2.optimizer_mpcc.m文件中31行改为这个
由if (info.exitflag == 0)
改为
if (info.exitflag.problem == 0)
3.YalmipInterface.m文件中41行:
由ops = sdpsettings('solver','ecos','verbose',2);
改为这个
ops = sdpsettings('solver','');
如果想看解算信息,改为下面语句:
ops = sdpsettings('solver','','verbose',2);
改了这三个地方就可以使用Yalmip来运行了,但是你运行发现会越来越慢,这是什么原因呢?
理论说定义名称相同的变量会覆盖原变量。但是,在Yalmip中,原有的变量并不会被删除,而新的变量会被源源不断地创建,这会导致变量数越来越多。因此:
代码还需要增加一个东西:
function [ X,U,dU,info ] = YalmipInterface(stage,MPC_vars,ModelParams)
nx = ModelParams.nx;
nu = ModelParams.nu;
tic;
yalmip('clear')
x = sdpvar(nx+nu, MPC_vars.N+1); % states + initial state; fifth initial state for discretization
u = sdpvar(nu, MPC_vars.N); % (front) steering angle
objective = 0;
constraints = [x(:,1) == blkdiag(MPC_vars.Tx,MPC_vars.Tu)*[stage(1).x0;stage(1).u0]]; % initialize initial state
在20行增加了yalmip('clear'),这样,代码就可以使用yalmip解了。
对代码进行了想法验证:
(1)线性化使用欧拉零阶保持 (2)引入障碍物函数CBF (3) 修改为Yalmip解算 (4) 修改了等式约束放入代价函数中进行求解
具体见我的代码:GitHub - caokaifa/MPCC
坐标旋转工具:
https://danceswithcode.net/engineeringnotes/quaternions/conversion_tool.html