Post

PID算法概述与其在VEX中的用途

0. 引言

PID控制器早在30年代末期就已出现,除了在最简单情况下应用的开关控制外,它是当时唯一的控制方式。经过50多年来的不断更新换代,PID控制得到了长足的发展。特别是近年来,随着计算机技术的飞速发展,发生了由模拟PID控制到数字PID控制的重大转变。与此同时还涌现出了许多新型PID控制算法和控制方式。例如,非线性PID控制、自适应 PID控制、智能PID控制等等。到目前为止,PID控制仍然是历史最久、生命力最强的基本控制方式。

1.PID的相关概念

PID即为Proportional(比例)、Integral(积分)、Derivative(微分)的首字母,简单来说就是一种控制算法。

PID控制理念最早提出是在1932年。美国瑞裔物理学家H Nyquist(哈利奈奎斯特)在其一篇论文当中提出了采用图形的方法来判断系统的稳定性。在他的理论基础上,荷兰裔科学家H W Bode(亨伯德)等人建立了一整套在频域范围设计反馈放大器的方法,后被用于自动控制系统的分析和设计,这也是PID算法最早从书面走向实践。

同时,反馈控制原理开始应用于工业过程中,1936年英国的A Callender(考伦德)和A Stevenson(斯蒂文森)等人给出了PID控制器的方法,自此PID算法正式形成,并且后来在自动控制技术中占有非常重要的地位。

PID的实际应用也是相当广泛的。比如四轴飞行器,再比如平衡小车;还有汽车的定速巡航、3D打印机上的温度控制器……在需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。

那么问题来了:比如,我想让一锅水的温度保持在50℃,这么简单的任务,为啥要用到微积分的理论呢?小于50度就让它加热,大于50度就断电,不就行了?几行代码就能解决的最简单的操作。

在要求不高的情况下,确实可以这么干,但如果换一种说法,你就知道问题出在哪里了:如果我要控制的不是热水而是一辆汽车,要求它的的车速保持在50km/h不动。设想一下,假如汽车的定速巡航检测在某时测车速为45km/h,发动机立即加速!!!!!

结果,发动机那边来了个100%全油门,几秒钟的时间汽车急加速到了80km/h。又过了没几秒这时检测仪又发出命令:刹车!

如此往复,汽车一会加速一会减速,什么后果不用我多说了吧。

2.PID算法

由此,最简单的二极管式01开关在实际生活中并不能正常工作。我们必须计算控制对象、执行单位、信息传递单位等的必要延迟。何况控制对象具有惯性,例如你将一个加热器拔掉,它的热惯性,也就是我们常说的余温,还会使水温继续升高一小会。

这时就需要一种算法:它可以将需要控制的物理量带到目标附近它可以“预见”这个量的变化趋势它也可以消除因为散热、阻力等因素造成的静态误差……

于是引出了PID算法。

PID是三种不同的调节作用,既可以单独使用(P/I/D),也可以两个两个用(PI/PD),也可以三个一起用(PID)。

3.PID参数

我们先说PID控制器的三个最基本的参数:kP,kI,kD.

3.① kP

P,Proportional(比例).

需要控制的量,比如水温,有它现在的当前值(current),也有我们期望的目标值(target)。

当两者差距不大时,就让加热器温柔地加热一下。要是因为某些原因,温度降低了很多,就让加热器稍用力加热一下。要是当前温度比目标温度低得多,就让加热器开足马力加热,尽快让水温到达目标附近。在这一例子中,加热器有不同的功率,这便是P的作用之体现。

在实际写程序时,就让Delta(=target-current)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制了。kP越大,调节作用越激进,kP调小会让调节作用更保守。

3.② kD

D,Derivative(微分).

在VEX机器人方面,例如我们常需要完成的任务:前进指定距离、转过指定角度,有了P的作用,车辆会在平衡值附近来回“狂抖”,难以稳定。

设想一个弹簧:现在在平衡位置上。拉它一下然后松手。这时它会震荡起来,因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。

请想象一下:要是把上文的弹簧浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。

我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。

当current比较接近target时,P的控制作用就比较小了。越接近target,P的作用越微小。有很多内在的或者外部的因素,使控制量发生小范围的摆动。

D的作用就是让物理量的速度趋于0,只要这个量具有了速度,D就可以用相反的方向用力,尽力刹住这个变化。

kD参数越大,向速度相反方向刹车的力道就越强。

3.③ kI

I,Integral(积分).

还是以烧热水为例,假设有人把我们的加热装置带到了非常冷的地方,水需要烧到50℃。在P的直接作用下,水温慢慢升高。直到升高到40℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。

而根据算法设计,P会认为current和target已经很接近了,只需要轻轻加热就可以了;D则认为加热和散热相等,温度没有波动,我好像不用调整什么。水温永远地停留在40℃,永远到不了50℃。

根据常识接下来应该进一步增加加热的功率,可是增加多少该如何计算呢?

这时候就可以设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使40℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加,系统就会增加功率。

到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率,得到稳稳的50℃。

kI的值越大,积分时乘的系数就越大,积分效果越明显。

所以I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。

注:I在使用时需要设定积分限制,以防止在刚开始处理时就把积分量积得太大,难以控制。

4.PID与VEX

设计一个PID控制器实现VEX机器人转向在VEX里是很常见的任务,一般步骤如下:
1.设置Target:需要确定机器人的目标方向。可通过遥控器、自动等输入;
2.测定Current:使用惯性传感器(通常是陀螺仪)测量当前转向速度与方向;
3.计算Delta:Delta=Target-Current;
4.计算PID Output

P:Delta*kP得到控制输出。
I:计算Delta累计值,乘上kI消除Static_Delta。
D:计算Delta变化率,乘上微分常数kD抑制振荡加速收敛。

5.计算总输出:P+I+D=总输出;
6.应用输出值至电机、循环控制并调整

This post is licensed under CC BY 4.0 by the author.