第四章 智能车软件设计
CMOS智能车的软件设计关键在于图象采集算法是否做的有效可靠,黑线提取得是否准确合理。这是一个同时涉及到软件和硬件的操作过程,又恰恰是该软件设计的难点。当然,至于需要什么程度的图象精度,就要根据后面的舵机和速度控制算法的需要来确定。本软件的整个原理框图如下:

4.1 图象采集算法
普通CMOS图像传感器通过行扫描方式,将图像信息转换为一维的视频模拟信号输出。信号变化很快,比如PAL制式的视频信号,每秒钟输出50帧图像信息(分奇偶场),每帧图像有312.5行,每行图像信号时间为64us。其中有效的图像信号约为56 us左右。相比之下,S12的A/D转换器采集速度较低,进行10位A/D转换所需要的时间为7us。这样,采集的图像每行只能有8个像素,图像的水平分辨率很低。同时,S12每场图像可以采集300行左右的图像信息,故图像的垂直分辨率相对较高。在此基础之上,本智能车很可能漏检宽度仅2.5cm的黑色引导线,无法获取足够精度的路径信息。
考虑到实际路径识别单元所需的检测图像应该是水平分辨率高,垂直分辨率低。在安装CMOS摄像头的时候,只要将它旋转90°,输出的图像信息也将旋转90°,通过S12的A/D转换器采集的图像信息,水平分辨率与垂直分辨率会发生的互换,从原来的水平分辨率低,垂直分辨率高的图像,变成水平分辨率高,垂直分辨率低的实际图像,正好符合道路参数检测模型的要求。
另一方面,由于HCS12单片机处理数据的能力有限,不可能在短短的20ms内处理完整幅图像。在不影响道路检测精度需要的前提下,本系统采用隔行采集思想来压缩图像的数据。即每隔5个有效行采集一行。此外,为了进一步提高A/D转换器的速度,本系统还适当地将S12的CPU超频至32M运行和设置A/D转换器的精度为8位。具体实现流程图如图4.1所示:
图4.1 图象采集程序流程图
其中,数据转存是由于在CMOS摄像头安装时,本智能车是旋转90°后使用的。故在图像采集后应将其还原,方便后面的图象处理。具体是通过设置1×16的VideoLine[i]和40×16的VideoImage[i][j]两个数组实现的:先将采集到的行(对应实际图象中的列)数据(考虑到行消隐区的存在,故舍去22个采样点的前后各3个,只取中间16个,以保证所提取出的点为有效采样点)存到VideoLine [i]中,然后再行列交换转存在VideoImage1[i][j]的列中。实验证明:将这种图像处理算法应用到该智能小车中,足可以在20ms内采集到一幅16行×40列的图像,完全满足赛道路径识别的需要。
4.2黑线提取算法
由于智能车系统对实时性的要求很高,过于复杂的黑线提取算法,会导致决策周期溢出,使程序崩溃,所以必须采用简单高效的图像识别算法。本系统采用的是简单的全局自适应边缘提取算法:
它采用逐行搜索的算法,首先找到从白色像素到黑色像素的下降沿和从黑色像素到白色像素的上升沿,然后计算上升沿和下降沿的位置差,如果大于一定的标准值,即认为找到了黑线,并可求平均值算出黑线的中心点。至于上升沿、下降沿的检测可以通过上上次采样数与这次采样数的差值的绝对值是否大于一个阈值来判断(隔一个数相减是因为考虑到对于摄像头黑白的变化过程是一个渐变的过程,而不是突变的),如果是且差值符号为负,则为上升沿;如果是且差值为正,则为下降沿。这里阈值可根据经验设定,以该智能车系统为例,该阈值基本上介于30~46之间(当A/D模块的参考电压为2.5V时);抑可以采用全局自适应法设定,每次采样后首先都遍历一次图像,得到图像灰度值的平均值,然后用这平均值乘以一个调试系数即可得到所要的阈值。
实验证明,这种算法简单可行,能够基本不受光线明暗的影响,鲁棒性较强。
4.3图象滤波算法
考虑到赛道对小车有十字交叉线的干扰、光线对小车有反光的影响、小车本身也存在视野狭窄的缺陷,故用黑线提取算法得到的路径信息有可能错误,不能如实反映赛道情况。为了不导致决策失误,必须对图像加以滤波,并且对错误数据适当地进行校正。
在图像滤波算法中,本系统主要考虑了以下几个方面:首先,根据图像模型去噪,两中间有黑线的行之间不能有全白行,这主要是解决光线对摄像头的反光问题;其次,在理想的情况下,赛道的黑色引导线是连续可导的,据此去噪,则两黑线行之间坐标的差值不能太大,否则就应用其前后两个数据的平均值来校正。
在调试过程中会出现两段黑线情况,这种图像信息比较复杂可能是三种路况:赛道比较紧检测到多条赛道,大“S”弯,以及“十”字交叉道,保留最底下的一段,这主要是从安全角度考虑的,防止赛道周围环境对小车的干扰。
4.4 控制策略及控制算法
4.4.1控制策略
影响赛车速度成绩的一个重要因素就是对弯道和直道的提前识别判断,从而实现安全过弯、快速过直道、S弯道,以此提高比赛成绩。而摄像头方案在这方面有天然的优势;相对于光电管传感器,可以获得较远的路径信息;不仅可以得到单行的黑线信息,还可以同时获得多行的黑线信息。经过图象处理算法后,得到的信息是关于前瞻范围内的黑线的具体位置,它是一个含16个元素的一维数组linepos[i],现在就是要从这一维数组中提取出智能车前方的路径信息,以便于后面转向和速度的控制。下面即简单介绍一下该系统的控制策略:
为了使小车运行得快而稳,联想光电管方案本智能车可以从这一维数组linepos[i]中提炼出一个黑线距离车身中心轴的偏差量offset,要求出这个偏差量必须至少考虑两个因素:最远行黑线位置linepos[topline]、16行黑线平均位置averlinepos。其计算式如下:
Offset=a×linepos[topline]+b×averlinepos (4.1)
其中,a、b为各量的比例系数。考虑最远行黑线位置是为了及时了解赛道走向趋势,这样不仅可以方便赛车准确提前转舵机,达到弯道走内道确保安全且路程较短,还可以达到赛车进弯道提前减速,出弯道提前加速,从而保证赛车始终以一个较快的速度流畅运行;考虑16行黑线平均位置是为了有效利用各行路径信息,通过正负相消的思想平滑小弧度S弯道,达到近似等同直道而直冲的效果且能减少过分相信最远行的风险;考虑16行中全白行的个数是为了应对紧急危险情况,根据小车看不到赛道的程度来适当的校正Offset值。
此外,为了提高智能车的鲁棒性,借助分段控制思想,根据不同情况本智能车采用了不同的比例系数a、b以自适应各种赛道。
4.4.2转向控制
转向控制采用了分段比例和前馈补偿相结合的控制方法。
分段比例控制
分段比例控制
通过前面提取的Offset与中心位置line_mid相减得到比例控制的偏差量E_servo,然后再根据E_servo的大小采用不同的比例系数控制舵机转向。其原因是小车处于弯道和直道的转向模型不同,统一的比例带过大会导致小车振荡,过小导致最大控制量偏小,小车转向不足,过弯时冲出赛道。使用分段比例控制既方便又可以解决以上两种问题。
前馈补偿控制
由于CMOS方案不像光电管方案,它存在图像失真的情况,越远地方的图像失真越厉害,而对于计算offset偏差量来说,越远的路径信息越有参考价值,故其比重也相对较大。这样,就导致小车转向微调时的效果往往不太如人意。鉴于此,在小车前述的分段比例控制基础上又加入了前馈补偿控制进行微调,考虑图像最近的一行失真最小,故前馈补偿思想就是通过最近行黑线位置linepos[botline]与中心位置line_mid之间的偏差得到一个微调量,然后再加入到舵机控制中实现的。
4.4.3速度控制
模糊控制设定速度
因为小车比赛的赛道是未知的,弯道的分布情况也不能确定,小车可能频繁的进出弯道,不停的调整速度来适应不同轨迹。这样就难以建立精确的数学模型,且赛车对动态性能要求较高,考虑到该款单片机有一套特色指令—模糊控制指令,执行时间只有几十us级(时钟频率为25M),不会影响决策周期,且简单易行,而模糊控制具有处理不明确信号的能力,故最终选定采用模糊控制设定速度:
(1) 模糊输入输出量的选取
赛车模糊控制器采用二维模糊控制器,输入变量E、Ec分别选为前述E_servo及其变化量D_E_servo,输出变量选为赛车的速度设定值exspeed
(2) 隶属函数的确定
MC9S12DG128B的隶属函数的数值描述有固定的数据结构,即起点的坐标值、终点的坐标值、前沿斜率、后沿斜率;且输出的隶属函数须采用单值函数。故设计输出变量的模糊集为U={NB,NS,Z,PS,PB},论域为{0,25,50,75,100};设计输入的隶属函数如下:


