第三章 软件设计
推荐给好友
打印
加入收藏
更新于2008-08-06 23:36:33

软件设计主要遵循以下两个原则,即模块划分原则和层次分明原则。模块划分原则是指对于各个模块的设计都尽量使其具有高独立性和低耦合度,各模块间不能随意进行变量互访。层次分明原则是指硬件驱动和软件控制要层次分明,底层的硬件驱动只需要向上提供可调用的接口,控制软件则对底层驱动流程完全不关心。此外,还要使访问全局变量的功能性函数或子程序尽量少,特别是对硬件驱动程序,要具有完全的独立性。


图3.1 智能车软件体系结构图


如图3.1所示为智能车系统的软件体系结构图,主要分为硬件驱动层、功能控制层和主控软件层。硬件驱动层主要是对硬件各个功能模块提供基本的软件驱动和支持,主要有AD转换驱动程序、PWM脉宽调制驱动程序、定时器驱动、蜂鸣器驱动程序、最小可运行系统驱动程序。而功能控制层主要是根据智能车实时寻迹的需求,调用硬件驱动层的相关子程序,完成特定的功能,如数据采集的滤波处理等,以便主控软件正确决策。它主要由动力电机控制程序、转向舵机控制程序、AD通道采样程序、蜂鸣器响子程序组成。主控软件层主要完成对整个系统的协调和控制,由main主函数、寻迹控制程序和延时控制子函数组成。寻迹控制策略是智能车能否快速的运行的关键,在本章第节将重点探讨路径识别方法和寻迹控制策略。

下面对先对本设计各模块的硬件驱动做个简要的介绍。

3.1 文件清单
如下表3.1 所示为硬件驱动各文件清单。 

表3.1 硬件驱动各文件清单



3.2 主要子函数原理解析

如下表3.2 所示为各个主要子函数功能解析。

表3.2 主要子函数功能解析



3.3 硬件各模块子程序功能注释

如下表3.3列出了硬件各模块子程序功能注释。

点击查看:表3.3 硬件各模块子程序功能注释



3.4 寻迹算法策略及其程序实现


图3.2 控制算法流程


由于赛道是由白色背景贴上黑色色带而做成,显然,小车要能够自动循着黑色色带前进,必须有效的识别黑白灰度信息。为了更好的识别黑与白,本设计选用对黑白识别敏感的灰度传感器作为寻迹工具。黑白的程度不同,则灰度传感器的输出电压值也会不同,可再通过单片机的A/D转换模块将起转换成相应的数字量,以便处理。使用A/D转换模块应注意以下几点,首先,A/D采样的时间要符合实时系统的要求,其次,对黑白灰度信息的采样值精度要尽量高些,尽可能提供精确的数据以满足高层处理的要求。高层软件可以通过特定算法判别小车在行进时所处的位置是左偏,右偏,还是出轨。下面介绍现已实现的小车控制软件的算法流程。


图3.3 左偏处理                                                        图3.4 出轨处理

小车控制软件主要根据前方7个红外传感器对黑白的采集值经过7路10位A/D转换获得相应的数字量,这些数字采样值将作为判断小车行进中当前黑色色带处于哪个传感器下方的依据,判断的过程实际上是拿采样值与事先测定的阀值作比较,并由此决定小车的控制结果,增速还是减速,左转还是右转。相应控制算法流程如图3.2所示。
 
本控制算法的思想是先判断当前中间传感器是否位于黑线上,如果位于黑线上,则小车快速沿直线前进;否则判断当前小车是左偏或右偏,还是所有的传感器处于全白(即出轨),之后据情况进行处理。
 
如果当前小车是左偏,则按图3.3的流程图进行处理。首先,判断左边的三个传感器是否有位于黑线上的,若左1传感器位于黑线上,则左转8度,以15档前进;若左2传感器位于黑线上,则左转25度,以12档前进;若左3传感器位于黑线上,则左转40度,以10档前进,左偏情况处理完毕。如果当前小车是右偏,此时的处理与左偏类似。

 如果当前小车的所有传感器均处于全白状态,则按图3.4流程图进行处理。当小车当前的传感器处于全白状态时,表明小车已完全脱离黑色色带,要根据小车之的状态来进行处理,若小车脱离前状态为左偏,则左转42度,以10档前进;若小为右偏,则右转42度,以10档前进,处理完毕。

 3.5 改进的寻迹算法策略
自寻迹智能模型小车的设计中会遇到路径检测和寻迹策略制定的问题,以下是我根据在小车制作的过程中遇到的问题和其自身特点,所做的粗略的研究。


图3.5 模型车示意图


如图3.5所示,小车前方安装有10个红外传感器组成的光电传感器线阵,间距为20mm,假设它们垂直检测路面信息,并能在高端通过int getAD(int channel)函数获得其正下方赛道的灰度值,范围为0-1023,值越大代表越亮,channel为要获取的传感器号,取值为1-10。对于同样的黑或白,10个传感器所获得的值各不相同。车的前轮到传感器线阵所在直线的距离大约为20cm。
 
