PID/LQR/MPC自行总结使用

2023-05-16

                **PID/LQR/MPC自行总结使用**
  自学控制相关知识,已经一年多了,现在回头看看还是有很多模糊不明确的地方,准备借此机会进行总结一下,第一次写博客,如果错误和不合理之处,请批评指正。

1.pid
包括三部分:kp,ki,kd
kp:比例系数,可迅速反映系统的当前基本误差,从而减小误差,但无法消除稳态误差,比例过大会造成系统不稳定。
ki:积分系数,反映系统在一个周期内的累计误差,只要系统内存在误差,积分作用就会一直发挥作用,输出控制量对系统进行控制,积分作用太强则会使得系统超调加大,系统振荡。
kd:微分系数,反映系统误差的变化率,具有预见性,可以减小超调,提高系统的稳定性,加快系统的动态响应,但会放大噪声。
频域表达式为:
G ( s ) = K p + K i / s + K d ∗ s   . G(s) = Kp+Ki/s+Kd*s\,. G(s)=Kp+Ki/s+Kds.
时域表达式为:
u ( t ) = K p ∗ e ( t ) + K i ∗ ∫ 0 t e ( t ) d t   + K d ∗ d e ( t ) d t . u(t) =Kp*e(t)+Ki* \int_0^t e(t)dt\,+Kd*\frac{de(t)}{dt}. u(t)=Kpe(t)+Ki0te(t)dt+Kddtde(t).
离散化后为:
u ( k ) = u ( k − 1 ) + ( K p + K i ∗ T + K d T ) ∗ e ( k ) − ( K p + 2 K d T ) ) ∗ e ( k − 1 ) + K d T ∗ e ( k − 2 ) u(k) =u(k-1)+(Kp+Ki*T+\frac{Kd}{T})*e(k)-(Kp+\frac{2Kd}{T}))*e(k-1)+\frac{Kd}{T}*e(k-2) u(k)=u(k1)+(Kp+KiT+TKd)e(k)(Kp+T2Kd))e(k1)+TKde(k2)
其中,T为控制器的计算周期,即dt。
比例系数为:Kp
积分系数为:Ki= KpT/Ti
微分系数为:Kd= Kp
Td/T
参考资料:
https://www.cnblogs.com/qsyll0916/p/8580211.html
https://blog.csdn.net/yunddun/article/details/107720644

2.LQR
在基本控制理论的基础上,进一步设计一个代价函数,用于优化控制量,代价函数一般设置为系统达到稳定状态以及状态偏差最小,和控制量较小。研究对象为以状态空间方程形式给出的线性系统。
J = 1 2 ∫ 0 ∞ x T Q x + u T R u d t   . J=\frac{1}{2} \int_0^\infty x^TQx+u^TRudt\,. J=210xTQx+uTRudt.
代价函数一般要保证为正值,所以使用转置乘以本身,即达到平方的效果
Q,R分别为状态权重矩阵和控制权重矩阵。
Q半正定矩阵,R为正定矩阵。
LQR求解:

u = − K x u=-Kx u=Kx
代入代价函数:
J = 1 2 ∫ 0 ∞ x T ( Q + K T R K ) x d t   . J=\frac{1}{2} \int_0^\infty x^T(Q+K^TRK)xdt\,. J=210xTQ+KTRKxdt.
假设存在一个常量矩阵P使得:
d d t ( x T P x ) = − x T ( Q + K T R K ) x . ( i f ) \frac{d}{dt} (x^TPx)=-x^T(Q+K^TRK)x. (if) dtd(xTPx)=xTQ+KTRKx.if
反代回原代价函数可得;
J = − 1 2 ∫ 0 ∞ d d t ( x T P x ) d t   . J=-\frac{1}{2} \int_0^\infty \frac{d}{dt} (x^TPx)dt\,. J=210dtd(xTPx)dt.
解上式可得:
J = 1 2 ( x ( 0 ) T P x ( 0 ) ) , . J=\frac{1}{2} (x(0)^TPx(0)),. J=21(x(0)TPx(0)),.
微分展开if式左侧并移项得:
x ˙ T P x + x T P x ˙ + x T Q x + x T K T R K x = 0 \dot{x}^TPx+x^TP\dot{x}+x^TQx+x^TK^TRKx=0 x˙TPx+xTPx˙+xTQx+xTKTRKx=0
中间省略一系列推导过程可得:
A T P + P A + Q − P B R − 1 B T P = 0 A^TP+PA+Q-PBR^-1B^TP=0 ATP+PA+QPBR1BTP=0
A,B,Q,R都已知,可以解出上述Riccati方程
利用matlab即可求解:K = lqr(A,B,Q,R)
参考资料:
https://www.cnblogs.com/niulang/p/9066759.html
https://blog.csdn.net/gophae/article/details/101981600
https://blog.csdn.net/zhouyy858/article/details/107606500

