控制算法-模型预测MPC

news2025/1/21 21:38:33

本文记录一下MPC控制算法的学习过程和自己的理解,初步接触控制算法,理解肯定不是很完善,重在记录思考的过程。

背景

随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热,模型预测控制(MPC)算法作为一种先进的控制算法,其应用范围与领域得到了进一步拓展与延伸。目前提出的模型预测控制算法主要有基于非参数模型的模型算法控制(MAC)和动态矩阵控制(DMC),以及基于参数模型的广义预测控制(GPC)和广义预测几点配置控制(GPP)。【知乎拷的】主要是现在的自动驾驶会用到这个控制方法来做车的制动、油门、方向盘转角的控制,最近很火。

虽然模型预测控制算法的种类有多种,但始终离不开这三大要素:

  • 预测模型——对未来一段时间内的输出进行预测;
  • 滚动优化——滚动进行有限时域在线优化(最优控制);
  • 反馈校正——通过预测误差反馈,修正预测模型,提高预测精度

MPC控制算法

MPC的全称是模型预测控制(Model Predictive Control),简单来说就是利用一个现有模型来针对系统未来状态进行预测,同时决定应该采取什么样的动作能保证系统在接下来一段时间内的状态能与之前预测的相符合。

MPC如何工作?

请添加图片描述
图1

借B站视频的图说明一下过程。在车辆行驶的过程中,当上层给出了规划的路径(Reference Line),控制模块就需要控制车辆沿参考线走。从k时刻开始,MPC会预测接下来p时刻车的轨迹,使得车逼近目标轨迹。在到达k+1时刻时,MPC会再次预测接下来p时刻车的轨迹,再走一个时刻,再预测p时刻。不断的迭代,在不断的向前推进的时候不是没有目的的,而是通过最小化Cos Function,来知道逼近的过程。需要注意的是MPC会每个时刻预测接下来的p时刻,但是只会根据预测走一个时刻,在到达下一时刻会接着预测,这个也是在线优化需要较大性能的原因。

大概过程应该都清楚了。个人感觉和智能算法有类似的地方,有Function知道这前进的过程。下面就是,它咋做到如此🐮的呢?:

MPC如何实现它的优化思想(工作过程)?

通过模型来预测系统在某一未来时间段内的表现来进行优化控制。多用于数位控制,系统模型通过离散状态空间表达X(k+1) = AX(k) + Bu(k)
如下图所示,k之前的是过去时刻(已知),k之后是未来时刻(未知)

在这里插入图片描述

MPC一般分为3步:

  1. 估计/测量当前系统的状态,也就是首先获取当前输入u(k-1)对应的输出y(k)。
  2. 基于最优控制策略得到的控制器输出u(k),u(k+1)…,u(k+N-1)来进行最优化,对应的被控对象模型预测输出y(k+1),y(k+2)…y(k+N)
  3. 重要一步,在执行下一时刻控制时,只取u(k) 进行输入,然后回到step1进行滚动优化控制。

疑问:

控制器和被控对象是什么?

在这里插入图片描述
在自动驾驶中控制器就是MPC模型,系统就是无人车系统

这里的JCos_Function是什么意思?

上上图和下图的代价函数其实是一样的,E表示的是误差项,u表示的是输入项,矩阵相乘的形式方便运算。
在这里插入图片描述
举例来说,以两入两出系统为例,系统状态即为输出,参考值为0:
在这里插入图片描述

有了代价函数如何来做最优化呢?

最优化部分的数学推导,挺烦人的数学推导。有几种方法来做优化的,下面只是其中通过二次规划来做。

二次规划(Quadratic Programming)

