硬件实现原理
按照竞赛的某些规定,本文设计了如图1所示的硬件原理框图。红外传感器采用一排13对红外发射接收管,利用其接收的电平大小经过MCU的ADC后由MCU 判断当前黑线所处的位置,为了降低功耗,系统中还增加了MOS开关管,当检测某红外传感器时该传感器供电打开,其余的则关闭。赛道中具有十字交叉路口,同时必须判断起始(即终止线),因此智能车预先可以配置当前赛道的总的十字交叉个数,同时通过软件算法可以判断出是否经过世纪交叉口(起始终止线可以作为一个十字交叉线)。系统运行时,按照红外传感器采集的信息可以判断出当前引导线的位置,即在小车的左边、中间或右边,偏离多少,MCU据此以及由Hall测速传感器获知的当前小车的速度确定小车当前的行为,主要控制舵机即小车的方向和电机即小车的速度。
图1 系统硬件框图
软件控制算法
系统软件控制主要包括两部分,也即记忆算法的两个过程,从行驶过程中看即第一圈和第二圈,其流程框图如图2所示。
图2 系统软件控制流程图
初圈的控制和记忆
智能车在行使第一圈时的主要目的就是记忆赛道信息特征,并进行一定的处理。按常规方法小车需要匀速行驶,以便在固定的时间间隔或固定的路程间隔记忆相关的道路信息。数据记忆时,采用了12个磁钢的霍尔传感器,车轮转一圈得到12个计数,即使在速度很快的情况下响应时间也是us级的,精度足够满足要求。
在非匀速的条件下,采用了新的数据存储格式。首先对当前的状态进行弯直的判断,根据迷糊控制得到的舵机的转角值c_ang,判断得到当前车的弯直情况。同时由于车是非匀速行驶的,而第二圈所行驶的时间间隔和路程间隔也并不一定和第一圈完全相同,因此只判断弯直情况,在弯道时,记忆每一个测试点的转角值,而直道时,既没必要存储转角,又可节省大量存储空间,因此对于直道时只记忆直道的起点和终点路程,而该路程是小车相对于起始点的绝对路程,也即霍尔传感器检测到的磁钢的个数ect_cnt。
系统按照前一状态和当前状态的不同情况分别进行数据存储,其算法如下:当前一状态是弯道,现状态是直道时,即弯直态,则写入0x7f,ect_cnt,其中ect_cnt是当前的路径计数;当直直态时,不存储;当直弯时,写入当前的ect_cnt,0x7f,当前的c_ang;当弯弯时,写入c_ang。系统初始化时为弯道,则开始行驶后,进入起跑线,此时检测到是直道,进入弯直状态,写入0x47和当前的ect_cnt,这就是道路的起始存储数据。
数据的分析及处理
第二圈过起跑线时,系统配置成进入弯直状态,此时应该根据第一圈记录的数据算出直道的长度,这样车在直线上就可以以很高的速度行使,并且能够提前减速,安全进弯,达到很好的控制效果。
在由直线进弯时,如果在弯道中出现直道,并且计算出其长度小于某一值的时候,认为是过弯过程中出现的小范围的直线,仍按照弯道处理。本算法的核心也在于如何过滤弯道中出现的直道,以及从分析不同的弯道形式。把弯道分成以下几类:
(a) 急弯:这里所说的急弯也就是竞赛规定的曲率最小的弯。在急弯时,转角的个数相对较少,转角值相对较大,并且在正常情况下所有的都是同向的。
(b)圆形弯道:相比于其他几种赛道元素,圆形赛道的识别比较简单,当同一个方向的转角大于某一个数值时,并且中间过程中没有换向发生,便可以认为小车进入了圆形赛道。因为在角度的控制上,本系统采用了模糊控制,车在进弯时能够迅速调整角度,并以一个恒定的角度过弯,以上的数据是验证了这一结果。
(c)小S弯:小S弯的特点是:在过弯的整个过程中既有左转又有右转的,并且左转角度的个数和右转角度的个数都应该大于某一个值。此外,单次左转或者右转的角度的个数小于某一个值。考虑到小S的前后可能会接着其他弯道,本系统在第一个换向点之前,按照其弯道行走,在换向点之后采取小S的行走策略,在最后一个换向点之前结束。
(d)大S弯:大S相比小S而言,其赛道特征是相似的,只是判断的标准稍有不同。首先,大S之间有较长距离的直道,必须加大直道的判断范围才能将其过滤掉。其次,单次左转或者右转的角度的个数应该大于小S的个数。