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. Java实现 LeetCode 754 到达终点数字(暴力+反向)

    754. 到达终点数字 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数 ...

  2. (Java实现) 装载问题

    2.装载问题 [问题描述] 有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi.找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船. [ ...

  3. Java实现 LeetCode 124 二叉树中的最大路径和

    124. 二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: ...

  4. Java实现 LeetCode 18 四数之和

    18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...

  5. java实现放麦子问题

    /* 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服, 问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子, 在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子, 在第 ...

  6. java实现棋盘上的麦子

    ** 棋盘上的麦子** 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8 ...

  7. java实现第七届蓝桥杯凑算式

    凑算式 凑算式 B DEF A + - + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. 比如: 6+8 ...

  8. 看Python如何无缝转换Word和Excel

    word和excel是办公过程必不可少的两个文档类型,word多用于文字处理,比如备忘录.论文.书籍.报告.商业信函等,excel可以制作精美的图表,还可以计算.分析.记录数据.二者在功能达成上有重叠 ...

  9. Tidyverse| XX_join :多个数据表(文件)之间的各种连接

    本文首发于公众号:“生信补给站” Tidyverse| XX_join :多个数据表(文件)之间的各种连接 前面分享了单个文件中的select列,filter行,列拆分等,实际中经常是多个数据表,综合 ...

  10. Go 语言入门教程:变量

    基础使用 // base.go  注释package main  // 包名import "fmt"  // 导入 func main() { fmt.Println(" ...