3.MPC
与LQR一样,MPC也是进行优化,它们的目标函数都是多个优化目标乘以不同的权重然后进行求和得到,区别在于,在同一控制周期内,LQR只计算一次,而MPC则是一个滚动优化的过程,在每一个采样周期内计算得到一组控制序列,但是只是将第一个控制的值发给控制器。
MPC是一种基于模型的闭环优化控制策略。主要包括预测模型,滚动优化,反馈校正三个部分。其优点在于具有显式处理约束的能力这是因为:将约束加到未来的输入,输出或者状态量上,就可以改变模型对于系统未来动态行为的预测,且可以将约束放在一个在线求解的二次规划或者非线性规划问题中。
3.1.预测模型
预测模型要根据具体的工程背景来表示,目前用的较多的是状态空间模型。
一般我们得到的都是连续空间模型,需要将其进行离散化,得到离散状态下的状态空间方程。
x ( k + 1 ) = A ( T ) x ( k ) + B ( T ) u ( k ) . x(k+1) =A(T)x(k)+B(T)u(k). x(k+1)=A(T)x(k)+B(T)u(k).
其中:
A ( T ) = T A + I . A(T) = TA+I. A(T)=TA+I.
B ( T ) = T B . B(T) = TB. B(T)=TB.
建立新的状态方程为:
ξ ( k ) = [ x ( k ) , u ( k − 1 ) ] T . \xi(k) = [x(k),u(k-1)]^T. ξ(k)=[x(k),u(k1)]T.
ξ ( k + 1 ) = A ~ ξ ( k ) + B ~ Δ u ( k ) \xi(k+1) = \tilde{A}\xi(k)+ \tilde{B}\Delta u(k) ξ(k+1)=A~ξ(k)+B~Δu(k)
A ~ = [ A B 0 ( N u , N x ) I ( N u ) ] \tilde{A}=\begin{bmatrix} A & B \\ \\ 0(Nu,Nx) & I(Nu) \end{bmatrix} A~=A0(Nu,Nx)BI(Nu)
B ~ = [ B I ( N u ) ] \tilde{B}=\begin{bmatrix} B \\ \\ I(Nu) \end{bmatrix} B~=BI(Nu)
Nx为状态量的个数
Nu为控制量的个数
此处这么添加应该是为了状态空间方程维度的一致性,便于后续控制
针对此系统可以得知未来系统p步的状态和输出,可以依靠上述方程计算得出。令系统方程为:
Y ( k ) = S ξ ( k ) + S u Δ u ( k ) . Y(k) =S_\xi(k)+S_u\Delta u(k). Y(k)=Sξ(k)+SuΔu(k).
则一步一步推算可得:
在这里插入图片描述
在这里插入图片描述
在此基础上构建代价函数可得:

在此基础上添加控制量和状态量等约束,就可以通过计算机来求解,得到未来k步可能需要的控制增量:
在这里插入图片描述
取控制增量的第一项作为实际的控制增量,再根据上一步的控制输入u(k-1)即可得到当前步的实际控制输入:
u ( k ) = u ( k − 1 ) + Δ u ( k ) u(k)=u(k-1)+\Delta u(k) u(k)=u(k1)+Δu(k)
参考资料:
https://blog.csdn.net/u013914471/article/details/83824490
Torque Coordinated Control of Four In-Wheel Motor Independent-Drive Vehicles With Consideration of the Safety and Economy
https://zhuanlan.zhihu.com/p/99409532

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

PID/LQR/MPC自行总结使用 的相关文章

  • PID控制原理解释

    PID控制原理解释 文章目录 PID控制原理解释 0 前言 1 控制原理图解释 2 算法分析 3 PID数学模型解释 4 调参技巧说明 0 前言 参考网址 http blog gkong com liaochangchu 117560 as
  • PID稳压

    思路说明 我们设置一个目标值 这是我们要调节的目标 我们通过AD采样 PC3 采集到当前电压 通过减法运算我们得出当前电压与目标电压的差值 接下来我们只要发现当前电压与目标电压不同 我们就要想办法改变当前单片机的输出电压 PA8 也就是当前
  • 1_simulink简单入门_simulink仿真PID控制

    1 simulink简单入门 simulink仿真PID控制 2 simulink搭建RCL 电阻电感电容模块 毕业前想去做物联网还是或者linux 结果玩了一年多的电机控制 早就深知matlab simulink绕不过的 拖到现在 下班晚
  • PID算法应用于室内温度控制的C语言实现

    我最近在学习PID算法 对此很感兴趣 所以与大伙分享下 有不足的地方欢迎指出 非常谢谢 PID算法的基本内容本篇博客就不做阐述了 网上有很多资料 文章的主题是用C语言实现PID算法 为了更好的理解 我采用软件模拟室内温度控制的方式与大伙分享
  • 深入浅出PID控制算法(二)————PID算法离散化和增量式PID算法原理及Matlab实现

    引言 上篇介绍了连续系统的PID算法 但是计算机控制是一种采样控制 他只能根据采样时刻的偏差来计算控制量 因此计算机控制系统中 必须对公式进行离散化 具体就是用求和代替积分 用向后差分来代替微分 使模拟PID离散化为数字形式的差分方程 准备
  • Android : 通过pid获取app包名

    方法一 这个方法用在app主线程的activity或service里 因为要有context获取am private String getAppName int pid String pkgName ActivityManager am A
  • [现代控制理论]11_现代控制理论串讲_完结_pdf获取

    DR CAN的现代控制理论的笔记就结束了 加上这篇一共11篇 现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8
  • 控制范围和预测范围

    我已经回顾了模型预测控制的参考书目和 Gekko 编程结构 尽管我了解它的编程方式及其目的 例如 我想了解 Gekko 如何根据 Seborg 中的相关内容来管理控制范围和预测范围之间的差异 我看不出代码有什么区别 下面是一个用于说明的 M
  • 在 Unix 环境中检测过时的 pid 文件

    在 Unix 环境中检测陈旧 pid 文件的标准 跨平台方法是什么 假设我想终止应用程序的旧实例 但如果该应用程序已经退出 我当然不想破坏具有相同 PID 的不相关进程 现在我找到了一种在我的 Ubuntu 也可能是其他基于 GNU Lin
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • 如何确定 Linux 上是否使用 Java 或 JRuby 运行不同的进程 ID?

    我需要查看给定的进程 ID 是否正在运行 并且它必须在 Java 或 JRuby 中工作 最好是 Ruby 解决方案 它可能取决于 Linux 系统 特别是 Debian 和 或 Ubuntu 我已经有了我要找的PID 只需要看看它当前是否
  • Bash:是否可以阻止 PID 被重复使用?

    是否可以阻止 PID 被重复使用 例如 如果我运行一份工作myjob在背景中myjob 并使用获取PIDPID 是否可以阻止 linux 系统重新使用该 PID 直到我检查该 PID 不再存在 进程已完成 换句话说 我想做类似的事情 myj
  • 如何查看linux中特定进程每5秒的内存消耗情况

    我只是想知道如何找到特定进程在特定时间 比如5秒 的内存消耗 我是linux新手 因此 详细的步骤将不胜感激 Use top p PID其中 PID 是进程 ID 应显示有关进程的信息 包括使用的系统内存百分比 类型d以及一个以秒为单位的整
  • 在 python 中,是否有跨平台的方法来确定哪个进程正在侦听给定端口?

    在linux下 我可以使用lsof i如以下函数所示 def FindProcessUsingPort portnum import os fp os popen lsof i s portnum lines fp readlines fp
  • Process.start() 启动的进程返回错误的进程 ID?

    我正在使用以下代码启动可执行文件 Process proc new Process proc StartInfo FileName executablePath proc Start proc WaitForInputIdle 在这次通话之
  • AppleScript:从应用程序隐藏/获取进程名称

    我想隐藏最前面的应用程序 我知道您可以使用以下语法隐藏进程 tell application System Events set visible of process to false end tell 我知道如何获取最前面的应用程序 pa
  • 如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

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

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 如何在不使用adb shell的情况下获取android应用程序的pid?

    如何在不使用 adb shell 的情况下获取 Android 应用程序 pid 有没有API可以获取pid 任何帮助将不胜感激 由于每个应用程序都有自己的进程ID 因此可以通过 int pid android os Process myP
  • 如何在 alpine 中使用 ps 命令获取特定 PID 的进程名称

    在基于 ubuntu 的 docker os 中 ps PID USER TIME COMMAND 1 postgres 0 00 postgres 47 postgres 0 00 postgres checkpointer proces