在实际检测中,各个红外传感器由于是手工焊制的,即使对于同样的黑或白不同的传感器所采集的值也会不同。如图3.6所示是我们在实验中所获得的10个红外传感器的采样值,这些值都是通过了中值滤波和5次均值滤波后所获得的值。从图中我们可以看出全白、全黑以及中间色分别对应红黄蓝3条系列线,不难发现即使对于同样的黑或白不同的传感器所采集的值不同,但对于同一传感器,不同的黑或白还是能比较明


图3.6 10个传感器的数据比较1                                图3.7 10个传感器的数据比较2


图3.8 线性亮度偏差                                                   图3.9 亮度补偿后的各传感器值

显的分辨出来的,而且就算是不同传感器对同样的灰度情况也有其关联性。将各传感器全白时的值减去中间色的值,再将中间色的值减去全黑的值,并作到同幅图中可得如图3.7的结果,红线系列是白中相减,黄线系列是中黑相减,显然这两个差值大致呈线性关系。因此我们可将10个传感器的值通过线性映射投射到同一向量空间,假设为0-1000。经过映射后的10个传感器的数据,我们认为是可以做类比的,这一点是显而易见的。那么在此之后会有很多数学方法可用,去求出小车传感器线阵中心与赛道的偏离情况。这里初步设想先通过筛选选出与黑色导引线临近的5个传感器的采样值,再用二次曲线做拟合,通过求其最小值点所对应横坐标值来确定小车偏移情况,最后要计算出来的结果是小车传感器线阵中心与黑色导引线中心的偏移量。如图3.11所示是整个算法流程框架,需要说明的是在实时采样数据经过规范化后,即映射投射到同一向量空间后,要经过亮度补偿。我初步研究后发现,造成亮度偏差的主要原因是小车在现场会遇到环境光的不均匀现象,即有可能出现某一边光照较强,而另外一边光照较弱的现象。因此,为了简化处理,我们姑且认为这样的影响是线性的,并在数据筛选拟合之前,先做一次线性亮度补偿。如图3.8所示为一组数据的线性亮度偏差情况。而图3.9所示为经过一次线性亮度补偿后的结果,明显可见效果不错。在实际应用中还可以考虑多几次同样的操作。之后,可以以亮度值最低的第4个传感器为中心向两边延伸2个传感器,共取得5个传感器的灰度值,做二次回归,如图3.10所示,最后计算出来的结果是4.09,说明此时黑线在第4号传感器下方,并且稍微向中心偏移(中心在5,6号的中间)。

下面将算法各个流程的数学公式进行推导。


图3.10 二次回归曲线



图3.11 光电传感线阵路径检测算法框图


设各个传感器实时采集的数据为 ,在实时寻迹检测之前,需要有一个参数校准的过程,即通过大量数据的统计和计算来确定在数据规范化时所需要的参数。这里可采用聚类分析的方法。我自己在研究中,是把大量采样数据通过手工的办法进行了聚类分析,发现最多的两个聚类是由全白和全黑的时候的传感器值所组成。因此,我们可以使小车在运行前实时检测现场数据,通过程序分析提炼出全白和全黑的参照值。设这两个参照值分别为 hi和li,i为某传感器的编号,前面已经分析出可用线性映射做数据规范化处理,这里将数据规范到0-1000的数据区域,即有:

故经过线性映射后的数据为:

先令 ,下面对规范化的数据进行线性亮度补偿,先要分析出线性亮度偏差函数:

用最小二乘原理,先求出差方和得:

分别对a,b求偏导可得:

化简可得:


以上是,二阶线性方程组,不难求出a和b。这里我们只关心a的取值,因为它直接反映出亮度偏差的程度。因此对于每个传感器都要去掉这个误差:

其中是亮度补偿后的各传感器的灰度值。之后,我们挑选出灰度值最小的第 个传感器,并向左右延伸2个传感器,这样我们便可获得5个与黑色导引线密切相关的数据,对其进行抛物线拟合。设拟合函数为:

(这里的a,b区别于前面线性函数的系数) (8)


用最小二乘原理,也对其先求出差方和得:

分别对a,b,c求偏导可得:

同样化简可得:

这样可由a,b求出曲线的最小值点的横坐标:


,即有:为传感器线阵中心与赛道的偏离量。

 以上所讨论的是数据融合方面的内容,是怎样获取可靠的小车偏离量的过程。小车有了可靠的信息,接下来就是按照程控算法策略来进行寻迹控制。在自动控制理论中,典型的控制方法就是PID控制。其控制原理如图3.12所示。


图3.12 PID控制结构框图

由图可见,PID控制器是通过对误差信号e(t)进行比例、积分和微分运算,分别对其结果进行加权合成,得到控制器的输出u(t),该值就是控制对象的控制值。PID控制器的数学描述为:

 式中u(t)为控制输入,e(t)=r(t)-c(t)为误差信号,r(t)为输入量,c(t)为输出量。我们从以上关于数据融合的推导可以获得e(t)误差信号为,这是小车运用PID算法的的基础,对进行加权可以获得p比例因子,通过定时器在特定时间间隔取得的变化量,可作为d微分因子,对于积分系数只能通过经验和实验确定其步进系数,这个系数可以是与时间线性相关的,也可以是其他加速收敛效果更好的,对此我还没有做深入的研究,姑且就用线性步进吧。这样的话,通过实验对pid各权系数进行测定,是可以找到使小车跑得出色的参数的。

 

 

上一章:  硬件设计                                         下一章:编码调试




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.