由比赛规则可知,赛道表面为白色,中心有连续黑线作为引导线,黑线宽25mm,赛道的基本形状包括直道、90º及90º以上的转弯赛道和连续弯道(S弯道)。控制赛车的目的,我们是为了使赛车在跑道上行驶时既快又稳,因此在控制策略上需要考虑两个方面:舵机转向的控制和赛车的速度控制。
4.1 舵机转向控制
为了使赛车在弯道上能够平稳地拐弯,沿赛道继续正常地行驶,需要控制赛车在进入弯道时提前减速转向平滑过弯,出弯时提前加速高速出弯,这里采用到的是迟滞算法的思想。由于我们的赛车采用的是摄像头采样方案,其优势就是探测距离远,可以提前知道路况,同时因为舵机转向具有延迟存在,所以我们采用PD控制:OUT=Kp*e1+Kd*(e1-e2),其中,OUT为舵机输出量,Kp为比例系数,Kd为微分系数,e1为本次的偏差,e2为上次的偏差,这样我们需要控制Kp、Kd两个参数。
我们对转向的控制是通过有黑线的第一行(或前几行的平均值)和最后一行(或最后几行的平均值)两点连线的斜率来判断。可以知道摄像头的横向和纵向的物像比例。
设摄像头的横向比例系数分别为:Kla,其中分为三个档次。前三分之一为Khead,中间三分之一为Kmid,后三分之一位Ktail。其中Khead 和Kmid都是Ktail的倍数,设倍数分别为Khead_Ktail,Kmid_Ktail。Kla_Ktail代表上述两个倍数的积,代表纵向比例系数为纵向物象缩小比例Klo。由试验可以确定。
则偏差角度为:

所以需要知道Kla_Ktail的值,其余的可作为参数一起调整。其中通过调整Kla_Ktail的大小也可以缩放角度的大小。但是Kla_Ktail通过实验测量得到真实值直接用就可以了,不要在调整。
假设在舵机转角范围之内,角度和其正切值是成比例的

图4.1 舵机角度和正切值曲线
也就是可以得到舵机的转角:

舵机输出角度为0时对应的脉冲宽度为1520us,相当于PWMDTY01=1520/0.25=6080。输出角度为-60度时对应的脉冲宽度为920us,相当于PWMDTY01=920/0.25=3680。输出角度为+60度时,相当于PWMDTY01=2120/0.25=8480。即脉冲宽度可调范围为:3680---6080---8480,根据舵机转角对应的PWM脉宽可以得到:theta应为正负60之间。

其中,deviation是theta为0时,让小车自主沿直线行走时angle_out-6080的值。如上只要调整Kr就可以控制舵机了。我们可以首先通过计算给出Kr的一个参考值。假设theta在正负60度之间,则有Kla_Ktail=1.2,又-16<error<+16,16*1.2=19.2(假设在前三分之一行)。则有(Kla_Ktail*error[i]-error[j])最大为24,又(j-i)最小为20,即黑线正好在中间拐出去。此时设为60度,则可求出(K_head/Klo)约为1.8。综上可得Kr=1.8*40*45=3248
则最终控制方案为为:

4.2 速度控制
我们通过实验发现,赛车驱动电机负载运行时,响应速度较慢,而控制周期相对于电机的响应特性较短,因此我们采用Bang-Bang控制方法[7]来实现赛车速度的闭环控制。
在这里我们已知赛车的最低理论速度为转过最小弯时(曲率半径为50mm) 所需要的最大速度。这个速度可以通过在真实赛道上测试得到。赛车的最高速度为在直道上时电机所能达到的最大转速,即PWM调速波的占空比为100%时的速度。在不同弯道上可根据曲率半径来设置当前的速度。
当我们知道了赛车转弯时的极限速度后,可以直接设置好转弯时的速度,到时候只需调整舵机的控制参数(两个参数Kp和Kd0。这时如果对电机采用Bang-Bang控制的话,则整个车模仅需整定舵机的两个参数。
当赛车在直道上高速运行时要确保进入弯道时把速度减下来使其速度恰好能过弯,如果不能的话可能要引入电机反向制动刹车。
我们可以根据舵机的输出转角来控制速度。转角越大速度应该越小,转角越小速度应该越大。设最小速度为:min_speed,为通过最小曲率半径时的速度;最大速度为:max_speed,为直道上时电机所能提供的最大速度。则
speed_out=(max_speed-min_speed)/(angle_rang)*angle_out+min_speed
经过分析,我们把赛道大致分为三种情况,如表4-1所示:



