第五章 软件设计
5.1智能车控制系统设计
5.1.1系统调度方案的选择

图5-1 系统程序运行流程

图5-2 程序代码层次结构图




图5-5 摄像头坐标变换示意图

图5-6 摄像头采集图像与真实图像示意图
在实际运用中,我们发现在图像在一定的条件下的失真是线性的,因而只需对采集的原始数据加以线性补偿即可。
对于这一类的控制系统共有三种系统调度方案。
方案一:循环扫描
所有的任务依靠循环扫描的方式,逐步进行更新。响应速度高,但程序不够灵活,难以对程序进行监控
方案二:中断调用
所有的任务依靠定时中断予以调用。响应速度稍低,但程序运行方式灵活,可以同时提供8路不同频率的PID采样控制过程。同时也便于对该系统进行扩展。
方案三:操作系统加若干任务
任务的调度完成由嵌入式操作系统完成,系统运行非常稳定,可扩展性强,通用性高。但对于小的系统,运算及存储资源消耗较大。
经过考虑,为了增加系统的可扩展性和可靠性,同时控制系统的成本,采用方案二组织整个系统的运行。
系统程序运行流程如图5-1所示。

图5-1 系统程序运行流程
5.1.2系统的层次结构
为了提高系统的可扩展性,我们采用层次结构的软件组织,通过软件的分层结构,使任意一层程序的改变不至影响其他层,最终实现结构清晰完整得软件系统。
1) 硬件层:
这一层得函数至于硬件打交道,处理与硬件相关的IO操作,中断操作,完成系统的初始化。提供上层功能实现的基本函数。
2) 过程层:
这一层的程序对调度层屏蔽了硬件差异,在硬件层的基础上,完成特定的功能过程。为上一层的算法提供接口。
3) 调度层:
对系统做整体上的调度,提供系统运行的几种不同的模式,并在过程层的基础上实现复杂功能的实现。本程序各文件的层次结构如图5-2所示。

图5-2 程序代码层次结构图
图中每一个图标代表一个程序文件,程序文件所在的集合显示了文件所属的层次结构。
5.1.3智能车控制系统的算法实现
当底层的功能准备就绪后,关键就是控制算法的实现,根据对智能车控制策略的认识,我们决定对与三种不同的赛道模式,我们使用不同的处理算法来进行控制,此外,为减小电池电量和赛道环境对小车速度的影响,我们还设计了相应的控制算法对速度进行控制,总体的算法结构如图5-3所示。

图5-3 算法结构示意图
5.2图像采集处理算法
5.2.1图像信号的特点
图像采集控制采用时钟捕捉中断,采集直接读相关I/O口即可完成。由于所采用摄像头信号为320线(行),结合摄像头的视野大小,如图5-4所示,我们共采集了37行数据,每行采集48点,用一个二维数组存储。

图5-4 图像采集实例
5.2.2图像坐标变换
在摄像头位置、镜头角度固定后,我们的摄像头视野范围如图5-5所示,对于这样的图像,首先要对图像的梯形失真做校正。
通过理论建模分析,如图5-5所示,我们得到了摄像头坐标变换的公式。其中x1,y1是表示物体实际所处的位置,x。、y。表示摄像头原始数据中的位置。H是摄像头的中心高度,a是摄像头俯仰角,r是实际物体相对角度。


图5-5 摄像头坐标变换示意图
以得出的公式,我们借助MATLAB工具进行仿真,可以得到摄像头偏角不同的情况下的摄像头采集的图像与真实图像之间的关系,如图5-6所示。

图5-6 摄像头采集图像与真实图像示意图
在实际运用中,我们发现在图像在一定的条件下的失真是线性的,因而只需对采集的原始数据加以线性补偿即可。
图像数据线性补偿可以用以下公式,令d=黑线与中心线的距离(右由正负号区分),L1=梯形视场顶部长度,L2=梯形视场底部长度,N=对图像数据采集的行数(我们的程序为37),road[i]为识别的黑线相对偏移量。
Road[i]=Road[i]*(1+(L2/L1-1)*i/(N-1)) (i=0…N-1)

5.2.3
图像识别算法

图5-7 摄像头视野范围
5.2.3
图像数据采集、存储到单片机中后,就要对数据进行分析,识别出黑线与小车的相对位置,我们将黑线的相对位置用一个容量为37的一维数组存储。


