第四章 软件设计
本系统软件设计的总体流程图如下:


图4.1 程序流程图
4.1路径的检测
控制系统中,对被控对象的检测是一个非常重要的关键环节。在反馈控制系统中,控制器总是通过比较检测量和给定量来计算控制量,因此,检测环节对整个控制系统的质量起到至关重要的作用。
在本次比赛中我们先后采用了红外光电管和摄像头检测路径,也制定两个方案。
方案一:采用红外光电管检测
我们采用模拟量对黑线的位置定位。由于各环境下光电管的值不一样,为了解决这个问题,我们在比赛前先要对光电管进行标定,找到它对黑线的敏感程度,将这个过程的每个光电管的最大最小值存下来,用最大值减去最小值得到每个传感器在赛道上的输出范围,小车行使过程中,将每个传感器输出的信号减去最小值,再除以该传感器的输出范围即可得到其相对输出值, 然后找到其中最大的那个值。就说明该光电管下面的黑线比例最大,然后找到它旁边的两个光电管。就可以根据这三个值可以算出黑线的准确位置,具体公式如下式所示:
position=percent[j]*weight[j]+percent[j+1]*weight[j+1]+percent[j-1]*weight[j-1]
percent[j]为所占黑线的百分比,weight[j]为当前光电管所在位置。
方案二:采用摄像头检测
我们采用边界提取算法对黑线的位置定位,由于比赛赛道是在白色底板上铺设黑色引导线,因此干扰比较小,线提取较为容易。很自然的就想到了图像处理算法中较为简单的边界提取算法。由于黑色赛道和白色底板之间的色差较大,直接反映在图像数据中就是大于一个黑白色阀值。通过实验可以基本上确定该阀值的大小,根据现场光线的变化影响会有略微的变化。但是该阈值基本上介于22-30 之间。因为可以通过判断相邻数据点的差是否大于该阈值,作为边沿提取算法的依据和主要参数。
注:在全国总决赛中我们采用的是方案二。
4.2策略与控制量计算
对于电机的控制,我们采用闭环控制,控制量由MC33886给出,而速度反馈量由编码器测得。编码器输出的脉冲输入到PCAN0,通过定时器申请中断,计算一定时间内读取PCAN0的值,由于是一定时间内的脉冲数可以看成是电机速度。给定量是根据当前传感器的检测到黑线的位置给出的,我们选择了模糊推理给定,该模糊控制器是一个两输入,一输出。输入黑线位置和黑线位置的变化率,通过模糊推理输出一个当前所需的速度量。在通过一个增量式PID调节器使电机的实际速度尽可能快的接近给定速度。对于舵机的控制,我们采用开环控制,由于舵机的控制精度高,一个PWM占空比对应一个角度,因此开环控制的效果较好。我们采用的是PD控制,因为这样可以让舵机的控制速度更快,输入黑线位置和黑线位置的变化率,通过一个计算式输出相应的PWM值。
4.3路径记忆
由于传感器看到赛道的长度有限,不能很好的对赛道状况进行预测。因此记下路径对于小前瞻的传感器有很大帮助,但记忆路径也需要具备五大条件:
(1) 赛车必须识别起跑线。起跑线是作为记忆的起点和终点,因此检测起跑线是记忆路径的最基本的条件
(2) 赛车需要在第一圈记下正确的赛道信息。在第一圈必须完整的记好路径,如果赛车冲出跑道,那么记忆的路径就是错误的,在第二圈就会用错误的信息去控制赛车,那么赛道记忆已经完全失败。因此在第一圈就要才用比较缓慢的速度控制赛车。
(3) 正确的滤波。第一圈的信息太复杂,就要求我们通过滤波的方法去简化赛道,比如我们可以通过滤波方法让赛车直接冲过S道。
(4) 赛车必须拥有足够的存储空间。由于赛道的信息量太大,就需要足够的内存去存储这些信息。
(5) 赛车在第二圈如何应用第一圈记下的信息。要想赛车在第二圈跑出好成绩,就必须正确使用第一圈记下的信息。
下面根据上面的五个条件一一进行说明
(1)起跑线的检测

