车辆运动控制算法——MPC
MPC是模型预测控制算法,在车辆运动跟踪轨迹的控制中发挥很大的优势
基础的不多说,下面记录我对LQR/MPC/二次规划问题的理解
我们从LQR来引出MPC
LQR的能量函数,目的是求函数J最小,即用最小的代价得到最好的控制效果,理论上只要系统是可控的,LQR就能求出较优的解
的解是 u= -K_lqr * x,这是一个线性解,用这个算法仅需要对能量函数求解一次,线下求解的u的表达式,线上不断重复计算u即可
MPC算法和LQR的公式非常接近,其表达式是离散的,函数是有边界的(算法中称之为约束条件),现实生活中,求出的解必须要对其进行限制(那车速举例,你不可能让车子跑出500km/h,这就是约束条件)
要知道,系统接下来的状态量x是根据系统当前控制量u得到的,因此需算出N+1的状态
约束条件 :
为什么会存在多组状态?
MPC的算法和LQR算法的计算量根本不是一个数量级的,因为每个时刻t=1,2,3……都需要重新求解一遍J,而MPC是根据当前状态给出接下来的控制量和状态量的序列(相比LQR仅算出一次u的表达式,MPC要计算N次,这里N指步长)
u(1),x..., u(2),x...,u(3)……u(N),然后选取第一个u(1)作为当前控制量,等到下一时刻,所有的控制量u和状态量x的序列又重新计算,再次取新的u(1)作为现在时刻的控制量,或许有人会疑问,这样不是浪费计算量么? 我们要搞清楚,MPC的原理,他是为了接下来的预测出来的控制量控制出来的假想出的状态来判断,来给出当前最优的控制量,和大多数控制算法只关注当前时刻的状态是不同的。这也是为什么MPC是目前自动驾驶车辆运动控制算法的首选。
二次规划问题
MPC的离散公式其实就是求关于x(i)和u(i)的函数的积分,假设该函数为f(x(i),u(i)),那么二次优化就是求出函数f的优化形式,由于f的计算涉及到大量矩阵,因此所选用的优化方法主要就是减少运算次数,缩短MPC的计算时间,以达到车辆高速运动时的快速响应。
Matlab为我们提供了一个函数quadprog(),其简单调用形式为quadprog(H, f, A, b, Aeq, beq, lb, ub, x0, options)
H: 二次规划中的二次项矩阵
f: 二次规划中的一次项矩阵
Aeq: 线性不等约束的系数矩阵
beq: 线性不等约束的右端向量
lb/ub: 自变量下/上限(有些理想问题没有上下限,可不做考虑)
x0: 热启动项
(我们认为状态量不会突然变化,因此k+1时刻的最优解将会在k时刻最优解的附近,这个思路能够节约大量时间,很抱歉之前写成了初始状态,具体怎么设置我们后续更新,初学者可先设为空或0)
options:解二次规划问题的具体算法(quadprog之是提供了借口,解二次规划问题需要options指定具体算法)
客官莫急,稍后会讲怎么求得以上参数
二次规划问题基本公式:
约束条件:
前面我们已经知道,二次规划是关于x1和x2的函数,(x = [x1; x2])套用上面的基本公式就能得到quadprog函数的参数
现在是结合mpc的二次规划问题,目的也是求出quadprog函数的参数:
这是一个离散系统:
能量函数(cost function):
我们看到了LQR的影子,但是这个P是什么呢?官方的解释终于来了,LQR的条件是状态k(此时是离散的)是趋近于无穷的,而MPC的预测步数N是有限的,为了保证系统的最终稳定性,P要尽量等于步长N到无穷时的状态,让它更贴近于LQR,但是P不可能完全等于LQR中的无穷状态,(因此我们在这写成了尽量等于),为了使MPC更像LQR,在quadprog函数加入上下边界lb和ub,P与quadprog函数的上下限一起保证了MPC稳定性。
那么P怎么求得?我们后续更新o(^▽^)o
quadprog函数的参数一般有两种求法——稀疏和稠密法,现在是稀疏法:
新的二次规划问题:
(编辑/粘贴公式真的烦)
X是x的可行域,U是u的可行域
以上公式被简化成这样:
其中
事实上我们在不断更新Beq中的第一项x(k+0)(即当前的状态量),通过反馈把从系统中读取的x(k)送到B处,不断更新的u在作用于系统,将新得到的x(k+1)再更新到Beq,系统就可以这样进行下去了
所有的Umin都是相同的,不会因时刻不同而变化,Umax也一样
quadprog函数的lb/ub仅需要z_min和z_max,写成这样完全是因为很多算法需要这样的形式,在quadprog内部也会将z_min/z_max转换成这种形式。
MPC流程
调用quadprog函数得到的z就是控制量u和状态量x的序列,我们取第一个u作为当前控制量,等到下一时刻如法炮制出新的u。
由此可见mpc的计算量有多大
后续更新中将会讲到options参数中的优化算法
一个重要猜想:本文的矩阵设计实例依据倒摆系统,因此在Beq矩阵中,除了初始状态X(0),其余的状态我们都希望是零,而接下来我们要加以改进应用到车辆轨迹跟踪上,因此我觉得Beq和Aeq需要调整。这个猜想后续需要验证,到时验证结果会更新在此!
车辆运动控制算法——MPC的更多相关文章
- UVW平台运动控制算法以及matlab仿真
UVW平台运动控制算法以及matlab仿真 最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我.由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些 ...
- 自动驾驶运动规划-Reeds Shepp曲线
自动驾驶运动规划-Reeds Shepp曲线 相比于Dubins Car只允许车辆向前运动,Reeds Shepp Car既允许车辆向前运动,也允许车辆向后运动. Reeds Shepp Car运动规 ...
- 自动驾驶运动规划-Dubins曲线
1.Simple Car模型 如下图所示,Simple Car模型是一个表达车辆运动的简易模型.Simple Car模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心:x轴沿着车辆主轴方向, ...
- 人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍
人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍 工业机器人,家用机器人这些只是人工智能的一个细分应用而已.图像识别,语音识别,推荐算法,NL ...
- 人工智能深度学习Caffe框架介绍,优秀的深度学习架构
人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...
- arcengine 开发经典帖
http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=25575&page=1&extra= 使用ArcGIS Engine 开发自定义 ...
- 开发一个基于 Android系统车载智能APP
很久之前就想做一个车载相关的app.需要实现如下功能: (1)每0.2秒更新一次当前车辆的最新速度值. (2)可控制性记录行驶里程. (3)不连接网络情况下获取当前车辆位置.如(北京市X区X路X号) ...
- 树莓派小车(三)Python控制小车
正文之前 由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享. 正文 在树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种: PHYSICAL N ...
- 吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料-人工智能学习书单
吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料 人工智能学习书单(关注微信公众号:aibbtcom获取更多资源) 文末附百度网盘下载地址 人工神经网络与盲信号处理 人工神经网络与 ...
随机推荐
- Rocket - util - Broadcaster
https://mp.weixin.qq.com/s/ohBVNAXZUA538qSxfBGMKA 简单介绍Broadcaster的实现. 1. Broadcaster 广播即是 ...
- js 识别二维码
本文引用analyticCode.js.llqrcode.js实现识别二维码功能 html代码: <div class="box" id="analytic&quo ...
- html css javascript实现弹弹球
效果如图: 原创代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- Java实现第十届蓝桥杯质数
试题 D: 质数 本题总分:10 分 [问题描述] 我们知道第一个质数是 2.第二个质数是 3.第三个质数是 5--请你计算 第 2019 个质数是多少? [答案提交] 这是一道结果填空的题,你只需要 ...
- mysql数据库运维方案
数据库不仅仅是dba的工作,每一个测试人员也应该懂得基本的数据运维操作,因为数据库是数据承载的地方并且是系统中非常重要的一部分,所以我们也需要熟练的对数据库进行基本维护. 01.常用备份恢复命令 第1 ...
- 关于64位W7下怎么学习汇编语言的一些心得!
出处:http://tieba.baidu.com/p/2277546332 1.首先下载DOSBOX,它的作用就是让你在64位下使用32.16位的软件.如果不使用DOSBOX就会出现程序不兼容的对话 ...
- 聊聊依赖注入注解@Resource和@Autowired
1. 前言 @Resource和@Autowired注解都可以在Spring Framework应用中进行声明式的依赖注入.而且面试中经常涉及到这两个注解的知识点.今天我们来总结一下它们. 2. @R ...
- linux 删除文件后 df 查看磁盘空间并没有释放
1.错误现象 Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放. 用du -sh ./* | sort -nr (查看当前目录下文件的大小)通过查找了下发现文件被mys ...
- MySQL进阶篇(02):索引体系划分,B-Tree结构说明
本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...
- MacOS配置.bash_profile,重启终端后配置失效和MacOS .zshrc does not exist问题
MacOS配置.bash_profile,重启终端后配置失效和MacOS .zshrc does not exist问题 场景 在Mac中配置golang环境变量更改GOPATH路径,在~/.ba ...