做了智能车写这个做个记录,各位大佬勿喷。
PID控制器
PID 控制器(比例-积分-微分控制器)是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法。通俗的说,它可以给出使执行器(电机)快速准确到达目标的“指导方案”。
反馈
反馈是指将系统输出量通过恰当的检测装置,返回到输入端,与输入量进行比较,并以某种方式改变输入,进而影响系统功能的过程。
开环与闭环
在智能车控制中开环意味着电机的PWM是我们自己随便给的一个固定值:而闭环系统的电机PWM是PID控制器的输出。
PID组成
PID 实际上是一个作用于闭环系统的控制算法,由三个部分组成,分别是 P 比例环节,I 积分环节,D 微分环节。
比例环节
PID 比例控制器实际上就是个放大倍数可调的放大器,即△P=Kp×e,式中Kp为比例增益,即Kp可大于1,也可小于1;e为控制器的输入,也就是测量值与给定值之差,又称为偏差。
PID 比例控制有个缺点,就是会产生余差,要克服余差就必须引入积分作用。
积分环节
控制器的积分作用就是为了消除自控系统的余差而设置的。所谓积分,就是随时间进行累积的意思,即当有偏差输入e存在时,积分控制器就要将偏差随时间不断累积起来,也就是积分累积的快慢与偏差e的大小和积分速度成正比。只要有偏差e存在,积分控制器的输出就要改变,也就是说积分总是起作用的,只有偏差不存在时,积分才会停止。
微分环节
微分项主要是用来加快系统反应的,但如果微分作用过强,则可能由于变化太快二引起自身震荡。
PID代码理解
{
本次误差 = 目标值-实际值
P输出 =Kp 本次误差
I输出 += Ki本次误差
D输出 =Kd *(本次误差-上次误差)
ID输出 = P输出+I输出+D输出
上次误差 = 本次误差
}
注意要进行 积分限幅,即将积分项做一个最大最小限制
位置式与增量式
上面的PID理解也就是位置式PID,下面是增量式PID的理解
{
本次误差 = 目标值-实际值
P输出 =Kp (本次误差-上次误差)
I输出 = Ki本次误差
D输出 =Kd (本次误差-2上次误差+上上次误差)
ID输出 += P输出+I输出+D输出
上上次误差=上次误差
上次误差 = 本次误差
}
即:
void Left_Speed_Control()
{
float Left_Speed_Erro = 0.0 ; //左电机误差
Left_Speed_Erro = Speed_Goal - Left_Encoder ; //Left_Encoder :编码器反馈值
Left_Speed_PID.OUT += (Left_Speed_PID.P * (Left_Speed_Erro - Left_Speed_Lasterro) +
Left_Speed_PID.I * Left_Speed_Erro +
Left_Speed_PID.D * (Left_Speed_Erro - 2 * Left_Speed_Lasterro + Left_Speed_Preverro));
Left_Speed_OUT = Range_protect((int)Left_Speed_PID.OUT,-9000,9000); //输出限幅
Left_Speed_Preverro = Left_Speed_Lasterro ;
Left_Speed_Lasterro = Left_Speed_Erro ;
}
增量式与位置式主要区别:
1、位置式PID的积分项是以前所有的误差和,容易产生大的累积误差,而增量式仅与最近几次有关,影响小
2、位置式PID需要进行积分限幅和输出限幅,而增量式PID只需要输出限幅。
速度环位置式与增量式调参
在调位置式速度环时我们先加大Kp值,同时令Ki、Kd为0,查看编码器值和目标值的差值,当反馈回来的编码器值在目标值上下震荡时加入Ki值即可。
通过上面的代码理解我们可以知道增量式的I就是位置式的P,因此对于增量式我们先加I,再加P,实际现象中当我们的i给很小时电机都能达到目标值。
我们通过调参要达到的效果是:可以明显看到波形趋于平滑且编码器上下震荡范围小,当我们突然改变目标速度时,编码器值能很快且平滑到达改变后的目标值。