PID算法:小车上给不出的痛

’ 众所周知,PID算法是一种非常方便于变量控制的一个算法,目前我们也在进行校内赛,正好我也做了一辆两轮平衡小车,目前陀螺仪还在发货,小车上对PID也有需要。所以我就对于目前我知道的PID算法给大家进行解释,同时各位校内赛的同学也可以借鉴一下,如果有任何错误的地方,请大家积极指正;
首先,大家必须对PID有个系统的认识,我们为什么要用到它呢?主要是因为速度不稳定,小车在赛道行驶的过程中,会遇到很多的干扰因素,同时,传感器返回的输入信号需要对小车的速度或是偏转的舵机产生影响。用PID算法对其进行控制就是一种很好的方式;
要注意的是,PID算法的使用并不在于代码的难度,而是在于你对其中各个参数的物理意义的理解,并加以运用,从而对其中的值进行判断。此时,最最重要的问题便是PID的参数设定!
下面我用一个例子来说明一下PID的实现:
首先是参数的定义:
float Kp = 10, Ki = 0.02, Kd = 20;//弄清楚物理意义,通过经验调试
例如:现在我们要对速度进行控制,要求以2m/s的速度,对应的PID物理量即是:
P—>比例:对速度的比例控制;
TI—>积分时间:积分对应的时间,即积分的一小段运动的时间;(积分环节主要用于消除静差,提高系统的无差度,积分作用的强弱取决于积分时间常数Ti,Ti越大,积分作用越弱,反之则越强)
I–>积分;相当于该一小段时间内的积分(路程);
Td–>微分时间:微分对应的时间,即对其进行微分的一小段时间;(反映偏差信号的变化趋势(变化速率),并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间;
D–>微分:相当于该一小段时间内的积分(加速度);
Kp–>:比例系数(成比例的控制系统的偏差信号error(t),偏差一旦产生,控制器立即产生控制作用,以减少偏差;
float PID_realize(*float speed)//实现函数,要求输入速度值speed
{
float ChangeSpeed;
SetSpeed = speed;
err =SetSpeed - ActualSpeed; // 同时误差=目标值(需要的值:如速度)-反馈值(实际得到的值);
ChangeSpeed = Kp * (err -err_last ) + Ki*err + Kd*(err -2* err_last + err_last_next);
pid. ActualSpeed += ChangeSpeed;
err_last = err; //err_last,err_last_next 值的来源;
err_last_next =err_last;
return pid.Actualspeed //经过pid调节后的速度值;
}’
而对于小车的控制就通过这个pid处理后的速度值来实现的。
而这张图片也说明了对其的控制原理:
这里写图片描述
网络上对于PID中的参数测定的方法是这样的:
1.确定比例增益P
确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
2.确定积分时间常数Ti
比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
3.确定积分时间常数Td
积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P空对方PI,取不振荡时的30%;
4.对PID参数进行微调,直至满足要求 。

总结一下大概是:先调节到一个稳定的值:先大致判读PID的值(输入一个较大的值),调整参数使系统的需要调整的量(速度)和输出值刚好都达到稳态,并且需要调整的量近似达到设定值。然后,这些值会返回并对车的速度进行调节。

PID的数值得到需要经过调节和缜密分析,判断出值才能更好地对小车进行控制;
由于陀螺仪暂时未到,也未对车进行过pid的调试,所有东西也是为了我的二轮直立平衡车准备,有所不周便后 续继续改正学习。
如此便是我目前对其控制原理的全部了解,愿大家多多指教。

猜你喜欢

转载自blog.csdn.net/Acer9520/article/details/81352072