写点什么

深入浅出 PID 算法

作者:劼哥stone
  • 2022 年 5 月 10 日
  • 本文字数:4652 字

    阅读完需:约 15 分钟

深入浅出PID算法

前言

博主是工业互联网行码农一枚,虽然不是算法工程师和自动化方向的,但经常参加同事介绍控制算法原理的培训,慢慢的对小部分控制算法有一定了解,其中使用频率最高的控制算法非 PID 莫属。很多同学在学习 PID 的时候,会被繁杂的数学公式吓倒,今天我们就抛开数学公式,用逻辑和例子给大家讲明白“到底什么是 PID”?

PID 算法简介

PID 是一种控制算法,是 Proportional(比例)、Integral(积分)、Differential(微分)的缩写。它是连续系统中技术最为成熟、应用最为广泛的一种控制算法。


PID 控制器主要适用于基本上线性,且动态特性不随时间变化的系统。简单来说就是:类似于需要将某一个物理量“保持稳定”的场合,PID 基本都能派上用场。


工业中 PID 典型的应用场景有:温度控制、流量控制、液位控制等。



生活中 PID 的应用也很常见:自来水的压力控制、空调的温度控制、平衡车的平衡控制、汽车的定速巡航控制、无人机的悬停控制、火箭飞机的姿态调整等。



实际运行经验和理论分析都表明,运用 PID 控制算法对许多工业过程进行控制都能得到比较满意的效果。

PID 的概念及公式

PID 的基本思路是根据偏差量的大小,运用比例、积分、微分计算出一个控制量,将这个控制量输入被控制的系统,系统接收到该输入量后会输出一个相应的输出量,PID 控制器再检测该输出量,并再计算偏差,然后再循环以上过程。



原始公式如下:

  • —— 控制器的比例系数;

  • —— 积分时间常数;

  • —— 微分时间常数;

  • —— PID 控制器的输出信号;

  • —— 给定值与测量值之差。


公式可简化为:

  • —— 控制器的比例系数;

  • —— 控制器的积分系数;

  • —— 控制器的微分系数;

  • —— PID 控制器的输出信号;

  • —— 给定值与测量值之差。

  • —— 上一次给定值与测量值之差。


很多同学可能会被上面数学公式整懵了,没关系,我们先看完下面例子,再回头看来公式,相信你能对以上公式有新的认识。


在学习 PID 之前,我们需要先了解什么是 开环控制闭环控制,这 2 个概念能够帮助我们更好的理解 PID。

开放回路控制系统

开环控制(Open Loop Control System):不将控制的结果反馈回来影响当前控制的系统。例如:


  • 开关——按下开关后的一瞬间,控制活动已经结束,灯是否亮起已对按开关的这个活动没有影响;

  • 投篮——篮球出手后就无法再继续对其控制,无论球进与否,球出手的一瞬间控制活动即结束。

闭环回路控制系统

闭环控制(Closed Loop Control System):需要将控制的结果反馈回来与希望值比较,并根据它们的误差调整控制作用的系统。例如:


  • 调节水龙头——首先在头脑中对水流有一个期望的流量,水龙头打开后由眼睛观察现有的流量大小与期望值进行比较,并不断的用手进行调节形成一个反馈闭环控制;

  • 骑自行车——同理,需要不断的修正行进的方向与速度形成闭环控制。


闭环控制系统通常会由以下 6 个环节组成。



我们拿“维持水缸水位高度在 1 米”为例,来详解闭环控制中的每个环节:


  • 传感器:人工测量当前水位高度

  • 目标量:维持水缸水位高度在 1 米

  • 偏差量目标量 - 当前水位高度

  • 控制器:根据偏差量计算出执行量

  • 执行量:传给执行器的入参

  • 执行器:人工用水桶向水缸中加水


其中传感器目标量偏差量执行量执行器 这 5 个环节都比较简单,一眼就能看明白意思。最关键的环节控制器相对复杂一些,在控制器环节选择不同的控制算法,根据偏差量计算出执行量也不同,今天我们就具体看看 PID 的控制效果。

PID 之比例P

前面有说到 PID 的基本思路是根据偏差量的大小,运用比例P积分I微分D计算出一个控制量。但 PID 的 3 个参数,并不是非要一起使用,可以单用比例P来控制,也可以两两联合用比例P+积分I比例P+微分D来控制。


我们先看看仅用比例P能带来什么样的控制效果?继续上面的“水缸”例子:


  • 传感器:人工测量水缸初始水位高度是 0.2 米

  • 目标量:维持水缸水位高度在 1 米

  • 偏差量:1 米 - 0.2 米 = 0.8 米

  • 控制器:使用 PID 算法的比例控制,根据偏差量计算出执行量

  • 执行量:传给执行器的入参

  • 执行器:人工用水桶向水缸中加水


通常情况偏差量执行量之间的单位不同,在当前例子里偏差量的单位是水缸,而执行量的单位是水桶,他们的容积不一样,所以我们需要一个系数,来放大或者缩小两者的关系。具体公式可抽象为:


执行量 = 比例P = 偏差量 * 比例P系数


这个时候,假设水缸旁边站着一个人,用水桶往水缸里加水来控制水位的高度。如果单纯的用比例控制算法,假设比例P系数是 0.5(相当于两桶水的容量等于一缸水的容量),我们开始模拟加水实验:



如上图结果所示,人工用水桶向水缸中加水 8 次,就能把水缸水位加到 1 米高度。把当前水位转换成曲线,大概效果如下。



上述例子比较简单,单靠比例P就能完成任务,但现实情况往往只有比例P是不够的,我们再来看一个更复杂的情况,假设比例P系数仍然是 0.5,但在每次加水的间隔,水缸都会漏掉 0.1 米高度的水。我们再从头模拟加水实验,看看具体结果会怎样?



如上图结果所示,当水位达到 0.8 之后,水位就不会继续增加了。因为,当水位等于 0.8 时,偏差量是 0.2,每次往水缸中加水的量为执行量= 比例P= 0.2 * 0.5 = 0.1,而每次加水的间隔,水缸都会漏掉 0.1 米高度的水,所以加入的水和流出的水相抵消。


虽然,此时控制系统已达稳定状态,但实际值目标量之间的会存在一个稳定差值,这个差值叫稳态误差稳态误差非常常见,比如:控制空调温度会因为空气温差而降温、控制无人机固定高度会受重力影响往下掉、控制汽车定速巡航会有空气阻力和摩擦力的影响而减速,这些场景都会产生稳态误差


单单只用比例P控制闭环回路,是无法避免稳态误差问题的,因为比例P系数无法根据时间或次数累加,当存在外界干扰因素时,比例P系数无法动态调整大小,那么稳态误差就会一直存在。


假如我们引入时间的维度,就能获得 2 个神器 增幅器-积分I抑制器-微分D,他们分别解决比例P过小和过大的情况,比例P过小的话由增幅器-积分I 补充即可解决稳态误差问题,比例P过大由抑制器-微分D消减来防止过度震荡。

PID 之积分I(增幅器)

我们先来看看增幅器积分I,它也可以理解为累加经验,当比例P过小,可以由积分I补充,它的原理是利用过去的时间不断累加。具体公式可抽象为:


比例P = 偏差量 * 比例P系数

积分I = 上一次积分I + 偏差量 * 积分I系数

执行量 = 比例P + 积分I


想象一下,如果用只比例P控制存在稳态误差,说明比例P过小,这时积分I就会不断累加到一个很大的值,来补充比例P,从而影响执行量


如果最终控制效果在目标量附近抖动,我们就能得到一个正负交替的偏差量,会在目标附近不断产生正负数累加到积分I积分I就会不断趋近于零,最终使控制效果趋于稳定。


我们继续用上面“水缸加水”的例子,假设目标量是 1,每次漏水 0.1,比例P系数为 0.5,积分I系数为 0.2,我们再从头模拟加水实验,具体数值如下。



把当前水位转换成曲线,大概效果如下。



上一轮实验只用比例P控制存在稳态误差。本轮实验加入了积分I之后就有了累加效果,在未达到控制效果之前积分I会持续累加,在达到目标量之后积分I因为惯性会继续过量控制 ,同时偏差量会由正转负再转正,积分I也会由正转负再转正,最终积分I会持续抵消掉每次漏水 0.1,控制效果趋于稳定 。


增幅器有他的危险性,如果系统出现意外或错误,增幅器可能会被累加到无限大,导致系统不可用,所以增幅器需要有一定的限制。


  • 1、限制幅度,在任意时刻都给积分I设定最大值和最小值。

  • 2、不运行时清零,当系统判断没有运行时,主动将积分I清零。

PID 之微分D(抑制器)