5.3.2智能车的控制目标






其中,图像处理模块是该辅助软件系统的核心,分为三部分:功能实现部分、功能调用部分以及位图操作部分。

将采集到的图像数据用matlab分析,可以得到如图5-8所示的结果。从中可以看出:黑线与赛道其他部分的数据有很大的区别。因此,我们设计基本的赛道识别算法为:从一行数据的左边第一点开始,寻找到第i(i<37)点,满足W(i)-W(i+2)>DOWN(W(i)为i点在图像数据里的值,DOWN为下降的门限),则表示可能找到黑线,继续搜索,若在有限点数内找到点j((j-i)<Points_Limit),使得W(j)-W(j+2)<UP,则找到黑线,黑线位置blackline=(i+j)/2-CENTER(CENTER为中心线位置)。

图5-8 单行图像数据
5.3方向控制策略
在智能小车的行驶中,对路径的识别正确与否是小车成功行驶的决定性因素,在小车的路径识别算法中,根本的问题就是根据摄相头采集到的路面数据信息,对跑道的中心黑线进行有效的提取,并且根据提取到的黑线对路径的状况进行分析,识别出直道,弯道等各种路面因素。
5.3.1赛道特点与控制算法
设偏移s ,姿态r ,则控制量输出
,其中小车在弯道的姿态变化率就是弯道的曲率半径。
使小车稳定
增加入弯响应速度
姿态信息,增加入弯稳定性,提高道路切换时的稳定性
提高弯道运行的稳定性
图5-9是小车位置-姿态状态示意图
在智能小车的行驶中,对路径的识别正确与否是小车成功行驶的决定性因素,在小车的路径识别算法中,根本的问题就是根据摄相头采集到的路面数据信息,对跑道的中心黑线进行有效的提取,并且根据提取到的黑线对路径的状况进行分析,识别出直道,弯道等各种路面因素。
5.3.1赛道特点与控制算法
设偏移s ,姿态r ,则控制量输出
图5-9是小车位置-姿态状态示意图

图5-9 小车位置-姿态示意图
5.3.2智能车的控制目标
在纯比例控制并且输入为离散信号的情况下,我们的小车控制有明显的阶梯,并且在速度为1.4m/s时,在弯道上会丢失目标。特别是在S型弯道上,最为严重。在阶跃响应下,工作在不稳定状态(阶跃响应振幅加大)

图5-10原始控制曲线示例图
这里的稳定性的要求与比赛时的不同,是从控制曲线来衡量,指曲线没有超调,阶跃响应曲线是收敛的。清华大学在某赛道上的控制曲线如图5-11所示。

