本文灵感来自于 仪表云 视频:10分钟了解PID工作流程,下面附上连接
笔者属于控制入门,文中若有不当之处还请读者指出,欢迎大家讨论!
———————————————正文———————————————
在 PID控制原理 一 (开闭环控制) 一文中已经介绍了开闭环控制,并且介绍了一种最简单的控制器:Bang-Bang Control
笔者已经说过,BangBang Control太傻,因此为使控制变得更智能一点,希望引入一种聪明的控制器。接下来,我们依旧利用PID控制原理 一 (开闭环控制)文中的小车沿着路线行驶的转向控制来讲解:
——————————————前提准备——————————————
图1中小车向东行驶,车速恒定,其目标是最终沿着目标路径走(有目标,闭环控制),路径有方向,黑色箭头为路径延伸方向
图 1
在此,我们设定小车距离目标路径的实际距离为Cross Track Error ( Ep ),由于目标距离=0;所以 Ep也就是误差;
Ep方向:当小车在目标路径右边,则Ep>0;若小车在目标路径左边,则Ep<0
另外,如果小车想走到目标路径,就必须先拐弯,因此我们设定小车每次的转弯角度为Sa, Sa就是控制输出(每个控制周期的输出);
Sa方向:当Sa>0时,小车向左拐(小车前进方向的左);当Sa<0时,小车向右拐(小车前进方向的右)
如图 2,可以借此画出小车闭环控制的逻辑图,循环控制周期为‘ t ’:
图 2
————————————-PID控制器设计—————————————-
1.P Control
BangBang Control最大的问题就是每次的控制量Sa恒定,因此当小车接近目标时,很容易控制超调,导致控制震荡
那么是不是可以这样想:
如果Ep比较大的话(小车距离目标路径远),就让控制量Sa大一些;而Ep比较小的话(小车距离目标路径较近),就让控制量Sa小一些;这样当小车接近目标路径时,就可以防止超调了!
就是说Sa是随着Ep变化的;Ep大,Sa就大,Ep小,Sa就小;就是成正比
引入控制周期 t,可以得出这样的公式:
就是比例控制啦!控制逻辑图如下图所示
引入P控制的结果,可以通过调节P的大小来调节Sa(t):下图显示是不同P值对小车控制所产生的影响:P较小时,小车到达目标路径比较慢;P较大时,小车到达路径比较快;
我们将BangBang Control和P Control进行了比较,可以发现使用P Control达到目标路径后,小车沿着目标路径行驶更稳,基本不会震荡了;但是如下图所示,小车在前期控制时总会超调,震荡的问题并没有完全解决。可以看到小车在向目标路径行进时,可谓是一头扎进了终点线。
P控制最容易前期超调,这是由于第一次控制时,Ep(1)过大,会导致Sa(1)过大,小车会急速向目标路径扎去,而离目标路径越近,Ep(t)虽然小了,但小车的前进方向基本已经维持了。从上图中我们可以很形象的观测到Sa(t)的变化[红色箭头 与 黑色箭头 的夹角=Sa(t)]
实际上,对于希望设计一个更智能化控制器的笔者来讲,我更希望他达到如下图所示的结果:
是不是很干脆利落?
要想达到以上目标要怎么办呢?我们是否可以对控制器进行一点修改来解决以上问题
好了,请跟着笔者一起设计一个这样的控制器吧!
2.PD Control
在之前,我们已经确认了输入Ep,输出Sa;并且为了控制更加智能,我们希望Sa是受Ep控制的,即Sa = f (Ep),而直接让Sa = P * Ep 会导致小车在前期追踪目标路径时,由于控制Sa太大而导致超调
实际上,Sa每次控制过大,就会导致Ep减小的速度过快,就是Ep的变化率太快!
Ep的变化率:小车沿着目标路径的垂直速度,设为Ed
我们可以如此设计,在P Control的基础上,如果小车距离目标路径的距离变化太快时(Ed过大),就让Sa小一点,甚至反向
因为
即Ed就是Ep的微分,为使得Ed可以影响Sa,可以在P Control的基础上加入一个微分项(请注意符号),如下:
此外,在上述控制器中,笔者加入了一个微分增益D,以方便调节微分项的占比。这样当Ed(t)越大时,Sa(t)就会越小。而且如果Ed(t)足够大,Sa(t)就会 与 仅仅使用P Control时 反向。而以上公式就是PD control,控制逻辑如下图所示:
下图中为我们展示了引入垂直速度Ed(微分项)后Sa的变化(深红线和黑线的夹角就是Sa,黑线是小车前进的方向):
可以看到,由于引入了垂直速度(微分项)的缘故,使得只有P Control得出的Sa变得比原来变小了一些;可以说这里微分项是为了防止小车控制过快(抑制控制过快!)的点睛之笔
注:有时候微分项也用来加速控制,读者可以自行考虑
下面,对于PD Control,保持P不变,我们试着对微分项的占比 D 进行调节,来看看最终的控制结果:
可以发现,如果D太小了,微分项没什么作用,控制结果和P control差不多,我们称其为欠阻尼
如果D过大的化,抑制太厉害,小车需要很久才能到达目标路径,我们称其为过阻尼
只有一个好的D,让小车比较快的进入了目标路径,还不用怎么调整,实则妙哉,我们称其为临界阻尼,即刚刚好的阻尼力
相比P Control来说,PD Control可以说是既聪明又干净利落。然而,人非圣贤,孰能无过?即便就是如此聪明能干的PD Control也有他的缺点
3. PID Control
实际控制中,路面情况不可能是一成不变的,小车很可能受到外界的干扰;
比如,下图中,小车本来好好的行驶在目标路径中,这时候突然有块破石头迫使小车偏离了原来的路径:
可以看到,明明小车在偏离路径后,经过PD Control是输出了一个向南转弯的Sa(基本全靠P控制输出,D控制此时没啥用,因为没啥垂直速度)。但是为什么小车就是死活不动,总与目标路径有那么一点偏移距离(Lane offect)呢?
这是因为,小车的轮子和目标路径存在着一定的摩擦力。因此即便PD Control输出了一个Sa,但是可能由于摩擦力(主要是静摩擦力)的原因,导致真实转角根本达不到Sa,甚至真实的转角是0°
注:一般Sa的控制都是由舵机控制,舵机受电压控制,其实电气控制系统中真正的控制量都是电压电流。理想状态下,一般一定电压V就会对应一定的舵机转角Sa,Sa与V成正比,比较好的情况下该关系都会被满足(比如轮子只受到滑动摩擦力时)。但是这里的期望控制输出明明是Sa而系统达不到Sa的原因是此时处于特殊情况(静摩擦)
我们把这个偏移距离(Lane offect)叫做稳态误差
从PD Control公式
我们也可以发现,每次控制的Ep(t)(稳态误差)都一致,且很小,导致每次控制的Sa(t)也一致,且超级小,这可怎么办呢?(此外,Ep(t)不变,导致微分项一直为0)
也许聪明的读者已经想到了,那我能不能再加入一个项,这个项能随着时间进行累加。这样即使Ep不变,但随着时间累加,控制得到的Sa不就变大了。小车也就可以克服摩擦力,而顺利进行转弯了吗!
说干就干,那我们就加一个随着时间累加的量。就让Ep随着时间累加。而随着时间t累加不就是Ep(t)积分吗,因此我们推出公式:
这样我们在PD Control的基础上加入了一个积分项,且引入了积分增益 I 以用来调节积分项的占比。而这,就是大名鼎鼎的 PID Control了!逻辑图如下:
当P,D参数不变时,只调整 I ,结果如下:
最终的Sa控制是由P,I,D共同作用的。对于稳态误差的消除来说,I 如果过小,效果不明显;I 过大会造成小车在进入目标路径后震荡;
只有刚刚好的 I 会使得小车在产生稳态误差后快速到达目标路径
OK,以上就是PID控制器啦!OVER!
———————————————总结——————————————–
闭环控制的总体思想是以误差(实际值与目标之差)作为输入,进行一定的调节,如PID调节来对输出量进行控制。而输出量则会作用到受控系统实实在在的影响到实际值,从而影响误差,如此往复的一个循环。
文中视频原出处: