PID控制算法详解
PID控制算法可以说是我比较早听说的算法了,但几年前我并不太了解原理,我只能按照公式敲除代码,但经过考研之后,我的高数进一步提高,有些东西我逐渐看透了。
本篇文章我将详细讲解我对PID控制算法理解。
首先,什么是PID,估计有人一脸懵逼的进来,还不知道什么是PID吧。
PID是一个控制算法,小到风扇调速,大到火箭轨道调整,都能有它的痕迹。
我会根据下面这个视频进一步讲解。
首先我先放出PID的图:
不难发现PID是一个闭环系统,问题来了,什么是闭环系统?什么是开环系统?
- 开环系统亦称“无反馈系统”,系统的输入影响输出而不受输出影响的系统。简单来讲就是我行我素,我直接输出。
- 闭环系统亦称“反馈系统”,系统的输入影响输出同时又受输出的直接或间接影响的系统。简单来讲就是我必须时刻检查我自己的情况,根据我自己的情况来进行输出。
由此可见闭环系统下需要至少一个传感器,用来检查自身情况。自身情况可以这样判断,因为我们需要一个目标值,由于使用了传感器,所以我还有一个检测值,那我就定义了一个变量:
我们可以这样理解 error 这个值,这是一个偏差,当前位置距离目标的一个差,如图下图所示,无人机想飞到白线的高度,但当前检测的高度和目标的高度有个偏差,就是红箭头标出来的偏差。
那怎么使用这个偏差去控制无人机的输出?按照下面的公式,或者你看上面那个框架图。
一些说明:
- $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)
还是看这个图:
如果我们对这个偏差进行微分会得到什么?距离的微分是速度,没错微分部分是对速度非常敏感,如果有速度,它才会有值,而且速度和它是正比的关系,拿它有什么用?
如果配合上P就有意思了,P是一直在震荡,这一直是有速度的,但如果把这个速度进行反向,比如正在向上运动的时候会有向上的速度,那加到一起输出会产生抑制的效果。那也就是说是D控制的是停止,这样就可以让P不再震荡。
注意如果$K_D$这个值过大,也会出现震荡的现象,但也别太小,效果不明显了。
代码里面很好写,就是用当前的输入减去上一时刻的输入,这样就模拟了一种微分状态。
积分(I)
我是最后才说的积分部分,其实以上已经可以做到很好了,但还是有个缺点,就是无人机的升力和重力二力平衡的时候,无人机就不会再上升,如果你做过这个实验你会发现,它总是和目标值还差一点,但它就是不动了,为了解决这个问题就引入了积分。
还是这张图,假设无人机悬停在这里了。
积分主要积的是从开始到当前所有的输入值,写代码的时候就是一直累加。你可能有个问题,一直累加的话岂不是一直上升,那么开始的时候全是正数,那无人机就会一直上升,直到超过目标值的时候,偏差会变成负值,这样累加的时候这个值会变小,就开始下降。
这个值对应的参数不建议给特别大,小一点就好了,可以先把PD的参数调好之后再调这个参数。
最后放一张调节的图,分别对应那几个变化情况。