关于前面介绍过的MPCC控制改为使用Yalmip解算器解以及MPC控制的一点想法

最近看了许多关于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

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值