本文转载自微信公众号“电子搬砖师”,原文链接
这篇文章会以特别形象通俗的方式讲讲什么是PID。
很多人看到网上写的PID文章,要么是一堆公式,要么是充满疑惑的例子,就觉得PID是个很难的控制算法。其实要理解PID很简单,读者完全可以有这种认识和信心。
一、PID是什么?
PID控制是一种自动控制方式,它可以使得被控对象按照设定量运行。常见的PID控制例子有无人机自平稳,平衡车自平衡,空调控制房间温度恒定等。
那么PID是什么控制原理?为什么叫 “PID” ?
我们举一个例子做说明:
假设你在推箱子,你需要将箱子推到距离你100米处的终点,那你应该用什么方法才能又快又准确地将箱子推到目的地?最简单好用的方法是:
在距离目的地远的地方用大力气推,在距离目的地近的地方用小力气推。
抛开物理公式,用直觉想想看,要想快准狠的到达目的地,最理想的方式是不是推力和距离成比例?在距离远的时候因为推力大所以速度快,可以节省时间;在距离近的时候减小推力,防止速度太快冲过了头。随着距离越来越近,推力越来越小。
Proportion,比例
这个距离和推力成比例的思想就是PID控制理论中三大核心内容之一 ——比例控制,英文单词是Proportion,简写成 P。
由于箱子和地面有摩擦力,在距离100米处给的推力大可以轻松推动箱子,但在距离5米地方可能因为推力小推不动箱子了。这时由于距离较短,依据比例控制得到的推力一直不足以推动箱子,所以箱子就会一直处在距离目的地5米的地方不动。这种和设定量一直存在静态误差的现象也称为静差,我们要想办法消除静差。
小贴士:通常电子控制系统都是每隔一段时间查看当前状态和设定量是否还有偏差,如果有则继续制动以消除偏差,我们可以利用这一特性消除静差。 |
---|
回到推箱子事件中,假设我们每秒观测一次当前位置和目的地的距离,我们将每次的距离值累加起来。上一秒距离5米,这一秒还是距离5米,则累加值就会是10米,下一秒距离如果还是5米,则累加值就是15米。将累加值乘以一个系数添加到推力中,则随着时间的延长,终有一刻会再次推动箱子。最终实现哪怕有一丁点的静差,都会被累加值消除掉,使得控制对象精准等于设定量。
Integration,积分
这个累加消除静差的思想就是PID控制理论中三大核心内容之一——积分控制,积分就是累加这个动作的美称,积分英文单词是Integration,简写成 I。
此外,由于距离和推力的比例设定过强或者箱子和地面的摩擦力太小,有可能造成箱子被推过头,然后再推回来,往往复复好几次才停下来的结果。我们希望箱子能尽快推到正确位置,所以必须减少这种震荡调节的次数。为了让箱子在即将到达目的地的时候能及时减速停下来,我们必须关注箱子的距离的变化率,或者说是速度。我们将箱子的距离的变化率也乘以一个系数作为阻力,将这个阻力叠加到推力上,如果上一时刻的距离和这一时刻的距离相差太大,即箱子推动速度太快了,推力就会因为阻力大而变小一点;如果上一时刻的距离和这一时刻的距离相差不太大,推力就会因为阻力小而基本不受影响。这样就可以避免快到终点时因为用力过猛而推过头。
Differentiation,微分
这个依据距离变化率调节阻力的思想就是PID控制理论中三大核心内容之一——微分控制,距离变化率(速度)就是距离的微分,微分英文单词是Differentiation,简写成 D。
将以上三种控制方式叠加在一块,就是PID控制了。
读到这里,可能大家对积分项和微分项会有两个疑问:
- 如果每次都将箱子距离累加起来,那从100米推到0米时,积分项不是要变得非常大?这么大的一个积分乘以一个系数变为推力,那在0米时就会有很大的推力,这不就破坏系统平衡了?
- 箱子距离变化率,或者说箱子推动速度,如果这个值很大,乘以微分系数就会得到比较大的阻力,那距离目的地100米时,本来需要很大推力的,结果阻力也很大,这不是自己给自己添堵吗?
回答第一个问题:
如果被控对象的当前状态量和目标设定量差距很大,那在向目标设定量靠近的过程确实会累计比较大的积分,并且在首次达到目标设定量时确实会因为积分项太大导致冲过头了,但是兄弟们,冲过头之后状态量就是负的了,系统就会将这个负的状态量也累加到积分中,从而逐渐削弱积分项。最终,在来回震荡几次后,积分项就会逼近于零。另外,拿四轴来说,通常在启动四轴时,都是平着放的,即初始偏差角度和机械中值差别并不大,累加不到什么积分。
回答第二个问题:
确实箱子在距离100米时应该要很大的推力,进而也会受到很大的阻力。但是微分项此时的控制作用干不过比例项,只有当箱子距离小了,比例项强弩之末了,这时如果速度还很大,微分项就会起到很大的阻滞作用。
二、科班风格解释PID
PID公式如下:
其中u(t)是t时刻PID算法的输出结果,对应推箱子的例子就是推力了;Kp是比例项系数,e(t)是t时刻状态值和设定值的误差;Ki是积分项系数,它后面的那一串就是误差的积分;Kd是微分项系数,它后面的那一串是误差的微分。我们通过调节Kp、Ki、Kd三个系数,就可以使得系统稳定工作起来,这个调节系数的过程也称为PID参数整定。
PID控制有两种,以上式子属于位置式PID,还有一种是增量式PID。增量式PID由这一时刻位置式PID输出减去上一时刻位置式PID输出得来,公式是:
经过一堆的计算,最后可表示为:
其中q0,q1,q2都是系数,e(t),e(t-1),e(t-2)分别是此刻误差,上一时刻误差,上上一时刻误差。我们通过调节q0,q1,q2三个系数,就可以使得系统稳定工作起来。
位置式PID和增量式PID有什么差别?哪个好用一点?
通常位置式PID用于执行机构不会将PID输出值累积起来的系统,而增量式PID用于执行机构会将PID输出值累积起来的系统。举个例子,步进电机就属于会累积PID输出值的执行机构,当PID输出一个值给步进电机,步进电机会转过一定的角度,然后PID再输出一个值给步进电机,步进电机会在上一刻转角基础上再转过对应的角度,即执行机构会将历史值累积起来。而我们常用的四轴,属于PWM控制电机,就用位置式PID比较合适。因为PID输出一个值给PWM,PWM控制电机产生一个速度,然后PID再输出一个值给PWM,PWM控制电机产生另一个速度,后者的速度不会在前者的速度基础上累加,二者相互独立。
这篇文章的主旨是PID入门,暂时点到这里,下一篇文章属于PID算法进阶,会讲讲PID算法的优化和串行PID。