Apollo代码学习(七)—MPC与LQR比较 (百度Apollo中用到了PID、MPC和LQR三种控制器)

2023-05-16

 

摘自:https://blog.csdn.net/u013914471/article/details/84324754

Apollo代码学习(七)—MPC与LQR比较

follow轻尘 2018-11-29 17:32:56 17962 收藏 122

分类专栏: Apollo Control 文章标签: MPC LQR 比较

版权

 

Apollo代码学习—MPC与LQR比较

  • 前言
  • 研究对象
  • 状态方程
  • 工作时域
  • 目标函数
  • 求解方法

 

前言

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 t t时刻有最优解 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 x x为状态变量,多为各种误差, u u u为控制变量, Q Q Q为半正定的状态加权矩阵, R R R为正定的控制加权矩阵,实际应用中, Q 、 R Q、R Q、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、R x、u、Q0​、Q、R的定义同上。
从形式上可以看出,LQR的目标函数为积分形式,MPC的目标函数为求和形式,但其实都是对代价的累计。两者第一部分均为终端代价函数,当系统对终端状态要求极严的情况下才添加,一般情况下可省略。 x T Q x x^TQx xTQx项代表跟踪代价,表示跟踪过程中误差的大小, u T R u u^TRu uTRu项代表控制代价,表示对控制的约束或要求等。

求解方法

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo代码学习(七)—MPC与LQR比较 (百度Apollo中用到了PID、MPC和LQR三种控制器) 的相关文章

  • useQuery 是否在服务器端渲染上运行?

    我是 Next js 的新手 对 Next js 中的客户端渲染和服务器端渲染有一些疑问 我发现 Next js 有两种获取数据的方法 其中之一是使用useQueryhook 但只能在 React 组件函数上调用 这是否意味着它仅在从客户端
  • 打印 pid_t 的正确 printf 说明符是什么

    我目前正在使用显式转换为 long 并使用 ld用于印刷pid t 是否有一个说明符 例如 z for size t for pid t 如果不是最好的打印方式是什么pid t 没有这样的说明符 我认为你在做什么 铸造pid t to lo
  • Apollo 客户端 - 使用对象列表中的缓存结果来响应单个对象的查询

    是否可以将 Apollo 客户端配置为从返回项目列表的查询中获取单个缓存的项目 以便在查询单个项目时预取数据 Schema type Item id ID name String type Query items Item itemById
  • Apollo Server Express:请求实体太大

    我需要在 GraphQL 突变中发布大量有效负载 如何提高 Apollo Server 的主体大小限制 我在用着apollo server express版本 2 9 3 我的代码 简化 const myGraphQLSchema new
  • Apollo-客户端自签名证书

    ApolloClient 有没有办法接受来自具有自签名证书的服务器的请求 import ApolloClient from apollo boost const client new ApolloClient uri https windo
  • React Apollo GraphQL 搜索/过滤

    我有一个使用 Apollo 客户端的带有 GraphQL 服务器的 React 项目 我试图弄清楚如何根据搜索文本和过滤选择更改查询结果 如果有人可以查看我的代码并给我一些帮助 我将不胜感激 对所有代码感到抱歉 我想也许它们都是相关的 服务
  • AWS AppSync:如何通过 DynamoDB 返回有效的 JSON

    我有一个 AppSync GraphQL API 可以对 DynamoDB 进行查询并返回 JSON 字符串 但是在我的响应映射模板中 我使用内置 util parseJson 功能如所列here https docs aws amazon
  • Apollo重新获取不重新渲染组件

    我正在使用 graphql 从网络服务获取数据 我的客户端代码是这样的 import React Component from react import Platform StyleSheet Text ActivityIndicator
  • Apollo:数据/突变道具未传递给组件

    我有以下带有查询和突变的组件 但我的组件没有接收数据和突变道具 我的代码中是否做错或遗漏了什么 虽然查询确实被执行 但它只是没有被传递下去 this props mutate 以及 this props data 未定义 class Res
  • GraphQL 如何执行 JOIN 请求而不是许多顺序请求?

    我有两种 GraphQL 类型 type Author id String name String type Book id String author Author name String 在我的数据库中 它是通过 books 表内的外键
  • Nestjs Apollo graphql上传标量

    我正在使用 Nestjs graphql 框架 我想使用 apollo 标量上传 我已经能够在另一个不包含 Nestjs 的项目中使用标量 schema graphql App module ts注册graphql GraphQLModul
  • 连接 Apollo 和 mongodb

    我想将我的 Apollo 服务器与我的 mongoDB 连接 我知道那里有很多例子 但我陷入了异步部分 没有找到解决方案或示例 这很奇怪 我完全错了吗 我从 next js 的示例开始https github com zeit next j
  • 即使目标对象存在,Apollo readQuery 也会失败?

    我正在调用 readQuery 我收到一条错误消息 modules js hash 2d0033b4773d9cb6f118946043f7a3d4385825fe 25847 Error Can t find field resoluti
  • 如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

    如何获取运行 VBA 代码的当前 Excel 实例的进程 ID 我不想通过标题中的名称来请求它 当我有两个或多个具有相同标题的 Excel 实例时 这会导致问题 您可以使用此方法来获取当前进程ID Declare Function GetC
  • 查找PID所属的tmux会话

    我正在使用 htop 所以看看哪些进程占用了大量内存 以便我可以杀死它们 我有很多 tmux 会话和很多类似的流程 如何检查 PID 位于哪个 tmux 窗格中 以便确定我正在杀死我想杀死的东西 鉴于PID下面一行是目标 pid 号 tmu
  • Mysql 连接到服务器:用户 root@localhost 的访问被拒绝

    edit9 是否有可能我只是缺少文件夹的一些权限 我真的非常非常感谢更多的建议 edit3 由于这篇文章没有得到足够的回复 而且这绝对是至关重要的 我尽快完成这件事 我重建了我的帖子以显示我认为到目前为止我已经扣除的内容 注意 通过许多不同
  • 动态 GraphQL 模式?

    我有一个突变 将提交表单数据 该数据可能会根据您填写的表单而有所不同 表单将会很多 并且它们将共享相同的 步骤 每个表单由 1 个或多个页面 步骤组成 因此 我们可能有这些可重用的步骤 最喜欢的水果 出生日期 名和姓 还有这两种形式 通用信
  • Apollo 服务器,Graphql - 必须提供查询字符串

    我不确定我在这里做错了什么 我现在已经被困了一段时间 让我的突变在无服务器设置中与我的 apollo server lambda 一起运行 当我尝试运行这样的查询时 我的查询工作正常 mutation signIn username Som
  • 如何将文本文件中的变量获取到 Bash 变量中

    简单的问题 在 BASH 中 我试图读取 pid 文件来终止进程 如何将该文件读入变量 我发现的所有示例都试图以多行方式阅读 我只想读取仅包含 PID 的一个文件 bin sh PIDFile var run app to kill pid
  • 如何停止rabbitmq服务器

    我正在尝试启动一个节点应用程序 但我认为rabbitmq 妨碍了我 与此线程类似 名为 rabbit 的节点已经在运行 但也 无法连接到节点 rabbit https stackoverflow com questions 8737754

随机推荐