5.1 控制策略
根据上面的论述,比较输出的二值化信号经过一系列整形滤波之后是反映小车相对于路面黑线的位置信息。利用单片机的输入捕捉功能,就能把该信息转换成单片机能直接处理的数据,并且硬件和软件开销都比较小。为了充分利用摄像头前瞻远的优势,取视场前几行的位置信息进行误差量求平均以减少干扰,同时考虑到图像的畸变和视场的盲区,有取了视场的后几行位置信息,以防止小车冲出跑道。
软件整体设计流程图如图附1所示。
![]() ![]() |
|
小车程序整体框图 |

5.2非线性P算法说明
在信号采集系统所采集的信号稳定准确的前提下,本队采用最简单,但时效性和速度都满足要求的非线性P算法位置闭环控制。经实际测试,在参数合适的情况下,小车在高速走直道是不会出现振荡,弯道舵机灵敏。因此引入非线性设计后,使之对小偏差不敏感而对大偏差敏感,实现了直道平稳同时弯道灵敏的目的。
图5.2为二值化后的标准信号示意图。通过单片机的输入捕捉功能记录4个上升沿,通过简单的相减可得含有路径信息的四个量:data[0]、data[1]、data[2]、 data[3]。其中左、右视场的误差量data[0]、data[3]是控制舵机的偏差值。为了消除偶然误差的影响,取八行数据求平均。在图像信号正常的情况下data[2]是准确的等于0x67的,考虑到测量误差在0x66< data[2]<0x70都是正确的,在这个范围之外则是坏点。同理,在没有看到图像时, 0x007c<data[1]<0x0084, 0x0064<data[0]<0x0069,此外,黑线是2.5厘米宽,data[2]也大于一个值。因此,通过这些值可以剔除一些明显的坏点,达到不错的滤波效果,使小车的抗干扰性增强。
由于按照大赛要求,小车无需严格沿着黑线走,所以去掉容易产生积分饱和的积分环节,同时摄像头有足够的前瞻,也去掉微分环节。
该部分软件实现如下:
Duo[i]=data[0]-data[3]; //计算左右的偏差量
Ctl=center+duo*p; //计算舵机的pwm值
Duo[i+1]=duo[i]; //保存上次的值
其中,p是比例系数,duo是视场的偏差量,ctl是舵机的调节量,center是舵机在正中位置时的值。
为了使小车的整个过程中跑得比较流畅,就要求在小偏差时缓慢调节,甚至不调节;在遇到弯道产生大偏差时,舵机能够迅速动作。这就要求p是一个变量,即一个非线性的过程。
具体软件实现为:
if((duo[10]>-6)&&(duo[10]<6))
p=0;
else {
if(((duo[10]<-6)&&(duo[10]>-25))||((duo[10]>6)&&(duo[10]<25)))
p=5;
else if(((duo[10]<-25)&&(duo[10]>-55))||((duo[10]>25)&&(duo[10]<55)))
p=7;
else p=30 ;
对速度的控制和上述过程类似。在误差量较小时,认为小车行驶在直道上,此时加速标志位增加zdf++,速度过大时限速。误差量较大时,认为小车行驶在弯道上,此时减速,如果速度速度sd很高并且偏差量ctl很大时则刹车。
具体软件实现为:
if((ctl<3100)&&(ctl>2900)) zdf++; //直道加速
speed=min+100*zdf;
if(speed>max) speed=max; //限速
if((sd<0x5500&&sd>0x2000&&(ctl<2700))||
(sd<0x5500&&sd>0x2000&&(ctl>3250)))
PORTA_BIT5=1; //刹车




