前言:

这两天打算找个实习,奈何感觉自己有点菜,所以,就补习了一下知识,说一下,这个PID算法吧。

一、简介

PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。也就是说,PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。

顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应用最为广泛的一种控制算法,该控制算法出现于20世纪30至40年代,适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明,运用这种控制规律对许多工业过程进行控制时,都能得到比较满意的效果。PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出

二、闭环控制

这里有一个闭环控制与开环控制的概念,先说一下最简单的开环控制,就是不控制(好简单,哈哈哈)。

1. 开环控制

开环控制,就是控制回路不形成环,也就是,输出没有影响到输入的情况,输入只管输入,不依赖于输出。

这种情况下,可能系统由于外界干扰的等情况,导致输出并不是我们预期的输出,而是有一些偏差,这就不太好了。


粘一个知乎博主的图吧,就是如果想走到目标位置,由于外界影响走到了实际位置,但是因为是开环控制,输出并不会在行进过程中影响输入,也就是人并不会自动的根据输出来调整走的方向。这样就不太好。

2. 闭环控制

所谓闭环控制,就是输出影响输入,闭环控制是将输出量直接或间接反馈到输入端形成闭环、参与控制的控制方式。这样的话,当输出出现偏差的时候,就可以根据偏差来影响输入,进而调整下次输出的偏差。从而保持一种稳定情况。

如上图所示,假定在时刻T有:
输入【input(t)】、输出【output(t)】、误差【err(t) = input(t) - output(t)】、PID输出【u(t)】

系统真正的执行是执行的PID的输出值。系统的输出值,回到输入的地方,与当前时刻的输入进行误差计算,进而影响系统的执行过程。像这种输出影响输入的,就属于闭环控制。

如果上面开环控制部分:如果人的眼睛可以看到系统的执行输出,就可以影响人所进行的前进决策,从而调整系统的误差。这感觉就像形成了一个闭环控制。

三、PID算法的控制架构


如上图所示,就是PID算法的控制架构,它主要分为三个部分,并且这三个部分都是简单的相加就决定了u(t)。算是很简单的控制算法了。

接下来依次说一下:比例控制算法,积分控制算法,微分控制算法。

四、比例控制算法(P)

比例控制算法,我感觉应该是PID算法中比较核心的部分,感觉他是整个PID中的主力,至于其他的像积分控制算法,和微分控制算法,是为了消除误差,减少震荡。

如果在某一个环境中,如将水倒入水缸中,假设水缸的目的水位为1m,即r(t)为一个常量D=1m,

  1. 此时水缸为空,则当前的目的水位为0m,故此时误差e(t)为1m。此时的PID系统只有比例控制算法,故,u(t)=Kp * e(t),假设Kp为0.1,故此时u(t)为0.1m,将0.1m的水倒进水缸中去。
  2. 水缸中有了0.1m的水,此时的误差就为0.9m,故此时需要加入0.09m的水,可以想象,这里就是一个累加的过程,最终终将会将水缸倒满。

在理想状态下,其实有比例控制算法就完全可以满足要求,但是,如果水缸漏水怎么办,如每当你放入0.05m的水,水缸就漏0.05m的水,这就导致最后水缸是永远填不满的,并且水缸水位保持固定,这就导致了这个误差会是一个稳定值,称为稳态误差,也就是这个误差通过PID算法计算出来的u(t)完全没有起到作用。

( 在实际情况中,这种类似水缸漏水的情况往往更加常见,比如控制汽车运动,摩擦阻力就相当于是“漏水”,控制机械臂、无人机的飞行,各类阻力和消耗都可以理解为本例中的“漏水”)

五、积分控制算法(I)

