PID控制算法可以说是我比较早听说的算法了,但几年前我并不太了解原理,我只能按照公式敲除代码,但经过考研之后,我的高数进一步提高,有些东西我逐渐看透了。

bsuitang

本篇文章我将详细讲解我对PID控制算法理解。

首先,什么是PID,估计有人一脸懵逼的进来,还不知道什么是PID吧。

PID是一个控制算法,小到风扇调速,大到火箭轨道调整,都能有它的痕迹。

我会根据下面这个视频进一步讲解。


首先我先放出PID的图:

20181216103726414

不难发现PID是一个闭环系统,问题来了,什么是闭环系统?什么是开环系统?

  • 开环系统亦称“无反馈系统”,系统的输入影响输出而不受输出影响的系统。简单来讲就是我行我素,我直接输出。
  • 闭环系统亦称“反馈系统”,系统的输入影响输出同时又受输出的直接或间接影响的系统。简单来讲就是我必须时刻检查我自己的情况,根据我自己的情况来进行输出。

由此可见闭环系统下需要至少一个传感器,用来检查自身情况。自身情况可以这样判断,因为我们需要一个目标值,由于使用了传感器,所以我还有一个检测值,那我就定义了一个变量:

我们可以这样理解 error 这个值,这是一个偏差,当前位置距离目标的一个差,如图下图所示,无人机想飞到白线的高度,但当前检测的高度和目标的高度有个偏差,就是红箭头标出来的偏差。

2021-04-03_20-55-36

那怎么使用这个偏差去控制无人机的输出?按照下面的公式,或者你看上面那个框架图。

一些说明:

  • $u(t)$是输出
  • $e(t)$是输入
  • $K_P , K_I , K_D$这三个值是权重

这样下来没多难,无非就是把输入积分和微分累加一起,但它的具体原理可以说非常巧妙。

一般说调参,就是值调节$K_P , K_I , K_D$这三个值,这三个值就是调节这三个部分的大小,比如我只重视“比例”部分,也就是“P”部分,可以让$K_I , K_D$都为零,$K_P$不为零,这样保证了只使用了“P”部分。

接下来就说明一下每个部分的作用:

比例(P)

之所以叫他比例,是因为它是最主要的控制,想象一下,$K_I , K_D$都为零,如果偏差(也就是$e(t)$)特别大,产生的输出也会特别大,这样就可以快速的向目标值靠拢,如果偏差特变小,那输出也会特别小,缓慢靠近目标值。

但有一个缺点,就是会在目标值进行震荡,这是无法避免的,但可以调节$K_P$这个值控制震荡大小。如果这个值大了,靠近目标的速度会很快,但震荡的幅度会很大;如果小了,震荡的幅度会变小,但靠近目标的速度会很慢。

两个极端都不是我们想要的,所以需要合理去调节。

微分(D)

还是看这个图:

2021-04-03_20-55-36

如果我们对这个偏差进行微分会得到什么?距离的微分是速度,没错微分部分是对速度非常敏感,如果有速度,它才会有值,而且速度和它是正比的关系,拿它有什么用?

如果配合上P就有意思了,P是一直在震荡,这一直是有速度的,但如果把这个速度进行反向,比如正在向上运动的时候会有向上的速度,那加到一起输出会产生抑制的效果。那也就是说是D控制的是停止,这样就可以让P不再震荡。

注意如果$K_D$这个值过大,也会出现震荡的现象,但也别太小,效果不明显了。

代码里面很好写,就是用当前的输入减去上一时刻的输入,这样就模拟了一种微分状态。

积分(I)

我是最后才说的积分部分,其实以上已经可以做到很好了,但还是有个缺点,就是无人机的升力和重力二力平衡的时候,无人机就不会再上升,如果你做过这个实验你会发现,它总是和目标值还差一点,但它就是不动了,为了解决这个问题就引入了积分。

还是这张图,假设无人机悬停在这里了。

2021-04-03_20-55-36

积分主要积的是从开始到当前所有的输入值,写代码的时候就是一直累加。你可能有个问题,一直累加的话岂不是一直上升,那么开始的时候全是正数,那无人机就会一直上升,直到超过目标值的时候,偏差会变成负值,这样累加的时候这个值会变小,就开始下降。

这个值对应的参数不建议给特别大,小一点就好了,可以先把PD的参数调好之后再调这个参数。


最后放一张调节的图,分别对应那几个变化情况。

20181216103811570