PID算法 是控制算法中的经典算法,特别是在一个闭环控制系统中更为常用。在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景有重要应用。PID,全称为比例-积分-微分控制器(Proportional-Integral-Derivative Controller),是一种广泛应用在控制系统中的经典算法。它的主要功能是根据系统的实际输出与期望值之间的偏差,通过比例、积分、微分三种运算,实时调整控制量,以实现对系统状态的精确控制。
1. 比例环节(P):比例环节直接作用于当前的误差信号,误差越大,控制器输出的纠正动作也越大,体现了一种即时响应的能力。
2. 积分环节(I):如果仅有比例环节,可能会导致系统无法消除静态误差,即当系统达到稳态时仍存在偏差。积分环节则可以累积过去的误差,并逐渐修正,使得系统最终能消除稳态误差。
3. 微分环节(D):微分环节则是预测未来的趋势,根据误差变化率进行提前调节,有助于改善系统的动态性能,提高系统的响应速度和稳定性。
PID算法中一共有三个参数kp、ki、kd
首先先说三个参数都是什么意思
kp:直接作用于当前的误差信号,误差越大,控制器输出的纠正动作也越大,体现了一种即时响应的能力。
ki:如果仅有比例环节,可能会导致系统无法消除静态误差,即当系统达到稳态时仍存在偏差。积分环节则可以累积过去的误差,并逐渐修正,使得系统最终能消除稳态误差。
通俗的说,只有kp,error值将永远存在,ki(积分),可以不断累积误差值,累计得越大调整力度越大。
kd:微分环节则是预测未来的趋势,根据误差变化率进行提前调节,有助于改善系统的动态性能,提高系统的响应速度和稳定性。
通俗的说,微分即求导,求导即斜率,斜率即物体的速度,kd可以控制物体运动的速度,不会导致越过标准线时速度过大。
下面我将通过动图一一展示三个参数的意义。
由上图可见,kp的值越大,无人机对误差的相应速度越大,以实际情况中的巡线小车为例,当小车偏离预设线后无法迅速调回正确方向时,需要调大kp的值。直到kp增大到小车会过调迅速转向线的相反方向时,找一个合适的数值停止。
第二个调整的是kd的值
还是kp=0.5的情况,我们可以明显发现无人机在接近标准值的时候有强烈的震荡,甚至会出现超过标准值再返回的现象。
这次增加kd,上面说过kd是控制无人机的速度,将ki设置为0.04,可以发现,无人机可以很容易的定住,而不会在标准线附近来回晃荡。
还是以巡线小车举例,如果发现小车可以回到线上,但是返回速度过快,导致小车在标准线左右来回摇摆,可以加大kd的值,直到小车的摇摆幅度开始缩小,继续增大kd,小车会过冲的反效果,同样找到一个适合的数值停止。
第三个要调整的是ki(积分)的值,咱们发现无论如何无人机始终和标准线存在差距(error),不能刚好吻合。积分就是将每一时刻的error的值累加起来,开始调整无人机的误差。
可以发现,无人机在稳定了位置之后,在一点点向标准位置偏移。在巡线小车中,如果始终和标准线有一定距离不能完全吻合,可以加上ki的值。
最后附上一段C语言的PID算法
float PID_realize(float pos){
pid.Setpos=pos;
err=pid.Setpos-pid.Actualpos;
float incrementpos=pid.Kp*(err-err_next)+pid.Ki*err+pid.Kd*(err-2*err_next+err_last);
pid.Actualpos+=incrementpos;
err_last=err_next;
err_next=err;
return pid.Actualpos;
}
Setpos对应上图中无人机的预设位置
Actualpos 代表无人机的当前位置
两者相减得到其err值
将比例 积分 微分相加得到incrementpos
err_last err_next 用于保存上一时刻的err值