积分控制算法,就是为了消除稳态误差,由于积分是从0时刻一直积分到当前时刻 t,并且是对e(t)函数进行积分。

  1. 在到达节点位置之前,e(t)始终是正的,也就是它的积分始终是大于0的,如果系统存在稳态误差的话,由于误差一直不变,但是积分变呀,积分会一直积下去,之前的稳态误差是中和了比例控制算法的值,现在有一个一直增长的积分,导致每次u(t)的输出也在一直的增大,从而稳态误差就被消除了。到最后,误差为零了,而此时的e(t)也为0了,积分也就固定在某一个值了。从而每次的稳态误差就都可以被消除掉。
  2. 如果到达节点位置之后了,也就是冲过了节点的指定位置,这时候误差就变为了负的,然后由于积分正负可以相减,同样可以很好的适应这种情况。

六、微分控制算法(D)

用了积分控制算法,现在可以消除稳定误差了,但是考虑下面几种情况:

  1. 现在的情况是不存在稳态误差,但是存在积分控制算法,那么问题就出现了,当到达了目的位置后,哪怕误差已经是0了,但是积分控制算法那里还是一个整数,导致下一次输出u(t)仍然为一个整数,而不是0,这样的话,就会越过目的位置,虽然之后误差就变成了负数,又会回落回目的位置,但是这样始终是震荡的,而不是一直稳定下去。
  2. 在初始状态下,如果Kp或者Ki设置的过大,则会导致u(t)的变化幅度过大。

综上,在上述情况下,加入微分控制就很有必要,其实微分控制的作用就是防止幅度过大,导致震荡或者超调,微分就是为了在输出斜率变的太大之前,在系统中引入一个有效的早期修正信号。微分可以防止震荡。

当存在稳态误差的时候,由于微分对于常数的求导是0,故微分不能解决稳态误差的问题。单独使用意义不大,故需要与比例积分共同配合使用,构成PD或PID控制。

七、PID算法公式

PID算法公式如下图所示,Kp作用于所有的项,然后给积分部分再额外配一个系数,给微分项再额外配一个系数。

Kp —— 比例增益,Kp与比例度成倒数关系;
Tt —— 积分时间常数;
TD —— 微分时间常数;
u(t) —— PID控制器的输出信号;
e(t) —— 给定值 r (t) 与测量值之差。

这样再一看这个PID算法是不是就一目了然了呢。

接下来说一下公式推导。

1. 位置式

由于PID算法原型是连续函数,这样的一个操作在计算机中怕是不太行,所以需要将其离散化。从时刻0开始每隔 △t 时间间隔进行数据采样,则会形成下列一系列时间节点

(e0,e1,e2,e3 … ek)

相应的有

(u0,u1,u2,u3 … uk)

则有积分为离散化累加,微分为与上一时刻节点的连线斜率:

不过不影响理解,可以看到对于积分部分和微分部分,把 △t 都写成了T,然后把Kp都乘了进去 。然后对于以上的式子,给他们配一个统一的系数,即称积分部分为Ki,微分部分为Kd,则有如下式子:


这样的话,就清晰很多了,并且离散化的数值有利于计算机实现。

2. 增量式

这时设 △u(k) = u(k) - u(k-1) ,最终得到的增量式PID的离散公式如下:

八、结语

关于PID算法应该是超级简单的,下面我贴一个视频演示,以及两个我主要参考的博客吧。

PID控制算法原理(抛弃公式,从本质上真正理解PID控制)
简易PID算法的快速扫盲(超详细+过程推导+C语言程序)

