PID控制算法(舍弃公式,原理上真正理解PID控制) PID控制应该应用了非常广泛的控制算法。 越控制一个元件的温度越小,越控制无人机的飞行姿态和飞行速度越大,可以使用PID控制。 这里从原理上理解PID控制。
比例积分差异(PID )实际上是比例、积分和微分控制。 先把图像和公式排列起来,看不懂也没关系。 (一开始看这个算法,公式能看懂,具体怎么用怎么写代码也知道,但是就是不知道原理,不知道为什么要用比例,微分,积分这3个项才能实现最好的控制,用其中两个为什么不行,用了3个项能好在哪里,每一个项各有什么作用)
总的来说,得到系统的输出后,将输出经过比例、积分、微分三种运算方式,叠加在输入上,控制系统的动作。 用简单的实例说明。
比例控制算法先说PID中最简单的比例控制,而忽略其他两个。 还是用经典的例子吧。 如果我有水槽,最终的控制目的是确保水槽中的水位永远维持在一米高。 一次试验时刻,假设水壶中水位为0.2米,则当前水位与目标水位之间存在误差的error,且error为0.8。 此时,假设旁边站着一个人,该人通过向筒中加水来控制水位。 如果单纯使用比例控制算法,则输入的水量u和误差error成正比。 也就是说
u=kp*error
如果kp为0.5,
那么,如果t=1(第一次加水,也就是说第一次对系统施加控制),则u=0.5*0.8=0.4,因此这次加水量使水位在0.2的基础上上升0.4,达到0.6。
接着,在时刻t=2(2(第二次施加控制),当前水位为0.6,因此error为0.4。 u=0.5*0.4=0.2,水位再次上升0.2,达到0.8。
这样循环下去就是比例控制算法的执行方法。
可以看出最终水位将达到我们需要的1米。
但是,单纯的比例控制存在一些不足,其中之一就是稳态误差! (我也看了很多,久违地思考了什么是稳态误差,以及为什么会有稳态误差。
如上例所示,根据kp的取法,系统最终达到1米,没有稳态误差。 但是,让我们考虑另一种情况。 假设这个水箱在装水的过程中可能会漏水。 假设每次加水都会排出0.1米高的水。 即使如此,如果kp为0.5,也会有某些情况。 加了几次水,当水箱里的水位达到0.8时,水位不会再变了。 因为,水位为0.8时,误差error=0.2。 因此,水箱中水的加入量为u=0.5*0.2=0.1。 同时,每次往水箱里加水,就会流出0.1米的水! 进入的水和流出的水相互抵消,水位不再变化!
也就是说,我的目标是1米,但最后系统达到0.8米时水位没有变化,系统稳定。 由此产生的误差就是稳态误差。
(实际上,这种类似水箱漏水的情况更常见。 例如,控制汽车运动时,摩擦阻力相当于“漏水”;控制机械臂、无人机飞行时,各种阻力和消耗可以理解为本例的“漏水”。 )
因此,单独的比例控制往往不能满足要求。
积分控制算法使用了上例,但仅从比率上可以看出存在过渡误差,最后的水位会卡在0.8上。 因此,在控制中引入另一个分量。 这个分量与误差的积分成比例关系。 因此,比例积分控制算法如下。
u=kp*error ki error
还是用上面的例子说明,第一次的误差error是0.8,第二次的误差是0.4。 至此,误差的积分(离散时,积分实际相加((error=0.8 ) 0.4=1.2 )。 此时的控制量除了比例部分以外,还有系数ki乘以该积分项的部分。 因为这个积分项累计了前面的几次误差,所以可以很好地消除稳态误差。 (只有比例项时,假设系统中了稳态误差。 上例0.8,由于积分项的存在,输入增大,水槽水位大于0.8,可以逐渐达到目标1.0 . ) )这就是积分项的作用。
微分控制算法是另一个例子,考虑制动情况。 顺畅的驾驶车辆在发现前面有红灯时,为了使行驶顺畅,基本上提前几十米放松油门踩刹车。 车辆非常接近停车线时,用力踩刹车,使车辆停止。 整个过程可以看作是加微分的控制策略。
所谓微分,明确地说是离散的情况下,是error的差分,是t时刻和t-1时刻的error的差分。 即,u=kd*(error(t )-error (t-1 ) ) ),其中KD是系数项。 可以看到,在制动期间,error越来越小,因此微分控制项必须是负数,在控制中加入了负数项。 他的作用是防止汽车因刹车来不及而突破线。 常识上,越接近停车线,越应该注意踩刹车,车不能越过线,所以这个微分项的作用可以理解为刹车。 在车辆接近停车线且车速较快的情况下,该微分项的绝对值(实际上是负数)增大,表明应该用力踩刹车使车辆停下来。
切换为向上面的供水箱加水的例子,可以通过在箱内的水快要接近1时加入微分项来防止
给水缸里的水加到超过1米的高度,说白了就是减少控制过程中的震荡。
现在在回头看这个公式,就很清楚了
括号内第一项是比例项,第二项是积分项,第三项是微分项,前面仅仅是一个系数。很多情况下,仅仅需要在离散的时候使用,则控制可以化为
每一项前面都有系数,这些系数都是需要实验中去尝试然后确定的,为了方便起见,将这些系数进行统一一下:
这样看就清晰很多了,且比例,微分,积分每个项前面都有一个系数,且离散化的公式,很适合编程实现。
讲到这里,PID的原理和方法就说完了,剩下的就是实践了。在真正的工程实践中,最难的是如果确定三个项的系数,这就需要大量的实验以及经验来决定了。通过不断的尝试和正确的思考,就能选取合适的系数,实现优良的控制器。