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的更多相关文章

  1. UVW平台运动控制算法以及matlab仿真

    UVW平台运动控制算法以及matlab仿真   最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我.由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些 ...

  2. 自动驾驶运动规划-Reeds Shepp曲线

    自动驾驶运动规划-Reeds Shepp曲线 相比于Dubins Car只允许车辆向前运动,Reeds Shepp Car既允许车辆向前运动,也允许车辆向后运动. Reeds Shepp Car运动规 ...

  3. 自动驾驶运动规划-Dubins曲线

    1.Simple Car模型 如下图所示,Simple Car模型是一个表达车辆运动的简易模型.Simple Car模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心:x轴沿着车辆主轴方向, ...

  4. 人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍

    人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍 工业机器人,家用机器人这些只是人工智能的一个细分应用而已.图像识别,语音识别,推荐算法,NL ...

  5. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...

  6. arcengine 开发经典帖

    http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=25575&page=1&extra= 使用ArcGIS Engine 开发自定义 ...

  7. 开发一个基于 Android系统车载智能APP

    很久之前就想做一个车载相关的app.需要实现如下功能: (1)每0.2秒更新一次当前车辆的最新速度值. (2)可控制性记录行驶里程. (3)不连接网络情况下获取当前车辆位置.如(北京市X区X路X号) ...

  8. 树莓派小车(三)Python控制小车

    正文之前 由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享. 正文 在树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种: PHYSICAL N ...

  9. 吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料-人工智能学习书单

    吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料 人工智能学习书单(关注微信公众号:aibbtcom获取更多资源) 文末附百度网盘下载地址 人工神经网络与盲信号处理 人工神经网络与 ...

随机推荐

  1. Rocket - tilelink - SourceShrinker

    https://mp.weixin.qq.com/s/1vyfhZuF4RyRE5Qjj6AGWA   简单介绍SourceShrinker的实现.   ​​   1. 基本介绍   用于把上游节点的 ...

  2. 【Hadoop】hdfs文件上传流程图

  3. Java实现 蓝桥杯 算法训练 Balloons in a Box

    试题 算法训练 Balloons in a Box 问题描述 你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球. 接下来是模拟的方案.假设你已知一个长方体的盒子和一个点集.每一个点代表一个可 ...

  4. Java实现 LeetCode 207 课程表

    207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...

  5. centos 7 源码安装openssh

    环境:centos 7.1.1503 最小化安装 依赖包下载:  yum -y install lrzsz zlib-devel perl gcc pam-devel 1.安装openssl ,选用最 ...

  6. 掌握SpringBoot-2.3的容器探针:实战篇

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总,及配套源码,涉及Java.Docker.K8S.DevOPS等 经过多篇知识 ...

  7. 攻防世界misc新手区前三题

    1.this_is_flag 从题目以及题目的描述来看,不难发现实际上题目中所描述的就是flag 2.Pdf 拿到题目附件是pdf文件,观察题目描述,题目说图下面什么都没有,那么十有八九图下面肯定是f ...

  8. Jenkins登录无效

    解决办法: 进入Jenkins安装目录: 1:进入D:\jenkins\users\admin 这个目录下找到config.xml  可以看到里面的用户名是admin 2:进入D:\jenkins\s ...

  9. C++核心编程

    C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓. 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统 ...

  10. MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字

    MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字 stdafx.h文件中添加:#include "afxsock.h" BOOL CMFC_TCP_Client_c ...