在去年的Freescale全国大学生智能车大赛中,赛道信息方案总体上有两大类:光电传感器方案和方案。前者电路设计简单、信息检测频率高,但检测范围、精度有限且能耗较大;后者获取的赛道信息丰富,但电路设计和软件处理较复杂,且信息更新速度较慢。在比较了两种方案的特点并实际测试后,我们选择了摄像头方案。本文将在获得摄像头采集数据的前提下,讨论如何对数据进行处理和控制策略的实现。
数据采集
我们选择了一款1/3 OmniVision CMOS摄像头,用LM1881进行信号分离,结合AD采样,实现了视频信号的采集。在总线周期为32M的情况下,每行最多能够采集80个点,其中前14个数据为行消影,第15到第80个点为有效数据点(见图1)。
图1 单行80点
摄像头每场信号有320行,其中第23到310行为视频信号。我们从中均匀采集了12行,最后得到一个12×80的二维数组。
原始数据包含了黑线的位置信息,为了稳定可靠地提取这一信息,我们采取了以下步骤:
二值化
由于白线对应的电平值较高,而黑线电平值较低,因此图中第43到48点间
的凹槽就是黑线所在位置。为了提取出黑线,直观的想法是检测电平值的跳变。但实际黑白线边沿的电平经常不是突然跳变的,而有一个过渡过程,为此我们先对原始数据进行了二值化处理。这不仅使得边沿更加明显,而且可以去除电平值的一些小波动。二值化的结果如图2所示。
图2 单行数据二值化结果
黑线位置提取
二值化后,视频信号就只有黑白二种电平了。从左到右扫描视频信号,通常先扫到的是白点;否则若是黑点(赛道外),则继续往下,直到第一个白点。然后,设置一个计数器记录第一个白点后面连续出现的黑点数目。计数器初值为0,若检测到一个黑点,则加1;否则计数器重新置0。计数器每次清零前,判断是否大于2小于10(这可以滤除一两个黑点产生的毛刺):如果是,则黑线中心位置为当前点的坐标减去计数器值的一半;否则,继续扫描直到整行结束。最后单行的黑线提取位置如图3所示。
图3 单行黑线位置提取效果
中值滤波
完成单行黑线提取后,可将12行位置连接起来,得到黑线的大致趋势。但即使前面已有一些滤除干扰的措施,仍能发现个别行的黑线位置偶尔会出现异常跳变。于是,这里采用了常用的中值滤波技术:对于中间第2到11行这10行黑线位置,用当前行和前后两行位置的中间值作为当前行滤波后的黑线位置。中值滤波可消除单行干扰,得到的10行有效黑线位置用数组black_line[10]表示。
控制策略
得到10行黑线位置后,就可以充分利用这一信息对赛道各种情况(如图4所示)进行判决,实现速度和转向的优化控制:如在直道保持高速、入弯减速出弯加速;直道和S道P参数小些、普通弯道P参数大些等。下面通过给出作用在black_line数组上的算子O,介绍赛道判决的方法。
图4 直道、普通弯和S弯的黑线位置提取结果(红色虚线表示视野中心)
算子O计算的是赛道黑线与视野中心线所围成的面积(图4中黄色区域)。其计算公式为:
其中mid为中心线的位置。一般来说,(1)式的结果在直道上很小,且随着赛车不断进入弯道内,数值将逐渐增大,出弯时则逐渐减小。这样,可以根据size的值进行分级,判断赛车前方的路况,决定赛车的速度级别。另外,速度也可采用以size为变量的P控制:
其中cur_speed为当前控制速度,min_speed和max_speed分别为控制范围内的最小、最大速度,min_size和max_size为size的最小、最大值。
舵机控制的各种参数当然也可以根据size的大小进行比例调整,这样能达到快速冲过S弯的效果,但由于size值并不能严格区分S弯和入弯前一段时间的状态,所以在普通弯道中赛车将靠内行驶,存在碰到内侧标志杆的危险。因此,为了安全起见,舵机控制采用一般的P控制即可。
实践证明,摄像头能采集丰富的赛道信息,对这些信息进行预处理,并充分利用提取到的黑线位置对赛道进行判决,能使得赛车行驶快速流畅。
相信随着比赛的深入,摄像头方案的潜力会被进一步挖掘。今后为了适应更复杂赛道的要求,提高参赛成绩,可以考虑:
·结合记忆算法。赛道记忆能实现赛车行驶的全局优化,而且今年增加了坡道,仅凭视觉很难预先检测,因此若结合记忆算法将明显提高性能。
·对判决算子进行改进。前面介绍的赛道判决算子,能反映直道和进出弯道的特征,但是对于S道并不敏感,因此可以考虑对其进行改进,或者采用其它算子。通常,将几个算子的结果进行加权平均后能达到更好的效果。
评论
加载更多