图4.2 起始线尺寸图
从图4.2的起始线的特点可以看到,在两条黑线之间有大约两厘米的白色区域,可以检测这个特征来区别起始线和十字交叉线。
用CMOS摄像头对起跑线的检测难度较大,要从每图像中提取出起跑线需要占很多单片机的资源。我们的做法是:由于我们使用的左边缘提取黑线法,先将检测到的图像进行滤波,因为起跑线在图像上一定会出现这种情况:一行黑线位置与它相临的两行黑线位置相差很大。就把这一行提出来单独处理,如果这一行的值明显变化四次,则表示检测到起跑线。否则为十字交叉线。但是连续几幅图像都会检测到十字交叉线,用哪一幅作为起始,怎样才能防止检测的错误呢?由于赛道的长度不可能很小,所以只需要设置一个控制量,使智能车在检测到起跑线后,多远的距离不能再次检测即可。一般选用第一幅检测到的起始线为准,然后就可以开始记忆赛道了。
(2)赛车如何在第一圈记下正确的赛道信息
起跑线检测到后,开始对赛道进行记忆。我们采用的是分段式记忆算法,当黑线的位置在中间某个区域内记为直道,在右面的区域记为右弯道,在左面的区域记为左弯道。我们采用了编码器可以记录小车走过的路程,具体做法为:用PCAN1记录编码器的脉冲数,输入到定时器当中,我们采用了定时器的溢出中断来定距离对赛道进行记忆,当定时器的脉冲数达到溢出的脉冲数时,这时定时器申请溢出中断从而实现对赛道定距离记忆。当第二次检测到起起始线时记忆结束。
(3)正确的滤波
正确的滤波对赛道记忆来讲是至关重要的,它决定了在第二圈赛车的运行路线和运行速度,对赛道滤波需要分两种情况,第一种就是在记忆过程中对赛道滤波,由于我们采用的是分段式记忆方法,当某一段记到的脉冲数小于某个数时,这时我们把它归为上一段。第二种就是在第二次检测到起始线后对赛道进行全局滤波,这时我们要从赛道中滤出小S道。大S道和连续弯道。具体做法如下:首先我们必须先找出它们的特征,对于小S道,由于我们采用的是分段式记忆算法,如果当连续几段的脉冲数都很少时,我们可以把这几段可以看成一个整体,把它从赛道中滤出来,从而实现小S道直冲。当然这个脉冲数的阈值必须是通过大量的测试而得,否则将造成错误。大S道不能像小S道那样直接冲过去,否则小车将冲出跑道。我们必须将连续弯道提出来,因为在第二圈回忆跑道时,连续弯道最容易出错。
要想将连续弯道滤掉,就必须将它的特征找到。我们采用分段式记忆算法,假如我们把左弯设为1,直道设为2,右弯设为3,那么检测到连续弯道记下的弯道类型是13131,我们可以抓住这个特征来判断连续弯道。
(4)赛车必须拥有足够的存储空间
由于赛车的RAM空间只有8K,所以EEPROM必然成为了存储赛道信息的最佳选择。通过编写WriteEEPROM和ReadEEPRROM这两个函数,将EEPROM当作ROM来使用。这样就解决了存储空间不足的问题,而且EEPROM在程序复位和断电后数据不会丢失。
(5)赛车在第二圈如何应用第一圈记下的信息
根据第一圈记录下来的信息,小车就可以提前预知直道弯道。对于直道,小车在前段以常规的速度行驶,以便小车调整车身姿态,中段则以全速行驶,后段则提前减速到一个最佳的速度,为过弯而做准备。在弯道中,小车会根据第一圈记下来的不同曲率,以设定速度匀速行驶。特别的是在过小S弯时,我们人为地让小车减小调节舵机的大小,这样小车便能以近似直道冲过去。记忆算法流程图如图4.3所示:

图4.3 记忆算法流程图