【 PID 算法 】PID 算法基础相关推荐

  1. 基于stm32与陀螺仪(mpu6050)的PID角度环算法,角度用OLED显示,使得智能车能在长时间跑直线和转直角弯,减小误差

    首先,我做智能车用的是stm32f103c8t6作为主控芯片,得到小车自身对于开始位置的三维变换角度所用的是mpu6050模块,其与主控芯片采用I2C通信.此通信原理接下来会加入介绍资料.其次还有一个 ...

  2. 万能算法PID趣味总结

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! PID的数学模型 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的 ...

  3. 【PID控制原理及其算法】

    前言 本文以自己的学习过程总结而来,将自己的经验写出来以供大家一起学习,如有错误请多指教 一.PID是什么? PID就是比例.积分.微分,PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生 ...

  4. 红外循迹传感器PID循迹算法

    红外循迹传感器PID循迹算法 前一段时间参加了一个小车循迹竞速的比赛,获得了一个还行的成绩,所以在这里想把里面的核心部分PID寻线算法给大家分享一下. 关于做好的实物视频我上传到了B站,大家可以点击查 ...

  5. 用纯C语言分别实现增量式与位置式的PID自整定算法

    对于增量式PID自整定算法,C语言代码如下: #include <stdio.h>#define SAMPLE_TIME 0.1 // 采样时间 #define KP_DEFAULT 0. ...

  6. 对串级PID控温算法的解析

    ​​​​​​​目录 前言 单级PID 串级PID 系统分析 算法分析 总结 前言 笔者在做项目的过程中,需要对一个目标物体做精确控温,精度要求±1℃,需要在两分钟内使用电阻发热贴将温度由20控制到41 ...

  7. 基于BP神经网络的PID控制,神经网络算法pid控制

    基于BP神经网络的PID控制器设计 参考一下刘金琨的<先进PID控制>这本书. 例子:被控对象yout(k)=a(k)yout(k-1)/(1+yout(k-1)^2)+u(k_1)其中a ...

  8. KNN算法的机器学习基础

    KNN算法的机器学习基础 https://mp.weixin.qq.com/s/985Ym3LjFLdkmqbytIqpJQ 本文原标题 : Machine Learning Basics with ...

  9. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  10. 机器学习中的算法-支持向量机(SVM)基础

    机器学习中的算法-支持向量机(SVM)基础 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处 ...

最新文章

  1. .NET基础示例系列之六:委托及事件
  2. java架构升级_java架构之路(多线程)synchronized详解以及锁的膨胀升级过程
  3. 【中级软考】什么是非对称加密算法?
  4. CentOS7 安装Redis 单机版
  5. 破译密码、设计飞机和建设团队:Randy Shoup谈高绩效团队
  6. HashMap与LinkedHashMap的结构对比
  7. DirectX Repair(DirectX修复工具)官方中文增强版V4.1.0.30770 | directx repair修复工具增强版下载
  8. 最佳实践 | 联通数科基于 DolphinScheduler 的二次开发
  9. 【Qt编程】基于Qt的词典开发系列十--国际音标的显示
  10. Dirt Ratio HDU - 6070
  11. C++面试之Linux操作系统
  12. c语言:24、大小端序
  13. C语言中整形的大小和范围
  14. [练习]QQ/微信 表情收藏-测试用例的编写 [简洁思路]
  15. 微信小程序使用qrcode生成二维码(可用于微信收款)
  16. Java基础学习—— IO流
  17. 域名不带www的解析方法
  18. 基于高斯消元的BATS码的改进译码算法
  19. 『论文笔记』TensorFlow1.6.0+Keras 2.1.5+Python3.5+Yolov3训练自己的数据集!
  20. CSS命名规范-BEM

热门文章

  1. linux系统分区磁盘,Linux 操作系统手动磁盘分区详细说明
  2. linux 内核书籍记录
  3. CS224n(2019):Assignment2 参考答案
  4. 用计算机计算勾股定理,勾股定理公式计算器(勾股定理计算工具)V2018.1.0 官方版...
  5. 【Maven】阿里云镜像仓库
  6. 左耳朵耗子给出的学习指南
  7. x550网卡linux驱动,Intel英特尔X520/X540/X550系列网卡驱动24.3版For Win8.1/10(2019年11月4日发布)...
  8. 系统重启-------即java代码重启tomcat!
  9. 高校实验室安全隐患及安全建设-LIMS2
  10. 林子雨大数据软件安装和编程指南导航