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自行总结使用 的相关文章

  • 详解汽轮机的TSI系统

    汽轮机安全监视系统 TSI 是一种集保护和检测功能于一身的永久监视系统 是大型旋转机械必不可少的保护系统 TSI可以对机组在起动 运行过程中的一些重要参数能可靠地进行监视和储存 它不仅能指示机组运行状态 记录输出信号 实现数值越限报警 出现
  • 连载---《自动调节系统解析与PID整定》之一

    原创连载 自动调节系统解析与PID整定 之一 360doc com
  • 基于LabVIEW的PID算法解读

    记录一下 方便以后翻阅 下图是基本的PID算法实现方式 以及实现PID控制器所需的假设和转换 为实现PID控制器 LabVIEW要求算法对输入信号进行采样并离散积分和微分操作 一 误差计算 e k SP k PV k 上式中 e k 表示当
  • 深入浅出PID控制算法(三)————增量式与位置式PID算法的C语言实现与电机控制经验总结

    前文对PID算法离散化和增量式PID算法原理进行来探索 之后又使用Matlab进行了仿真实验 对PID三个参数又有了更深入的认识 接下来我们来使用C语言进行PID算法实现 并且结合控制电机的项目来深入学习 1 PID 算法C 语言原代码 先
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • 【平衡小车制作】(一)硬件原理图讲解(超详解)

    大家好 我是小政 之后的一系列文章我将介绍我玩平衡小车的过程以及遇到的一些问题 将这些内容记录下来分享给大家 也让大家少走一些弯路 接下来我将从硬件框架选择 软件编程 PID算法 PID调参 蓝牙遥控这五个部分向大家讲解平衡小车的制作过程
  • [现代控制理论]11_现代控制理论串讲_完结_pdf获取

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

    我正在编写几个 java 程序 在完成我想做的任何事情后 需要在单独的 JVM 中杀死 清理 为此 我需要获取我正在创建的 java 进程的 PID jps l可在 Windows 和 Unix 上运行 您可以使用 java 程序调用此命令
  • 控制范围和预测范围

    我已经回顾了模型预测控制的参考书目和 Gekko 编程结构 尽管我了解它的编程方式及其目的 例如 我想了解 Gekko 如何根据 Seborg 中的相关内容来管理控制范围和预测范围之间的差异 我看不出代码有什么区别 下面是一个用于说明的 M
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • 如何迭代 PCB 以显示 Linux 内核模块中的信息?

    我想编写一个 Linux 内核模块 它可以显示所有正在运行的进程的 PID 我有以下代码 procInfo c My Kernel Module for process info include
  • 子进程和父进程ID

    只是与子进程块中的父 pid 值混淆了 我的程序如下 int main int argc char argv pid t pid pid fork if pid 1 perror fork failure exit EXIT FAILURE
  • IIS应用程序池PID

    有谁熟悉获取与进程 ID 关联的应用程序池的方法吗 我正在使用 Win32 Process 查询 W3WP 服务并返回 PID 现在我正在尝试获取与其关联的应用程序池 在 Windows Server 2008 上 情况发生了变化 in s
  • 打印 pid_t 的正确 printf 说明符是什么

    我目前正在使用显式转换为 long 并使用 ld用于印刷pid t 是否有一个说明符 例如 z for size t for pid t 如果不是最好的打印方式是什么pid t 没有这样的说明符 我认为你在做什么 铸造pid t to lo
  • 如何在shell脚本中从fork子进程获取PID

    我相信我可以从父进程派生出 10 个子进程 下面是我的代码 bin sh fpfunction n 1 while n lt 20 do echo Hello World n times sleep 2 echo Hello World2
  • 确定监听某个端口的进程pid

    正如标题所示 我正在运行多个游戏服务器 并且每个服务器都有相同的name但不同PID和port数字 我想匹配PID正在监听某个端口的服务器 然后我想终止这个进程 我需要它来完成我的 bash 脚本 这可能吗 因为在网上还没有找到解决方案 您
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • fork()返回0,但是子进程getpid()!=0。为什么?

    这是测试 fork 系统调用的 C 代码 include
  • 如何查看linux中特定进程每5秒的内存消耗情况

    我只是想知道如何找到特定进程在特定时间 比如5秒 的内存消耗 我是linux新手 因此 详细的步骤将不胜感激 Use top p PID其中 PID 是进程 ID 应显示有关进程的信息 包括使用的系统内存百分比 类型d以及一个以秒为单位的整
  • 查看用户最近执行的Android任务

    我想查看我的 Android 手机最近的任务 我尝试了一些来自互联网的代码 但没有一个能正常工作 我只想获取用户最后执行的应用程序的PID和名称 例如 如果我执行计算器应用程序 然后执行我创建的最近任务应用程序 则该应用程序应该能够告诉我类

随机推荐

  • 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