注册会员
- 积分
- 76
- 威望
- 50
- 贡献
- 8
- 兑换币
- 18
- 注册时间
- 2014-4-13
- 在线时间
- 9 小时
- 毕业学校
- 重科
|
附录B:基于起跑线识别算法的研究
摘要:按照本届智能车比赛的竞赛规则,比赛车辆在跑道上完成一圈比赛,以起始线 为计时点,跑完一圈之后,赛车需要在通过起始线后三米范围内自动停止。如果没有 停止在规定的范围内,比赛成绩时间增加 1 秒。在比赛中,一秒的时间对比赛成绩的 高低至关重要,所以一个准确的起跑线识别算法就显得必不可少。本文主要论述了三 种起跑线识别的思路,在实验比较的基础上,给出了一种起跑线识别的算法。实践证 明,该算法对起跑线的识别是行之有效的。
关键词:飞思卡尔智能车;起跑线;模式识别
Abstract: According to the rules for the 4th national contest of Smart car, starting from the black line, the smart car should stop within three meters automatically after one routines racing. If it fails, the racing marks have to add one second. During the contest, one second is of utmost importance for the final marks. Therefore, an accurate starting line identification algorism is necessary. Three starting line identification algorisms were discussed in this paper. Based on the experiments results, one optimal algorism was given, which has been proved with the racing for identifying the starting line.
1 概述
按照第四届全国大学生“飞思卡尔”智能车大赛比赛规则要求:每辆赛车在赛 道上跑一圈,以计时起始线为计时点,跑完一圈后赛车需要自动在起始线之后三米的 赛道内,如果没有停止在规定的范围内,比赛成绩时间增加 1 秒 。本文主要给出了 几种起跑线识别的算法,并且做了相应的对比。
2 起跑线特征的分析
要能够准确的识别起跑线那么我们首先要能够分析出是跑线的特征,并且抓住最 主要的特征,也就是他不同于赛道其它的地方。图1是标准的起
图 1 起跑线示意图 赛道有一个长为1米的出发区,如图1所示,计时起始点两边分别有一个长度10厘
米黑色计时起始线,赛车前端通过起始线作为比赛计时开始或者结束时刻。
由上可知,起跑线前后最少有1m 的直道,有两条10cm 的黑道,并且他与黑色引 导线的距离为4.5cm,最后是起跑线不会出现在窄道区域。
有了上面对起跑线的特征的分析我们就可以对起跑线进行识别。
由于今年的比赛新增了赛车必须在起始线后三米内停下的规则,这就要求赛车必 须具有稳定可靠提取起始线作为停车标志的功能。 提取起始线的难点在于高速冲过 起跑线的时候,起跑线的漏检问题;车没有正对起跑线时候,起跑线的无识别问题, 十字交叉的干扰问题,黑色三角区域的干扰问题,以及其他的一些不确定因素。
起跑线的识别第三届的参赛队伍提供了许多不同的方案,比如添加光电管识别起 跑线,数黑点法,三段黑线法,两段黑线加一段白线法等等。我们主要参考上届的方 案,并且对他们做了对比和综合,最终提出了自己的起跑线识别方法。
方案一:光电识别法
添加光电管识别起跑线,首先要依据起跑线的特征对光电管的布局做分析,我们 可以安装5个光电管,黑线中间一个,中间4.5cm 处各一个,长10cm 黑线处两边各一 个。然后就读取光电管的状态。首先我们考虑车直接正着冲过起跑线的时候,那么光 电管的状态为最两侧和中间为低电平,中间为高电平。这种情况相对而言较简单。当 车斜着通过起跑线的时候,按照上述思想就很难识别出起跑线。那么我们可以对判定 起跑线的条件相应的放宽一些,当车斜着通过起跑线的时候,光电管中只要有间隔的 两个为高电平,剩下的三个位低电平,这时候就判断是起跑线。因为当车通过十字交 叉的时候,不可能出现 低 高 低这样的状态。
方案总结:这种方法要求额外的增加光电管,这样就对整个电路的负担加重而且 识别难度较大,优点是算法较简单。
方案二:三段黑线 这种方法的主要思想是利用采集到数据提取跳变,因为起跑线从左到右有
白 黑 白 黑 白 黑 白 那么他相应的就有从左到右三段黑线,从右到左也为三 段黑线,只要检测到三次这样的跳变就判断他是起跑线。但是这只是最理想的情况下 的状态,当车在告诉运行的时候不可能这么完美的检测出这样的跳变次数,而且在光 线不好的时候十字交叉也容易出现这样的跳变。所以就要对这种理想的情况做一些改 变。首先考虑,车未能正对着起跑线的时候,那么他一行内就没有三次跳变,可能三 段黑线错行出现,或者少了一段黑线等等。其次考虑图像采集出现干扰的时候,比如 在十字交叉时出现三段黑线。
我们首先讨论第一个问题,车未能正对着起跑线的情况。当出现黑线错行的时候, 我们就判断他下一行是否上一行有未检测到的这段黑线,如果有就判断是起跑线,如 果没有就不是,这个问题相对而言容易解决。最主要的是车在运动的时候出现干扰十 字交叉时候也可能出现这样的情况,再十字交叉的时候我们可以考虑添加相对应的判 断条件,比如相应的黑点个数,在十字交叉的时候黑点一般都很大,接近于采集的列 数。
方案总结:这种方法相对于方案一来说容易实现些,而且识别正确率有了很大的
提高,但是对算法的要求高,无识别率中等。
方案三:特征提取法
前面的方案都没有最准确的体现出起跑线的最主要特征,起跑线区别于十字交叉 和别的干扰的最主要特征应该是由左侧段黑线到中间黑线的跳变,和中间黑线到右侧
黑线的跳变
应为在正常的情况下,黑线的跳变次数为左右各一次。那么我们就在检测到跳变 次数大于一的时候检测起跑线,而且在车出发5s 后在检测起跑线。
步骤如下:1 系统时间是否达到起跑线检测时间
2 检测是否为直道
3 判断跳变的次数是否达到检测要求
4 从中心向两侧确定中间那段白线
5 对白线的宽度做进一步的要求 具体如下:
因为前面已经说过起跑线的在直道上,弯道不可能出现起跑线,所以我们就检测 赛道是否为直道,在弯道上不检测。在车开始5s 内不可能出现起跑线,我们在5s 内 也不检测起跑线,然后当他的跳变次数超过1的时候,我们就从黑线的中心位置向两 侧搜索另外一条黑线,并且记录这两次搜索的距离,这个距离应该左右大致相等,并 且距离有个上限和下限。当达到这些条件的时候我们就认为他确定是起跑线。源代码 如下
/判断停车,
if(r==42) {//判断是否为直道
if(system_time>stop_time)//判断时间
{ if((start_flag1>=2)&&(start_flag2>=2))//首先判断跳变次数
{
for(ii=Line_Center[i-1];ii>0;ii--) //确定边缘
{if (uca_Buffer1[i][ii]-uca_Buffer1[i][ii-1]>0)
{l0=ii;break;}
}
for(ii=Line_Center[i-1];ii<85;ii++) /确定边缘
{if (uca_Buffer1[i][ii]-uca_Buffer1[i][ii-1]<0)
{l1=ii;break;}
}
for(ii=Line_Center[i-1];ii>0;ii--) /确定边缘
{if (uca_Buffer1[i][ii]-uca_Buffer1[i][ii-1]<0)
{l2=ii;break;}
}
for(ii=Line_Center[i-1];ii<85;ii++) /确定边缘
if (uca_Buffer1[i][ii]-uca_Buffer1[i][ii-1]>0)
{l3=ii;break;}
}
if((Line_Center[i-1]-l0<25)&&(l1-Line_Center[i-1]<25)&&(2*Line_Center[i-1]-l0-l1)<5) 对边缘宽度的限定//
{
if((Line_Center[i-1]-l0>5)&&(l1-Line_Center[i-1]>5))//&&(2*Line_Center[i-1]-l0-l1)>=
0)
{if((l3-l2>3)&&(l3-l2<12))
stop++;
}
if(stop>=1)
{delay(150)WMDTY2=OFFWMDTY3=OFF;STOPED=ON;}//条件满足停车
}
}
方案总结:本方案识别起跑线相对于前面两种来说,方案简单,特征明确,并且 准确率高。因此我们最终选择了这种方案。
4 总结
起跑线识别的准确性体现着这个系统的准确性和稳定性。因此起跑线的识别 要在整个系统都比较稳定的情况下识别。识别起跑线要在图像采集可靠的情况下进 行,并且考虑误识别和漏识别的问题。但是只要图像采集合理,算法准确一定能够实 现对起跑线的识别。 |
|