图5-11目标控制曲线示例
5.3.3路径识别算法原理
经过数据处理后,我们得到在视场中黑线偏离视场中心的偏差距离
和视场中心偏离中心黑线的偏差距离
,两个距离相减得到的就是小车中心相对中心黑线的偏差距离
,也就是实际偏差值。根据偏差距离
就可以进行弯直道的识别。
(1)偏差
时,前方跑道为直道
(2)偏差
为正值时,前方跑道为右弯
(3)偏差
为负值时,前方跑道为左弯
从而判断出小车相对中心黑线的位置。
的绝对值的大小反映了小车中心偏离中心黑线的严重程度,
越大,表明偏离得越厉害。这样判断的好处在于不管小车是否处于弯道还是直道,只要小车中心偏离了中心黑线,即只要
就可以当做弯道情况来进行处理。然后分别对偏差距离
分别进行一阶微分(
)和二阶微分(
),根据偏差距离的一阶微分
,就可以得到中心黑线的变化趋势,从而判断出实际跑道是弯道还是直道,如果小车是在直道上偏离了中心黑线,则同一场数据中前后各点偏差的一阶微分值
是相等的,即中心黑线与小车中心的偏差距离与两者的前后距离呈线型变化。若实际跑道是弯道,则
不等,上述关系呈非线性变化。根据偏差的二阶微分
,可近似得到中心黑线的曲率半径R(直道曲率半径为趋近无穷),得到比较完整地得到跑道的信息。
在摄像头采集到的一场数据中,对应的实际视场大小为 600mmx600mm 根据处理器处理信号的速度和小车的运行速度,我们将一场中的数据信息按照前后距离均匀地分为前,中,后三小场,每小场对应的实际视场为200mmx600mm,首先对每小场中的路面状况进行单独判断,分别判断每小场中的路面状况是直道还是弯道,然后将三小场的信息进行结合,就可以得到更加详细的跑道信息,判断出此时小车是处于弯道中,直道进入弯道中还是弯道进入直道中等信息。其次,结合偏差距离
和偏差距离的一阶微分
和 二阶微分
,可以对 S 形弯道进行有效的提取,并能很好地区分 S 弯的幅度大小。
5.3.4方向控制的实现
我们采用的是 CMOS 摄像头作为小车的传感器,在前面的方案分析中,我们知道采用 CMOS 传感器具有前瞻大的特点,且采集到的信号完整,既包括近端路面信息,又包括远端路面信息。在我们的方向控制算法中采用的前瞻控制和 PD 算法相结合。前瞻控制就是根据传感器当前采集到的一场信号(包括近端和远端信号)首先对小车运行中即将遇到的路面状况进行分析,路面状况分析包括直道,弯道, S 弯等各种情况进行判断,得到然后结合相应的模型来计算出小车应有的偏移量,为了保持小车运行过程中方向的连贯性和平稳性,我们在方向控制中引入了 PD 控制,进一步控制小车平滑行使。在前瞻控制中,前瞻量的大小是与小车的速度相关的,根据我们的调试和反复实践,小车当前速度与最佳前瞻量存在正向的线形关系,在我们的控制中,我们引入了前瞻控制的速度系数,速度越大,引入的前瞻量也越大,使控制更加精确。其次,由于摄像头得前瞻距离较大,可以提前知道比较完整得跑道信息,总之,在方向控制中,我们引入了一些特殊的控制策略,提高智能车跟踪赛道的能力。
要精确得出检测信号和智能车方向控制值之间的关系,我们有必要对智能车的运动系统进行分析,如图5-12所示。

图5-12 智能车运动系统
在图5-11中,舵机摆角θ,赛道圆曲率半径R,前后轮距离L
前瞻距离x,误差e满足

速度控制采用公式
,其中Kp,Ki,Kd分别是比例、积分、微分控制参数。
削去R,得到e-θ关系


图5-13 偏移量与方向控制量的关系

这个关系就是在检测到的偏移e和我们应给的方向控制量(控制角θ)的关系。借助MATLAB工具对公式进行分析,如图5-13所示,我们不难发现以下结论:
1)前瞻距离越小,在相同e下,得到的控制角θ的变化越小,即在小前瞻时,控制精度高,反应灵敏。
2)前瞻距离增大时,无法跟踪曲率大的赛道,因为那时已经越界了。
3)在不太大的范围,偏移量e和控制角θ之间呈现线型关系。

