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. [统计信息系列7] Oracle 11g的自动统计信息收集

    (一)统计信息收集概述 在Oracle 11g中,默认有3个自动任务,分别是:自动统计信息收集.SQL调优顾问.段空间调整顾问,查看方法如下: SQL> SELECT CLIENT_NAME,T ...

  2. Redis 单节点百万级别数据 读取 性能测试.

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 这里先进行造数据,向redis中写入五百万条数据,具体方式有如下三种: 方法一:(Lua 脚本) vim ...

  3. JAVASE(八) 数组: 一维数组、二维数组、动态数组、静态数组

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.一维数组 1.1 数组的声明和初始化声明方式: String str[]; //不建议使用 Stri ...

  4. 容器技术之Dockerfile(二)

    前文我们聊到了什么是dockerfile,它的主要作用以及dockerfile的一些基本指令的使用方法,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13019 ...

  5. Java实现蓝桥杯3n+1问题

    3n+1 [问题描述] 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2:如果 n 是奇数,把它乘 3 加1.用新得到的值重复上述步骤,直到 n = 1 时停止.例如,n = ...

  6. java实现输入信用卡号码

    /* 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信用卡号码都是合法的,它必须通过 Luhn 算法来验证通过. 该校验的过程: 1.从卡号最后一 ...

  7. 密码学DAY1_02

    目录 1.1 ASCII编码 1.2 凯撒加密 1.2.1 中国古代加密 1.2.2 外国加密 1.2.3 凯撒位移加密--JAVA代码实现 1.2.4 频度分析法破解恺撒加密 1.3现代常用的加密方 ...

  8. Spring Cloud 系列之 Apollo 配置中心(四)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Apollo 配置中心(一) Spring Cloud 系列之 Apollo 配置中心(二) Spring Clou ...

  9. Python面试常用的高级用法,怎么动态创建类?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第16篇文章,今天我们来聊聊Python当中的元类. 元类是Python当中的高级用法,如果你之前从来没见过这个术语 ...

  10. el-upload配合vue-cropper实现上传图片前裁剪

    需求背景 上传一个封面图,在上传之前需要对图片进行裁剪,上传裁剪之后的图片,类似微信的上传头像. 技术方案 上传肯定是用element的 el-upload 组件实现上传,非常方便,各种钩子函数. 裁 ...