(3) 模糊规则库的建立
确定控制规则是模糊控制器设计的核心工作。控制规则的制定需要大量的实时调试经验。具体可如下实现:首先可以结合自身现有的经验制定出初步规则表,然后结合串口调试工具实时返回数据,对规则进行微调。注意,在进行微调时候切忌一次进行较大的改动,否则改后无法判断到底是那条规则在起作用。
表5.2 模糊规则表

(4) 模糊推理及解模糊化
在模糊推理过程中,选用了REV 指令。MC9S12DG128B单片机中规定各个前件之间只进行模糊与运算,而如果几个规则的逻辑后件影响到同一个模糊输出,它们之间隐含模糊或运算。即使用MIN-MAX法进行模糊推理。
反模糊化采用重心法(COG法)。WAV是解模糊的核心指令,它与EDIV指令配合完成模糊输出到控制输出的变换。
PID控制调整速度
本系统采用的是增量式数字PID控制,通过每一控制周期(20ms)读入脉冲数间接测得小车当前转速nowspeed,将nowspeed与模糊推理得到的小车期望速度exspeed比较,由以下公式求得速度偏差s_ek与速度偏差率s_dek。
s_ek = exspeed – nowspeed; (4.2)
s_dek = s_ek –lasts_ek; (4.3)
式(3.2)中, lasts_ek为上次的速度偏差。考虑到CMOS方案的控制周期较长,假设按2.5m/s的平均速度计算,则一个控制周期小车大概可以跑过5cm,如果按这种周期用上述PID调节速度,则会导致加速减速均过长的后果,严重的影响小车的快速性和稳定性。为了解决这个问题,可以在PID调速控制中加入BANG-BANG控制思想:根据s_ek的大小,如果正大,则正转给全额占空比;如果负大,则自由停车或给一个反转占空比;否则就采用PID计算的占空比。


