飞思卡尔智能汽车设计技术报告 下载本文

25

图 4.8 OLED 屏显示效果

图 4.9 按键及拨码原理图

26

第五章 程序设计

5.1 阈值计算

我们采用的方法是对像素电压处理,创建灰度值数组。灰度值最大的为白 不稳定,往往波形会出现很多的毛刺,如果不对这些数据进行处理,小车会受

本届光电组采用线性 CCD 作为检测跑道传感器,其内部的 128 个光电二

枀管采的象素电压经 AD 转换后存储在一维数组里,赛道的黑线部分 AD 电压值

较低,赛道的白色部分 AD 电压值较高。在小车实际跑动过程中,由于光线的

到较大的干扰,甚至完全算出错误的偏差。

色,灰度值最小的为黑色。每次比较连续的三个灰度值的像素点,仍灰度值最

处开始,找到像素点最多的灰度值,为黑色灰度值,记录下来。白色灰度与黑 大处开始,找到像素点最多的灰度值,为白色灰度,记录下来;仍灰度值最小

色灰度的平均值即为黑白阈值。这种动态阈值算法不仅能算出阈值,并且能够

随环境的变化自适应的改变分割值,弥补静态阈值法的不足。 灰度值数组的处理

for (i=8;i<120;i++)

{ line_latch[pic[i]/10]++; int

mid=(pic[i+1]+pic[i])/2; line_latch[mid/10]++;

line_latch[(pic[i]+mid)/20]++;

??line_latch[(pic[i+1]+mid)/20]++;//插值法四倍超分辨率

}

寻找白色灰度

for(i=LATCH_LINE-1;i>1;i--) //找连续三组和最大的地方 {if(line_latch[i]+line_latch[i-1]+line_latch[i-2]>=total||total<15)

{total=total+line_latch[i-2]-line_latch[i+1];}//向暗处 移动,找白

色的最大分布点

else{ccd_white_latch=i;break;}//此处为白线灰度 }

27

得到一条较为完整的道路。

扫描赛道边线:

int8 findroad(u16 *ccd,u16 latch,u8 x)//找路

{ int i,j,find=0; i=j=0;

while(j<127)

{

for(i=j;i<127;i++) {if(ccd[i]>=latch)break;} for(j=i;j<127;j++) {if(ccd[j]x)

{ road[0][find]=j-i; road[1][find]=j+i; rule_L[find]=i; rule_R[find]=j; find++;}

}

return find; }

同理可以寻找黑色灰度。 有了阈值,小车就能看清前方道路,控制器再对道路信息进行处理,就能

5.2 赛道判别 人字弯

虽然 CCD 在人字弯的调头区域看不到赛道信息,但能判别方向,在调头区 域,舵机强制打到一定角度,使小车通过调头区域,但是需要确定是否已经退 出调头区域。我们用陀螺仪在调头区域的水平方向角速度的积分值来判别,如 果积分差值大于设定值,即认为已经转过。

Direction+=0.500*(double)gyz[gypoint]/32768;

坡道

CCD 在入坡道时,由于仰视,CCD 看不到坡道信息,且 CCD 检测不出是否 处于坡道。我们利用陀螺仪在垂直水平面的方向上的角速度积分来判别,当积 分值大于设定值,即认为,处于上坡阶段。同样也能判别下坡。