误差计算
计算PID的第一步就是计算误差(Error):误差=目标值-反馈值,在这个例子中,误差就是小球当前位置与目标值间的距离。
接下来的运算我们都会围绕误差进行,分为三个步骤使用误差分别算出一个分力,并将三个分力一起施加在小球上。
比例环节
第一个环节是比例环节P(Proportion),这个环节产生的分力是:
也就是说分力大小与误差成正比,当小球在目标左边的时候分力向右,当小球在目标右边的时候分力向左,其中是比例系数。
比例环节的计算方法其实就与上面大家通过直觉得出的方法差不多,如果只有这个分力作用的话,会产生什么效果呢?
大家可能会发现这不就跟中学物理里的弹簧滑块模型是一样的嘛,力与距离成正比,很明显小球会以目标位置为中心进行左右摆动(简谐振动)(注:图中蓝色短线表示控制力):
只有比例环节时的小球运动
微分环节
那么如何让小球能够静止在目标点呢?这就要请出PID的另一个环节:微分环节D(Differential)。
微分环节也会计算出一个分力,计算方法是:
也就是说,这个分力与误差的变化速度有关,在目标位置不变的情况下,小球向右运动时误差变化速度为负,分力向左;反之当小球向左运动时分力向右;综合看来,微分环节产生的分力始终阻碍小球的运动。
因此如果在刚刚的基础上加入微分产生的分力,就会产生一个阻尼效果,小球会仿佛始终受到一个阻力,因此左右摆动的幅度会逐渐减小,最终收敛到目标位置上:
有比例和微分环节时的小球运动
由公式还可以看出,微分系数可以影响这个“阻力”的大小,因此如果我们把系数调大一些,就可以让小球的运动收敛得更快一些:
调大kd后的小球运动
到这里,其实我们已经完成我们的目标任务了,小球可以在驱动力的作用下运动到目标位置。
积分环节
但现在,我们更希望在小球有一些外部干扰时也能实现上面的效果,比如我们在小球上加上一个水平向右的恒力,此时会发生什么呢?
恒力干扰下小球静止状态
小球在运动过程中仍然会像之前一样接近目标点,但在最终停下来时我们会发现,小球无法精确停在目标点上,而是像上图一样停在离目标点有一定距离的地方,此时控制力与干扰恒力平衡,小球静止。
稍加分析我们就能发现,此时小球静止,微分环节产生的分力为零,控制力完全由比例环节产生,且若距离更小则比例环节的输出更小,更无法平衡干扰力,因此小球无法继续向目标点接近。
此时就需要我们的第三个环节出场了:积分环节I(Integral)