0%

PID算法及其N种改进方式

PID基础

所谓PID是指比例(Proportion)、积分(Integral)、微分(Differential)三者组合的控制算法,他以预期控制达到的目标值与当前系统反馈值作为误差执行以上操作,即

或者写成离散形式,其中Ki与Kd 省略了积分和微分的周期T

其控制的大致过程可以按照如下方式理解:首先比例项能够使误差趋近于0,因为大于或小于目标值都会使得比例项给出一个输出调节系统。

参数意义

但是当控制系统达到目标值的时候需要输出不为0时(例如电机上总是有一个阻力需要输出抵消),只用比例项显然不能让误差等于0,此时需要加入积分项使累加的误差成为输出,当误差不为零时使输出向稳定的方向改变。

另外一个问题是,即使系统达到了给定的目标值时由于系统惯性可能会越过目标值(例如控制电机高速旋转是一定要考虑其惯性),而在上面两项的作用下控制值将会在目标值上下来回震荡。这时就需要增加微分项对控制值变化速率进行反馈,例如在控制电机加速时,微分项的存在会使转速加速度受到抑制,即电机加速得越快,微分项反向作用的程度就越大。

直观上来说,PID里面的比例项是其主要组成部分。积分项用于消除静态误差并且提高响应速度,但是由于它是对“过去”的反馈值进行处理,因此总体作用效果会使反馈滞后。而微分项用于抑制震荡以及减弱超调,是对系统“未来”的反馈值的预测,相当于令反馈超前,其作用恰好与积分项相反,会使响应速度变慢。

三项的作用与三个K值参数调节直接相关,一般调节PID参数先从比例P入手,调节至出现一定震荡后,再增加微分D抑制震荡,最后加入I消除静态误差。

PID算法改进

PID的变种实在太多以至于其他某个人控制用的PID和你用的PID可以是完全不同的两样东西,这里简单列举几种。

增量式/位置式

如果仅仅从上面的离散公式出发,编写PID算法,那么实际上这个就是位置式PID。但是下一个PID的输出值也可以由上一个PID的值计算得到,如果我们把两次输出值展开并相减可以得到




可以看到两次的差值可以写为误差三阶的线性叠加,即下一次的输出可以由上一次的输出再加上上面这三项得到(所以PID的本质是一个IIR滤波器)。用这种方式实现的算法就被称为增量式PID。

积分限幅/输出限幅

这个两个简单但非常常用,因为实际上输出并不能无穷大或者无穷小,因此输出必定是要经过限幅。而积分限幅则是为了避免积分时间过长(例如人为故意堵住电机使其输出力矩越来越大)导致积分饱和而长时间偏离控制值的情况。针对离散值的限幅控制一般都会确定一个合理的上下限,大于这个限度则保持输出不增加。

死区

有些时候会碰到一个很小的输出给系统但是并不会影响反馈值的情况,此时在积分项和比例项的作用下系统可能会出现微小震荡,这个时候需要设定一个死区(Deadband),在一个极小的误差值范围内不输出。当然按照理论上在死区内也不能让积分项有输出,因此需要清除积分项,但是如果在死区内需要保持输出的话就需要在进入死区时清除一次,而后续的积分操作仍然保持。

积分变速

这个有点像是Ki 参数自适应调节,实际上是让在不同误差值下积分累加求和的大小有所变化,使得积分项的值更加合理,但是这个变速函数的设定是自定义的,因此只能具体算法具体分析。

微分先行

以往PID针对误差值进行微分,将目标值的变化和反馈值的变化都算入微分项内,而微分先行则是将设定的目标值变化部分去除,仅保留对反馈值变化的微分。比较少用。

串级PID

如果一个PID不能解决问题,那就用两个。串级PID是将一个PID的输出作为下一个PID的输入,即与另一个反馈值作差得到误差再输入。通常多用于有多个反馈值的系统控制,并且实际效果优于单环的PID,并且在两个反馈量带宽不一致的情况下也能平衡系统的性能