随机推荐

  • torch.triu 与 numpy.triu 函数

    triu 61 tri angle u p xff08 我猜的 xff09 顾名思义 xff0c 这个函数的作用相同 xff0c 都是返回上三角矩阵 xff0c 定义分别如下 xff1a numpy triu m k torch triu
  • OpenVSLAM-全局优化模块(global optimization module)

    开源SLAM框架学习 OpenVSLAM源码解析 xff1a 全局优化模块 xff08 global optimization module xff09 xff1a 回环检测 pse graph优化 global BA优化 这篇博客主要介绍
  • Ubuntu20.04系统安装与基本配置

    Ubuntu20 04安装与配置 一 ubuntu20 04 5 系统重装 xff08 联想y7000p xff09 步骤一 xff1a 在 WIN10系统下创建空白磁盘分区步骤二 xff1a 镜像文件写入U盘步骤三 xff1a U 盘安装
  • 【向日葵】连接linux版向日葵出现瞬间断开的情况

    向日葵 连接linux版向日葵出现瞬间断开的情况 问题描述 xff1a 连接到Linux时就会在连接完成的瞬间出现连接已断开 xff0c 我的Linux发行版是Ubuntu18 04 解决 xff1a 这个问题出现的原因是向日葵不支持Ubu
  • 51单片机数码管显示数字及小数点

    51单片机数码管显示 共阴极 1 先看一下显示的结果 源代码 span class token macro property span class token directive hash span span class token dir
  • 数据结构之循环队列基本操作(c语言)

    队列 xff1a 队列是一种先进先出 First In First Out 的线性表 它只允许在表的一端进行插入 xff0c 在另一端删除元素 允许插入的一端成为队尾 xff0c 允许删除的一端成为队头 循环队列的顺序表示和实现 xff1a
  • 数据结构——先序遍历的顺序创建二叉链表并中序遍历(C语言)

    先序遍历的顺序创建二叉链表并中序遍历 1 算法步骤 xff1a 1 xff09 扫描数字序列 xff0c 读入数字n 2 xff09 如果n是一个 0 数字 xff0c 则表明该二叉树为空树 xff0c 即T 61 NULL 否则执行一下操
  • 51单片机的系统扩展之8255A

    8255 xff1a 8255芯片是Intel公司生产的可编程并行I O接口芯片 xff0c 有3个8位并行I O口 具有3个通道3种工作方式的可编程并行接口芯片 xff08 40引脚 xff09 其各口功能可由软件选择 xff0c 使用灵
  • ESP8266一直闪蓝灯,不停复位的解决办法

    问题 xff1a 在一次下载中无意间将下载的文件选错 xff0c 再次下载完成后就突然一直闪蓝灯 xff0c 不停复位 这并不是ESP8266模组坏了 解决办法 xff1a 1 我们平常下载程序选择eagle flash bin和eagle
  • Markdown快速入门

    Markdown快速入门 1 代码块 96 96 96 c include lt iostream gt using namespace std int main cout lt lt 34 hello world 34 lt lt end
  • VSCode 如何让去掉 Pylint 展示的花里胡哨的警告

    Pylint 是一个 python 的语法检测器 xff0c 提升编程效率的同时其带来的花里胡哨的警告也是真让人看着难受 xff0c 就像下面这花花绿绿的波浪线 xff1a 这些警告种类极其丰富 xff0c 比如下面这样 xff1a Met
  • 01_HC-SR04超声波传感器(GPIO中断+定时器方式)

    1 简介 xff1a HC SR04 超声波测距模块可提供 2cm 400cm 的非接触式距离感测功能 xff0c 测 距精度可达高 3mm xff1b 模块包括超声波发射器 接收器与控制电路 2 工作原理 xff1a 1 采用 IO 口
  • Faster R-CNN论文解读

    文章目录 AbstractIntroduction缘由RPN训练方案 Faster R CNN整体流程Conv layersRPNclsreganchorTranslation Invariant AnchorsMuti Scale Anc
  • c语言输入字符时控制符%c前加空格的原因解释

    文章目录 一 前景知识1 缓冲区2 标准输入流 二 scanf语句的执行1 scanf对于整形 d的输入2 scanf对于字符 c的输入 在编一个代码时偶然间发现一个知识盲点 用scanf语句输入字符时需要在控制符 c前加空格 在解释相关这
  • 解决c++中头文件重复包含的问题

    前言 c 43 43 项目中经常会使用到自己定义的一些函数和接口 xff0c 我们通常在头文件中包含进来 xff0c 但这样存在头文件被多次包含的危险 xff0c 导致编译报错 xff0c 以下介绍了几种常用的解决方法 一 采用宏定义的方法
  • 华为交换机5700 SSH配置

    一 在本地设备服务端生成密匙 Huawei rsa local span class token operator span span class token keyword key span span class token operat
  • 函数模板、类模板

    泛型编程 泛型编程 xff1a 编写与类型无关的通用代码 xff0c 是代码复用的一种手段 模板是泛型编程的基础 函数模板 函数模板代表了一个函数家族 xff0c 该函数模板与类型无关 xff0c 在使用时被参数化 xff0c 根据实参类型
  • STM32 第4讲 STM32原理图

    本文为学习正点原子得笔记 xff0c 主要讲解STM32原理图绘制 xff0c 主要由最小系统 43 IO口分布两步完成 引脚分布 STM引脚分类 xff1a 电源引脚晶振引脚复位引脚下载引脚 xff1a JTAG SWD 串口 JTAG
  • STM32 第12讲 GPIO:结构/8种工作模式/寄存器/驱动模型/配置步骤/实验

    文章目录 GPIO简介GPIO特点电气特性GPIO引脚分布 GPIO8种工作模式GPIO的基本结构8种工作模式 GPIO寄存器GPIO端口模式寄存器 xff08 GPIOx MODER xff09 GPIO端口输出类型寄存器 xff08 G
  • PID/LQR/MPC自行总结使用

    PID LQR MPC自行总结使用 自学控制相关知识 xff0c 已经一年多了 xff0c 现在回头看看还是有很多模糊不明确的地方 xff0c 准备借此机会进行总结一下 xff0c 第一次写博客 xff0c 如果错误和不合理之处 xff0c