本文会简单的介绍一些车模控制的方法。前文也说到过,因为我是写摄像头部分的,所以车模的控制部分我只能给大家简单的介绍下。
大家可能有所听说,智能车竞赛又被称为调参竞赛。显然好的参数决定了小车车速的上限。
调参调的是哪呢?大家肯定会听说过PID,镜头组还有一个是权重。
PID
有关pid的教程,csdn上有很多,大家可以去参考下他们的文章。但是pid为什么会用在智能车上呢?
每一个电机的机械参数都是不同的,有可能有一个电机给定7v的时候是10000转,其他相同型号相同流水线下来的电机给定7v的时候是12000转,转速的不同会引起小车左右两边的动力不平衡,会损伤电机,所以需要pid这个控制算法来控制左右舵机的电压。
有关pid的教程,大家可以去找其他大佬写的文章。很重要的一点是,电机带轮空转和轮放在地上跑的pid是不同的,空转的p会比在地上跑的p小很多。我们的车有一个特点是,小车在地上跑的pid,如果把车的后轮悬空,那么后轮会来回震荡(反复正反转)。
pid的输入有两个,一个是期望速度,一个是实际速度。
float PID_PWM_R(float Target,float Measur)
{
float err,P_out,I_out,D_out;
static float err_last_1,err_last_2,PID_output;
err = Target - Measur;
P_out = R_Kp * (err - err_last_1);
I_out = R_Ki * err;
D_out = R_Kd * (err - 2.0f*err_last_1 + err_last_2);
PID_output += P_out + I_out + D_out;
if(PID_output>6000)PID_output = 6000;
if(PID_output<-6000)PID_output = -6000;
err_last_2 = err_last_1;
err_last_1 = err;
return PID_output;
}
每个电机的pid都是不一样的,更换新的电机需要新的pid。
小车的实际速度是由编码器测出的,某飞的编码器是1024线的,意味着编码器转一圈会输出1024个脉冲。
权重
好的权重决定了小车的上限。其实权重的原理就是:权重 =累计的,每一行赛道中线离画面中线的距离。近端的权重决定了舵机的打角。
我们采用的是逐飞给的m4610d舵机,这个舵机的驱动方式和其他舵机不一样,是靠pwm的占空比来决定角度的,使用之前需要给舵机的打角做限制,比如10000的重装值, 5000是中点,4300是机械结构(转向拉杆)允许的机械最大角,那么就要把写到最后的输出限定里,不然容易损伤机械结构。
如何确定这个5000的中点值呢?就是在5000的情况下 推着小车走,如果走了一定距离能走直线,说明这个中点值是对的。
速度决策和前瞻
我们的速度决策是跟舵机的打角值和最长上升白列的长度有关的。同一个舵机的打角值,速度不同,转弯半径也不同。
别的文章可能提到过动态前瞻,这个算法比较高级,根据速度去计算前瞻的角度。这个算法比较高级,我们用过这个。大家可以自行尝试。
后轮差速
我只给出了我们计算后轮差速的方式,不知道是否正确,供大家参考
我们先来计算编码器的值和实际距离的转换
编码器的齿轮是30齿,电机从动轮是50齿,编码器是1024线的
那么他们的角速度比是5:3
那么轮胎转过一圈,编码器就转过5/3圈,产生1024*5/3个脉冲,轮胎走过5πcm
那么编码器有一个脉冲,实际距离是 (5π)/(1024*5/3)。
好,有了这个数据,就可以分析转弯的轮速差了