前言

Apollo中用到了PID、MPC和LQR三种控制器,其中,MPC和LQR控制器在状态方程的形式、状态变量的形式、目标函数的形式等有诸多相似之处,因此结合自己目前了解到的信息,将两者进行一定的比较。

MPC( Model predictive control, 模型预测控制 ) 和 LQR( Linear–quadratic regulator,线性二次调解器 ) 在状态方程、控制实现等方面,有很多相似之处,但也有很多不同之处,如工作时域、最优解等,基于各自的理论基础,从研究对象、状态方程、目标函数、求解方法等方面, 对MPC和LQR做简要对比分析。对MPC的详细讲解请参考我的上一篇博文:Apollo代码学习(六)—模型预测控制(MPC)

本文主要参考内容:
【1】龚建伟, 姜岩, 徐威. 无人驾驶车辆模型预测控制[M]. 北京理工大学出版社, 2014.
【2】Model predictive control-Wikipedia
【3】Linear–quadratic regulator-Wikipedia
【4】Inverted Pendulum: State-Space Methods for Controller Design
【5】王金城. 现代控制理论[M]. 化学工业出版社, 2007.

研究对象

LQR的研究对象是现代控制理论中以状态空间方程形式给出的线性系统。MPC的研究对象可以是线性系统,也可以是非线性系统,只不过为了某些需求,如时效性,计算的便捷,操控性等,一般会将非线性系统转换为线性系统进行计算。非线性系统的线性化可参考上一篇文章

Apollo中,LQR和MPC控制器都选用的单车动力学模型作为研究对象,单车动力学模型为非线性系统,但LQR和MPC控制器的目的是为了求最优控制解,在具体的优化求解时,均通过线性化方法将状态方程转化为线性方程进行求解,所以,可以说apollo中LQR和MPC控制器的研究对象均为线性系统。

状态方程

LQR的状态方程多以微分方程的形式给出,如:
(1) x ˙ = A x + B u \dot{x}=Ax+Bu \tag{1}x˙=Ax+Bu(1)
是一个连续线性系统,在计算过程中需要转换为如公式3的离散线性系统。
MPC的状态方程可以为线性系统,可以为非线性系统,非线性系统形如下:
(2) ξ ˙ = f ( ξ , u ) \dot{\xi}=f(\xi,u) \tag{2}ξ˙​=f(ξ,u)(2)

线性系统如公式3所示:
(3) x ( t + 1 ) = A x ( t ) + B u ( t ) x(t+1)=Ax(t)+Bu(t) \tag{3}x(t+1)=Ax(t)+Bu(t)(3)
但LQR和MPC在计算求解时基本都是基于离散线性方程计算的。公式1可以很方便的转化为公式2的形式。离散化的方法可参考上一篇文章:Apollo代码学习(六)—模型预测控制(MPC)

工作时域

按照维基百科的说法:

The main differences between MPC and LQR are that LQR optimizes in a fixed time window (horizon) whereas MPC optimizes in a receding time window, and that a new solution is computed often whereas LQR uses the single (optimal) solution for the whole time horizon.

LQR在一个固定的时域上求解,且一个时域内只有一个最优解,而MPC在一个逐渐消减的时域内( in a receding time window )求解最优解,且最优解经常更新。
可以结合MPC的滚动优化,以及图1进行理解:

图1 MPC和LQR的工作时域

针对同一工作时域[ t , t + N ] [t, t+N][t,t+N],LQR在该时域中,有唯一最优控制解u ∗ ( t ) u^*(t)u∗(t),而MPC仅在t tt时刻有最优解u ∗ ( t ) u^*(t)u∗(t),但它会计算出一个控制序列U ( t ) U(t)U(t),并仅将序列的第一个值u ∗ ( t ) u^*(t)u∗(t)作为控制量输出给控制系统,然后在下一采样时间结合车辆当前状况求取下一个最优控制解u ∗ ( t + 1 ) u^*(t+1)u∗(t+1),这就是MPC所谓的滚动优化。这么做的目的是为了使控制效果在一定时间内可期,并且能根据控制效果尽早调整控制变量,使实际状态更切合期望状态。
此外,LQR的工作时域可以拓展到无限大,即可以求取无限时域的最优控制解,当然,一般并不会这么用。而MPC只针对有限时域。

目标函数

优化求解问题一般离不开目标函数的设计。
LQR的目标函数的一般形式为:
(4) J = 1 2 x T ( t f ) Q 0 ( t ) x ( t f ) + 1 2 ∫ t 0 t f [ x T Q x + u t R u ] d t J=\frac{1}{2}x^T(t_f)Q_0(t)x(t_f)+\frac{1}{2}\int_{t0}^{tf}[x^TQx+u^tRu]dt \tag{4}J=21​xT(tf​)Q0​(t)x(tf​)+21​∫t0tf​[xTQx+utRu]dt(4)
其中,x ( t f ) x(t_f)x(tf​)为终端状态,Q 0 ( t ) Q_0(t)Q0​(t)为正定的终端加权矩阵,x xx为状态变量,多为各种误差,u uu为控制变量,Q QQ为半正定的状态加权矩阵,R RR为正定的控制加权矩阵,实际应用中,Q 、 R Q、RQ、R多为对角矩阵。
MPC的目标函数的一般形式为:
(5) J = x ( t + N ) Q 0 x ( t + N ) + ∑ i = 1 N ( x ( t + i ∣ t ) T Q x ( t + i ∣ t ) + u ( t + i − 1 ) T R u ( t + i − 1 ) ) J=x(t+N)Q_0x(t+N)+\sum_{i=1}^N(x(t+i|t)^TQx(t+i|t)+u(t+i-1)^TRu(t+i-1)) \tag{5}J=x(t+N)Q0​x(t+N)+i=1∑N​(x(t+i∣t)TQx(t+i∣t)+u(t+i−1)TRu(t+i−1))(5)
其中,x 、 u 、 Q 0 、 Q 、 R x、u、Q_0、Q、Rx、u、Q0​、Q、R的定义同上。
从形式上可以看出,LQR的目标函数为积分形式,MPC的目标函数为求和形式,但其实都是对代价的累计。两者第一部分均为终端代价函数,当系统对终端状态要求极严的情况下才添加,一般情况下可省略。x T Q x x^TQxxTQx项代表跟踪代价,表示跟踪过程中误差的大小,u T R u u^TRuuTRu项代表控制代价,表示对控制的约束或要求等。