图5-13 偏移量与方向控制量的关系
5.4速度控制策略
速度控制的原则就是使小车的实际速度尽快接近给定值,并稳定在给定值上。为精确控制小车速度,需要引入闭环速度控制。把采用速度传感器检测到小车的实时速度,通过实际速度与期望速度之间的比较确定小车速度状态以及决定加速或减速的强度大小。而速度的控制策略则是PID控制。同时为了加强小车的减速功能,当速度变化值大于一定阈值时,我们单独采用减速方案,使小车的速度尽快下降。
5.4.1减速的实现
5.4.1减速的实现
重点研究一下小车的减速的实现方法,这里有三种方方案:
方案一:机械减速
通过机械接触小车轮或轴实现减速。这种方案使用的范围很广,但也很有效,是机械加工复杂,需要对车体作改造,另外可靠性与可控性不,不适合单片机的控制。
方案二:滑动减速
使电机短时间停机。这种案可控性强,适合于轮轴自锁的电机,如减速电机与步进电机,,但由于小车的惯性作用,从刹车到停止需要一个缓冲时间,这样容易造成小车由直道进入弯道时容易冲出跑道,限制了小车的直道速度,而且使小车在弯道运行时连贯性很差。
方案三:电机反转减速
电机瞬时反转来快速降低小车速度。这种适合于直流电机,这相当于给小车一个反向力矩来迅速降低小车的速度,很明显其减速效率优于方案二,经实验验证,其速度上连贯性也优于方案二。
5.4.2速度控制算法
在实际的速度控制过程中,我们使用闭合的速度控制方案,结合PID控制算法,并运用电机反转减速的技术,完成预期的小车速度控制目标。如图5-14所示。速度控制采用公式
,其中Kp,Ki,Kd分别是比例、积分、微分控制参数。
图5-14 PID控制示意图
5.5 PC 机服务平台
5.5.1设计背景
在智能小车比赛中,对小车的智能控制是整个系统的关键所在,针对此次“飞思卡尔”杯比赛的特点,赛道为黑白两色,其背景为白色,跑道中央一道黑线作为小车行进依据。
实时的检测到小车位置以及跑道状况是小车能否快速,正确行进的关键。传统方法是以光电传感器为核心,在小车不同位置安置传感器,根据不同位置传感器得到的数据分析小车位置以及赛道状况。这种方法简单易行,实现方便,反应灵敏。但是缺点在于它所获取的信息不全面,只能处理黑白两色,检测距离有限,而且容易受到各方面的干扰。正是因为上述原因,以传感器为核心的思路虽然简单易行,但是确小车的行进速度受到了限制。
鉴于上述原因,本次比赛决定采用以摄像头为核心的方案。将摄像头安装在小车前端,可以获取大量路面的图像信息,能够全面完整的掌握路径信息,通过对图像信息的分析处理,就可以判断出小车的位置和赛道信息,进而控制小车的行进。而且,获取的信息可以是远距离的,这样就可以对小车运动进行提前处理,是小车高速地行进。
5.5.2设计目的
从“设计背景”中可以看出,采用摄像头方案,需要对获得的图像信息进行分析处理,而小车的MCU的处理能力有限,在时间要求范围内处理那么多的图像数据有些困难,加之图像的分析处理从纯数据上不容易看出现象和规律。为了统计图像数据的规律,为了方便设计过程中图像的分析处理以及算法的设计,需要一个基于PC的平台,提供可视化的图像分析处理服务,这也就是本软件设计的目的所在。
从“设计目的”中可以看出,本软件的基本要求如下:
提供与底层MCU的接口,以方便传送图像数据
提供图像处理的基本功能(灰度图像的显示、二值化、阈值分析、边缘提取等)
提供图像处理的基本功能(灰度图像的显示、二值化、阈值分析、边缘提取等)
要求图像显示具有一定的实时性
5.5.3设计说明
处于扩展的考虑,本软件整体上分为三个模块:人机交互模块、串口通信模块以及图像处理模块,如图5-15所示。

图5-15系统总框图
其中,图像处理模块是该辅助软件系统的核心,分为三部分:功能实现部分、功能调用部分以及位图操作部分。
1) 功能实现部分:包括所有图像处理算法,出于以后算法改进升级以及小组成员多人开发方便的考虑,所有算法以一个动态链接库Image.dll实现,接口统一定义。
2) 功能调用部分:由于图像算法采用动态链接库形式实现,主程序采用动态调用,因此为了方便调用,将所有功能调用封装在CImage类中,即CImage类实现对Image.dll中功能函数的调用。
3) 位图操作部分:出于图象显示的考虑,采用DIB方式显示和保存位图,使用一个封装类CFG_DIB来实现灰度图象的显示和保存等功能。
本辅助软件系统使用Visual C++6.0开发,采用基于单文档模式的编程方法,效果如图5-16所示。

图5-16 显示视图
视图分为三部分:串口操作视图、图像分析显示视图以及数据显示视图。具体功能如下:
1) 串口操作视图:由CCommView类实现,实现串口参数配置即串口操作的人机交互,主要与串口类CComm交互,调用CComm的成员函数。
2) 图像分析、显示视图:由CPicView类实现,实现图像的显示,阈值分析显示、小车操作曲线等图像相关的绘制、显示,主要与图像处理类CImage与文档CPCCommDoc文档类交互、调用CCoordinate、CGreyPic、CFG_DIB等几个类的成员函数。
数据显示视图:由CMsgView类实现,实现图像数据,以及一些消息提示信息的显示,主要与串口操作CComm类(接收数据显示)与CPCCommDoc文档类交互。