我继续再看看抑制器微分D,它也可以理解为预测未来,用当前的偏差量上一次偏差量,得到的结果就可能是下一次偏差量,用下一次偏差量提前参与到计算中,就可以防止执行量过大,产生超出目标量的问题。具体公式可抽象为:


比例P = 偏差量 * 比例P系数

积分I = 上一次积分I + 偏差量 * 积分I系数

微分D = (偏差量 - 上一次偏差量) * 微分D系数

执行量 = 比例P + 积分I + 微分D


换个“汽车刹车”的例子,平稳驾驶的车辆,当发现前面有红灯时,为了使得行车平稳,基本上提前几十米就松油门踩刹车。当车辆离停车线非常近的时候,则使劲踩刹车使车辆停下来,整个过程可以看做一个加入微分D的控制策略。


可以看到,在刹车过程中,因为偏差量是越来越小的,所以 微分D= (偏差量-上一次偏差量)*微分D系数一定是负数,在控制中加入一个负数项,他存在的作用就是为了防止汽车由于刹车不及时而闯过停车线。


从常识上理解,越靠近停车线,就越应该踩深刹车,不能让车过线,所以这个 微分D的作用,可以理解为刹车。当车离停车线很近,并且车速还很快时,这个 微分D的绝对值(实际上是一个负数)就会很大,表示应该大力踩刹车尽快让车停下来。


再回到上面“水缸加水”的例子,当发现水缸里的水快要接近目标量时,加入 微分D可以减少过量加水的幅度,说白了就是减少控制过程中的震荡。假设目标量是 1,每次漏水 0.1,比例P系数为 0.5,积分I系数为 0.2,微分D系数为 0.2,我们再从头模拟加水实验,具体数值如下。



上一轮实验使用比例P积分I联合控制,最高水位达到 1.3,超过目标量之后,水位最低回落至 0.83。本轮实验加入了抑制器微分D之后,最高水位仅达到 1.23,超过目标量之后,水位最低回落至 0.88,相比上一轮实验,本轮震荡幅度明显减小,这就是微分D的抑制作用。


分享一个动图,很好的展示了比例P积分I微分D的控制效果,其中红色虚线是目标量,曲线是用当前值的变化趋势。结合这个动图,大家再回想一下“水缸加水”的例子,控制效果是不是很相似呀~


PID 原理总结

我们用了“水缸加水”的例子,详细解释了 PID 的比例P积分I微分D三个参数的控制原理,相信小伙伴们已经明白什么是 PID 了。大家再回过头看这个公式,是不是也觉得挺亲切的。


  • —— 控制器的比例系数;

  • —— 控制器的积分系数;

  • —— 控制器的微分系数;

  • —— PID 控制器的输出信号;

  • —— 给定值与测量值之差(偏差量);

  • —— 上一次给定值与测量值之差。


最后再总结一下:


  • 比例P积分I微分D都跟偏差量有关

  • 比例P取决于当前的偏差量

  • 积分I累计过去所有偏差量之和

  • 微分D预测下一时刻偏差量


所以,经常有人说比例P是现在,积分I是过去,微分D是未来,是不是有一种哲学的感觉,哈哈~

PID 调参口诀

最后分享个 PID 调参口诀,写得挺好还挺押韵的~


参数整定找最佳,从小到大顺序查;

先是比例后积分,最后再把微分加;

曲线振荡很频繁,比例度盘要放大;

曲线漂浮绕大湾,比例度盘往小扳;

曲线偏离回复慢,积分时间往下降;

曲线波动周期长,积分时间再加长;

曲线振荡频率快,先把微分降下来;

动差大来波动慢。微分时间应加长;

理想曲线两个波,前高后低 4 比 1;

一看二调多分析,调节质量不会低;

若要反应增快,增大 P 减小 I;

若要反应减慢,减小 P 增大 I;

如果比例太大,会引起系统振荡;

如果积分太大,会引起系统迟钝。

参考引用


如有任何问题或建议,欢迎前往公众号【劼哥舍】留言~

发布于: 刚刚阅读数: 2
用户头像

劼哥stone

关注

爱折腾的码农,微信公众号「劼哥舍」 2018.04.03 加入

阿里云后端开发专家,熟悉云原生及Java核心技术,在分布式、微服务、编排调度场景有较丰富的实战经验,业务上对工业智能制造、影院运营管理、协同办公管理有不错的理解。

评论

发布
暂无评论
深入浅出PID算法_算法_劼哥stone_InfoQ写作社区