Pid的三种形式,直立环,速度环,转向环,这三种环代表了小车的三种不同动作,直立,转向,和运行速度,三种不同的构造,三种不同的控制函数,最终的思想都是通过pid算法来控制。

一.Pid算法简介,什么是pid

Pid总共有三个字符,分别是p,i,d,分别代表比例,积分,微分三种不同的计算方式,p可以更快的让控制的点到达所要到达值附近,而d可以快速的来让到达目标值附近的变量快速冷静下来,稳定在目标值附近,而i可以解决偏离目标值过远的情况的局部最优解情况。,至此pid算法也就是说要对于某一变量到达目标值所做的操作函数,也就是一种方法,它包含三个部分,多个函数。

二.平衡小车里面的pid

在平衡小车里面的pid取决于小车也就是该系统下面对于外界的加速度,和各种角度变化的探查能力,也就是在单片机系统中一边就是mpu6050/mpu6090,通过这个东西可以探查到外界的三给roll(角)的变化情况,和及加速度的变化情况以及。所以我们对于控制算法pid也只能用这几个东西来控制。

1.小车的直立环pid

在直立过程中平衡小车之所以叫做平衡小车,是因为小车一开始平衡不了,只有不断地控制小车的轮子的转动才能让小车平衡,在这里引入负反馈可以让小车处于一个平衡状态。

树莓派平衡车 python 平衡车pid算法_全局变量

 所以这个函数就是这个样子,通过小车的角度差和相乘,以及角速度和延迟相乘,最后来控制这个小车的pwm的变化过程,所以这个平衡状态可以说很好理解。

公式:【直立环】pwm=kp1*角度偏差+kd*角度微分

/****************************************************
输入参数:角度,平衡角度,角加速度
功能:直立环的控制函数
****************************************************/
int pwm_zhili(float angle,float balance,float Gyro)
{int pwm,Encode,Encode_last;
float kp,kd;//自己设计定义
Encode=angle-balance;
pwm=kp*Encode+kd*Gyro;
return pwm;
}

2.小车的速度环

何为速度环,比如小车他自己突然收到了要向前前进的指令,而一开始速度为0,要快速达到那个指定的速度的变换控制函数叫做速度环,要得到速度环必须要知道当前的速度为多少,这个才是速度环控制的关键,所以要选取那种编码器马达。在得到数据方面可以用一阶滤波公式

Y=a*x+(1-a)*Y_last

Y是本次输出,x是本次输入,Y_last是上一次输出

a是滤波系数,1-a越大,惯性(滞后)越大,说明本次的输出和上一次的输出关系越大

为什么要滤波是因为数据中存在噪音,所以我们滤波可以很高效的得到准确值。

在速度换里面还是用速度*Kp+速度变化*kd,从而来快速到达结果

公式【速度环】 pwm=kp2*速度偏差+kd*速度微分

/****************************************************
输入参数:目标速度,左轮速度,右轮速度
功能:速度环控制函数
****************************************************/
int speed_last=0,speed=0;
int pwm_speed(int speed,int now_left,int now_right)
{
int Encode_speed=(now_left+now_right)/2-speed;///速度偏差
int a=0.2;//(低通滤波)
int kp,kd;
speed=(now_left+now_right)/2;
pwm=kp*Encode_speed+kd*(speed-speed_last);
speed_last=speed;
return pwm;
}

其中speed和speed_last是全局变量可以得到前后的差。

3.小车的转向环

转向环故名思意,是控制转向活动的环所以我们照样沿用上述思路,使用PD算法,

【转向环】公式:pwm=kp*左右速度差和预订速度差的差+kd*转向角速度微分

左右速度差可以使用编码转向器来得到左右速度从而得到转向速度差

转向角速度微分可以参考z轴角加速度,这样子就可以很轻松的解决转向环问题

/****************************************************
输入参数:左轮速度,右轮速度,偏转速度差(预定值),z轴角加速度
功能:转向环控制函数
****************************************************/
int pwm_zhuanxiang(int left,int right,int turn,int z_groy)
{int turn_now=left-right;//这里姑且算作这样
int Encode=turn_last-turn;
int kp,kd;
pwm=kp*Encode+kd*z_groy;
return pwm;
}

4.最终的组合串行pid

在之前的pid算法中会出现一个问题,就是小车前进或者转向的时候小车不包吃平衡,所以有必要把小车的直立环,速度环,转向环综合起来形成串行pid。

【串行pid】公式:pwm=a*直立环值+b*速度环值+(1-a-b)*转向环

其中a,b都是参数,这样子虽然有点简单粗暴,但是可以实现。