求解方法

正如工作时域所述,针对同一工作时域,LQR有唯一最优控制解,也就是在该控制周期内,LQR只进行一次计算。而MPC滚动优化的思想,使其给出该时域内的一组控制序列对应不同的采样时刻(采样周期和控制周期不一定相同),但是只将该序列的第一个值输出给被控系统,作为该时刻的最优控制解。因此,对于工作时域[ t , t + N ] [t, t+N][t,t+N],LQR只有唯一解,MPC可能有N NN个解。

最优控制解的求取多基于目标函数进行,取线性约束下的目标函数的极值为最优控制解。对于系统为线性,目标函数为状态变量和控制变量的二次型函数的线性二次性问题,一般线性二次性问题的最优解具有统一的解析表达式。apollo中的MPC将优化问题转化为二次规划问题,利用二次规划求解器进行求解。横向控制中用的是LQR调节器,它通过假设控制量u ( t ) u(t)u(t)不受约束,利用变分法求解。

此外,LQR对整个时域进行优化求解,且求解过程中假设控制量不受约束,但是实际情况下,控制量是有约束的。而MPC通常在比整个时域更小的时间窗口中解决优化问题,因此可能获得次优解,且对线性不作任何假设,它能够处理硬约束以及非线性系统偏离其线性化工作点的迁移,这两者都是LQR的缺点。

转载:https://blog.csdn.net/u013914471/article/details/84324754

Apollo代码学习(七)—MPC与LQR比较的更多相关文章

  1. (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码

    http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...

  2. MyBatis学习七:spring和MyBatis整合

    <\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...

  3. u-boot代码学习内容

    前言  u-boot代码庞大,不可能全部细读,只能有选择的读部分代码.在读代码之前,根据韦东山教材,关于代码学习内容和深度做以下预先划定. 一.Makefile.mkconfig.config.mk等 ...

  4. 分享非常有用的Java程序(关键代码)(七)---抓屏程序

    原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.a ...

  5. 手机自动化测试:Appium源码分析之跟踪代码分析七

    手机自动化测试:Appium源码分析之跟踪代码分析七   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  6. Apollo 代码的编译演示

    Apollo 代码的编译演示 官方的文档 -- 运行线下演示 如果你没有车辆及车载硬件, Apollo还提供了一个计算机模拟环境,可用于演示和代码调试. 线下演示需要设置docker的release环 ...

  7. SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  8. Objective-C代码学习大纲(3)

    Objective-C代码学习大纲(3) 2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍 ...

  9. day 85 Vue学习七之vue-cookie

      Vue学习七之vue-cookie   通过vue如何操作cookie呢 参考链接:https://www.jianshu.com/p/535b53989b39 第一步:安装vue-cookies ...

随机推荐

  1. LVM--逻辑卷管理@安装、格式化、挂载、开机自动挂载完整篇

    转至:https://blog.51cto.com/xiguatailang/1256606      LVM的重要性在这里我也就不多说了,今天和大家分享一下,LVM的安装方式,以及挂载方式. 首先呢 ...

  2. PyTorch深度学习实践-Overview

    Overview 1.PyTorch简介 ​ PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不仅能够 实现强 ...

  3. Lesson A puma at large

    新概念三 Lesson 1 A puma at large 词汇: 1. spot 易混淆: recognize v. [认出], identify v. [识别sb/sth的身份] v. 看出,发现 ...

  4. JZ-041-和为 S 的连续正数序列

    和为 S 的连续正数序列 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列 的和为100( ...

  5. MATLAB菜鸟入门笔记【函数章】

    一.用捷径表达式赋值 1.first:incr:last   first代表数组的每一个值,incr代表步增量,last代表这个数组的最后一个值. Ep:>>x=1:2:10        ...

  6. MySQL-DB-封装-入门版

    <?php class MysqlDb{ public $host = "127.0.0.1"; public $user = "root"; publi ...

  7. mysql保存emoji表情,utf8mb4保存不了表情的问题

    报错信息 : Incorrect string value: '\xF0\x9F\x99\x85\xE2\x80...' for column 'content' at row 1 mysql数据库的 ...

  8. props配置

    配置项props 功能:让组件接收外部传过来的数据[相当于微信转账:有一个转账人转钱给接收者,接收者需要确认接收] (1)传递数据: <Demo name="xxx"> ...

  9. 如何用webgl(three.js)搭建处理3D隧道、3D桥梁、3D物联网设备、3D高速公路、三维隧道桥梁设备监控-第十一课

    开篇废话: 跟之前的文章一样,开篇之前,总要写几句废话,大抵也是没啥人看仔细文字,索性我也想到啥就聊啥吧. 这次聊聊疫情,这次全国多地的疫情挺严重的,本人身处深圳,深圳这几日报导都是几十几十的新增病例 ...

  10. hive从入门到放弃(三)——DML数据操作

    上一篇给大家介绍了 hive 的 DDL 数据定义语言,这篇来介绍一下 DML 数据操作语言. 没看过的可以点击跳转阅读: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--D ...