对于二次规划来说,一般形式是这样的:
在这里插入图片描述
前面是二次型的,后面是线性的。如果Q写成对角矩阵的形式(对角矩阵除对角元素完全是0,对角元素可以看作权重系数),那前面部分可以认为是求解最小二乘问题。(学过最小二乘,立个Flag下次写篇最小二乘复习一下

对于二次规划的求解,可以通过MATLAB或Python完成。所以对于模型预测控制来说,需要将我们的模型化成上述一般形式,并进行求解计算。

将MPC模型化成二次规划形式
首先给出模型,以及在k时刻的预测控制量u(k),即输入,以及对应的预测状态量x(k)N为预测区间(Predictive Horizon)。
在这里插入图片描述

假设条件及代价函数(假设Q、R为对角阵)
在这里插入图片描述
上述代价函数的输入包括当前时刻的xu,而对比我们上面给出的二次规划中的一般形式(只有一个输入z)还不太一样,因此对上述代价函数进行改造。设系统在k时刻的初始状态为 X(k)(已知)。

在这里插入图片描述

在这里插入图片描述

将 X(k)(上面绿色)公式代入代价函数J中,可得:
在这里插入图片描述

这时的代价函数形式与上面给出的二次规划的形式就是一样的了,其中 是初始的测量值,不影响做最优化的部分。

以上就是通过完整的数学推导建立最优化的数学模型,有了这个模型之后,我们就可以利用该模型对这个系统进行优化以及模型预测控制设计。
对于一个状态空间模型来说,它的维度可以表示如下:
在这里插入图片描述

例如,给出一个二阶的单输入例子:
在这里插入图片描述

对于上一篇文章中涉及到的一些变量,它们的维度分别为:

在这里插入图片描述
在这里插入图片描述

假设A、B矩阵以及预测区间分别为:
在这里插入图片描述

带入到上面的公式中:
在这里插入图片描述
在这里插入图片描述

上次课我们总结了,对于代价函数J,可以转换成下面这种形式,只包括已知的k时刻的状态量x(k)以及输入向量U(k):

在这里插入图片描述

参考链接

https://blog.csdn.net/zxxxxxxy/article/details/103700436
https://www.zhihu.com/people/xcalan9595/posts

下次学习Apollo在无人驾驶的MPC和PID控制。===>👏🏻👏🏻👏🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 202. 快乐数

题目链接:https://leetcode.cn/problems/happy-number/ 思路如下: 由题目可知,nnn 的取值在 [1,231−1][1, 2^{31}-1][1,231−1] 的范围内,在 [1,2147483647][1, 2147483647][1,2147483647] 这个区间里面,平方和最大…

【博客544】golang pprof性能调试:寻找memory瓶颈

golang pprof性能调试:寻找memory瓶颈 1、前置 pprof的使用与输出列解析看姐妹篇:golang pprof性能调试:寻找cpu瓶颈 2、引入pprof到程序中,以调试memory瓶颈 给程序加入: import _ "net/http/pprof"go…

Java 8 集合 Stream

Java 8 是一个成功的版本,新增的内容很实用。比如大家熟悉的 lamda 表达式,集合的 Stream,等等。 本文讲讲 Stream 的使用。 Stream 是什么? Stream 将要处理的集合看做流,然后方便的对流做操作,比如筛选…

node日志log4js库使用示例

在node开发或者electron项目开发中,我们可能需要记录日志的功能,便于我们出错排查问题。今天介绍node中的日志库log4js。 log日志记录,一般需要配置日志记录的级别,日志输出类型,日志格式等信息。log4js可以在初始化的…

ssh免密登陆

文章目录一、免密登陆1、生成密钥对2、将公钥拷贝到所创建的虚拟机上3、测试免密登陆成功没有二、遇到免密登陆失败的解决办法解决办法1、修改机器名,去掉.novalocal后缀2、重新做免密登录一、免密登陆 ssh密钥登录比密码登录安全,主要是因为他使用了非…

Spring - BeanPostProcessors 扩展接口

文章目录PreBean的生成过程org.springframework.beans.factory.config.BeanPostProcessor 介绍ApplicationContext注册Bean PostProcessor源码解析AbstractApplicationContext#refreshAbstractApplicationContext#registerBeanPostProcessorsPostProcessorRegistrationDelegate…

InnoDB底层存储结构探秘

一 innoDB 为什么不用平衡二叉树 计算机存储层次结构 计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory)。 内存储器为内存,内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在…

