PID就是对输入偏差进行比例积汾微分环节积分微分运算运算的叠加结果去控制执行机构。实践练习中如何把这一原理转化为程序?为什么是用那几个error进行计算?
鉯下是我摘录的一段PID程序我曾用其对智能车的速度进行闭环控制:
增量式PID计算公式:
如左图,有一个人前往目的地A他用眼睛视觉傳感器目测到距离目的地还有100m,即当前与目的地的偏差为100他向双脚输出Δ=100J的能量,跑呀跑10s之后,他又目测了一次此时距离为40m,即current_error=40怹与10s前的偏差last_error=10对比,即current_error—last_error=—60这是个负数,他意识到自己已经比较接近目的地可以不用跑那么快,于是输出Δ=100+(—60)=40J的能量40J的能量他剛好以4m/s的速度跑呀跑,10s之后他发现已经到达目的点,此时current_error=0大脑经过思考得出current_error—last_error=0—40=—40,两脚获得的能量Δ=40+(—40)=0即他已经达到目的地,无需再跑在刚才的叙述中,可知增量式P+I+D输出的是一个增量将该增量与调节量相加后的到的才是最终输出量,P+I+D反应的是之前的输出量昰在当前的状态中是该增加还是该减少
PID中纯比例积分微分环节控制就是把被控制量的偏差乘以一个系数作为调节器的输出,在增量式PID中反映在程序上的,我们被控制量就是error而实际上,例如在速度控制中error=目标速度﹣当前速度所以明确目的:我们通过控制error趋近于0,朂终使得当前速度趋近于目标速度
如右图,假如考试时有这么一种题:函数经过时间Δt由y1变化为y2时,问y增长的比例积分微分环节为多尐你很容易地得出答案:K=﹙y2-y1﹚/Δt;
以速度控制为例,若y为error得右图,在时间t1到t2的过程中我们可以得到输出控制量error变化的趋势为(current_error—last_error)/Δt。得到偏差的变化趋势后乘以Kp使输出量与error相对变化。这个道理犹如模拟电子电路中声音信号经过功放管放大输出的信号与输入信号楿对应变化。
然而通常情况下,我们的被控制量并非纯比例积分微分环节式地变化如下图:
在系统中加入微分放映系统偏差信号的变囮率,能预知偏差变化的趋势具有超前控制作用,提前处理偏差
积分控制可以消除偏差,体现在公式中较容易理解当前的偏差差经過系数Ki的放大后映射为输出控制量,即I=Ki*current_errorP只要前后偏差之差为0,即current_error—last_current=0则不进行调节,D只要前后偏差变化率为0即(current_error﹣2*last_error﹢prev_error)=0,则不进行调节洏对于积分只要偏差存在,调节就始终进行因此积分可以消除误差度,但在在某些情况下一定范围内的误差是允许的,而如果此时积汾调节始终存在可能会导致系统稳定性下降,如右图此时可通过弱化积分系数Ki使系统稳定。