动物大全和动物识别系统毕业设计,动物大全和动物AI识别系统设计与实现,动物识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置:设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信息&a…

第七届NVIDIA Sky Hackathon项目报告书

系列文章目录 数据集收集和标注情况 1.1ASR语音数据集收集和标注情况 1.2CV图像数据集收集和标注情况进行模型的训练 2.1进行ASR模型的训练 2.2进行CV模型的训练在Jetson平台进行部署和推理 3.1部署和推理ASR模型 3.2部署和推理CV模型优化UI界面 文章目录系列文章目录1. 数据集…

详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心,经常需要往各个城市运东西,怎么运送距离最近——单源最短路径问题 各个城市之间也学要来往,相互之间怎么走距离最近?——每对顶点之间的最…

GNS3学习笔记

文章目录GNS3学习笔记一、GNS3支持的设备列表有哪些1、在安装根目录下 XXX\GNS3\appliances2、The NAT node 怎么使用二、GNS3使用错误汇总1、iosVL2 image(qemu平台)启动后进不去系统,一直重复进入开机界面三、参考链接1、GNS3应该使用那个模拟平台2、怎么集成VM到…

〖全域运营实战白宝书 - 运营角色认知篇⑧〗- 运营人的发展路径

大家好,我是 哈士奇 ,一位工作了十年的"技术混子", 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬 &#x1f4e…

Flink源码解析(一、source原理)

文章目录背景逻辑原理connector架构sql处理阶段代码实例代码debug参考文献背景 source/sink 是flink最核心的部分之一,通过对其实现原理的学习,结合源码debug,有助于加深对框架处理过程的理解,以及架构设计上的提升。 逻辑原理 …

详细介绍 Oracle中的Materialized Views(物化视图/快照)

A materialized view (snapshot) is a table segment whose contents are periodically refereshed based on query (against a local or remote table)(针对的本地或者远程表) The simplest way to achieve replication of data between sites for against remote tables: ma…

中断上下文和进程上下文

中断上下文 参考博客:(https://blog.csdn.net/AndroidBBC/article/details/81911065) 中断上半部分,中断触发;中断下半部分,中断执行。 中断执行一般有tasklet、工作队列实现 工作队列机制 工作队列所执行的中断代码会表现出进…

Linux | 第一篇——常见指令汇总【超全、超详细讲解】

Linux之常见指令🌳前言💻操作系统的概念💻Linux的使用环境介绍🌳基本指令汇总一、【whoami】指令二、【pwd】指令三、【mkdir】指令四、【touch】指令五、【ls】指令1、拓展:文件的概念2、命令 - 命令选项六、【cd】指…

AtCoder Beginner Contest 260 G.Scalene Triangle Area(花式二维差分/二维线段树)

题目 n*n的网格(n<2e3)&#xff0c; 每个网格内的字符是O或者X&#xff0c;其中O表示(i,j)上有一个棋子&#xff0c;X表示没有 位于(s,t)棋子覆盖住了方格(u,v)&#xff0c;当且仅当&#xff1a; 1. 2. 3. q(q<2e5)次询问&#xff0c;第i次给出一个方格位置(xi…

如何给在 SAP Business Application Studio 里开发的 OData 服务准备测试数据试读版

在开始本步骤的学习之前&#xff0c;请大家务必完成前一步骤1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务的学习。换言之&#xff0c;大家已经在 SAP Business Technology Platform 上的 Business Application Studio 里&#xff0c;创建…

Python实现基于Optuna超参数自动优化的xgboost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Optuna是一个开源的超参数优化(HPO)框架&#xff0c;用于自动执行超参数的搜索空间。 为了找到最佳的超…

docker 部署多个前端vue项目

文章目录一、docker 部署前端项目方案1. 方案12. 方案2二、Nginx配置运行2.1. 拉取nginx镜像2.2. 创建配置目录2.3. 创建Nginx容器三、部署前端项目3.1. 压缩3.2. 上传3.3. 验证附录index.html50x.htmlnginx.conf一、docker 部署前端项目方案 1. 方案1 一个docker容器对应一个…