第十届“飞思卡尔”杯全国大学生
智能汽车竞赛
技 术 报 告
学 校:安徽科技学院
队伍名称:摄像头一队
参赛队员:....
带队教师:
....
- 1 -
关于技术报告和研究论文使用授权的说明 本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名: 陈超 陈康迪 葛朋朋
带队教师签名: 徐朝胜
闫改珍
日 期:2015.7.28
目 录
第一章 引言 ................................................................. - 4 -
1.1 智能车研究背景 ....................................................... - 4 -
1.2飞思卡尔智能车竞赛介绍 ................................................ - 4 -
1.3章节总述 ............................................................. - 5 -
第二章 设计概览 ............................................................. - 6 -
2.1整车设计思路 ........................................................ - 6 -
2.2车模整体造型 ........................................................ - 6 -
2.3智能车软件设计 ....................................................... - 7 -
第三章 小车的机械设计 ....................................................... - 8 -
3.1 舵机安装 ............................................................ - 8 -
3.2 转向轮调整 .......................................................... - 8 -
3.3车体重心调整 ........................................................ - 10 -
第四章 硬件电路设计 ........................................................ - 11 -
4.1电源设计 ........................................................... - 11 -
4.2摄像头的选择 ....................................................... - 11 -
4.3各传感器的供电电路 ................................................. - 11 -
4.4驱动电路设计 ........................................................ - 12 -
4.5 速度测量模块 ....................................................... - 13 -
第五章 小车的软件设计 ...................................................... - 13 -
5.1 赛道边沿提取算法 ................................................... - 14 -
5.2 控制策略 ........................................................... - 15 -
5.2.1 经典PID控制介绍 ............................................. - 15 -
5.2.2 位置式PID算法 ............................................... - 16 -
5.2.3 增量式PID算法 ............................................... - 17 -
5.3 智能车的速度控制算法 ............................................... - 18 -
第六章 调试工具 ............................................................ - 18 -
6.1摄像头调试软件 ..................................................... - 18 -
6.2 编译开发环境 ....................................................... - 19 -
6.3 串口调试工具 ....................................................... - 20 -
6.4模拟示波器界面 ..................................................... - 20 -
第七章 车模参数与总结致谢 .................................................. - 21 -
7.1 车模规格 ........................................................... - 21 -
7.2 总结与致谢 ......................................................... - 21 - 参考文献 ................................................................... - 22 - 附录:部分代码 ............................................................. - 23 -
第一章 引言
1.1 智能车研究背景
全国大学生智能汽车竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。 本竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。
本文讨论以OV7620摄像头为路径探测传感器的路径识别算法和以舵机为转向的控制算法的设计与开发,主要研究摄像头的道路检测方法、初步路径识别算法以飞思卡尔公司S128芯片为核心的自动控制,以及由此而得出的控速与转向方法。
智能小车,也称轮式机器人,是一种以汽车电子为背景,涵盖控制、模式识别、传感技术、电子、电气、计算机、机械等多科学的科技创意性设计,一般主要路径识别、速度采集、角度控制及车速控制等模块组成。一般而言,智能车系统要求小车在白色的场地上,通过控制小车的转向角和车速,使小车能自动地沿着一条任意给定的黑色带状引导线行驶。
1.2飞思卡尔智能车竞赛介绍
飞思卡尔公司开发嵌入式解决方案的历史可追溯到50多年前,现在,已发展成为在20多个国家设有业务机构,拥有 20,000多名员工的实力强大的独立企业。
飞思卡尔公司专门为汽车、消费电子、工业品、网络和无线应用提供“大脑”。他们无比丰富的电源管理解决方案、微处理器、微控制器、传感器、射频半导体、模块与混合信号电路及软件技术已嵌入在全球使用的各种产品中。并拥有雄厚的知识产权,其中包括多项专利。
为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革,受教育部高等教育司委托,由教育部高等自动化专业教学指导分委员会(以下简称自动化分教指委)主办全国大学生智能汽车竞赛。该竞赛以智能汽车为研究对象的创
意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神, 为优秀人才的脱颖而出创造条件。
该竞赛由竞赛秘书处为各参赛队提供/购置规定范围内的标准硬软件技术平台,竞赛过程包括理论设计、实际制 作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,保证竞赛向健康、普及,持续的方向发展。
全国大学生智能汽车竞赛一般在每年的10月份公布次年竞赛的题目和组织方式,并开始接受报名,次年的3月份进行相关技术培训,7月份进行分赛区竞赛,8月份进行全国总决赛。
1.3章节总述
本文共把章节安排如下:
第1章:引言、比赛背景介绍和章节概述。
第2章:设计概览、简述了设计的思路和设计方法。
第3章:机械结构设计与调整,详细描述车模机械结构的安装方式。
第4章:硬件电路设计,详细描述了硬件电路相关的包括单片机、电源、电机驱动、传感器、无线等各模块的内容。
第5章:软件系统设计,详细描述软件系统的理论分析与程序设计。
第6章:开发工具的使用和调试过程,主要介绍了codewarrior IDE作为系统的开发环境的使用以及调试的相关内容。
第7章:总结与参数说明,总结了在本届大赛当中所取得的成绩与不足之处,列出了车模的参数。
第二章 设计概览
2.1整车设计思路
智能车主要由三个部分组成:检测系统,控制决策系统,动力系统。其中检测系统采用CMOS数字摄像头ov7620,控制决策系统采用S128作为主控芯片,动力系统主要控制舵机的转角和直流电机的转速。整体的流程为,通过视觉传感器来检测前方的赛道信息,并将赛道信息发送给单片机。
同时,通过光电编码器构成的反馈渠道将车体的行驶速度信息传送给主控单片机。根据所取得的赛道信息和车体当前的速度信息,由主控单片机做出决策,并通过PWM信号控制直流电机和舵机进行相应动作,从而实现车体的转向控制和速度控制。
2.2车模整体造型
我们车模的整体设计简洁,轻便,可靠美观。如下图:
2.3智能车软件设计
系统硬件对于赛车来说是最基础的部分,软件算法则是赛车的核心部分。首先,赛车系统通过图像采样处理模块获取前方赛道的图像数据,同时通过速度传感器模块实时获取赛车的速度。然后S128利用边缘检测方法从图像数据中提取赛道黑线,求得赛车于黑线位置的偏差,接着采用PID 方法对舵机进行反馈控制,并在PID算法的基础上,整合加入模糊控制算法,有利于对小车系统的非线性特性因素的控制。
最终赛车根据检测到的速度,结合我们的速度控制策略,对赛车速度不断进行恰当的控制调整,使赛车在符合比赛规则情况下沿赛道快速前进。
第三章 小车的机械设计
良好的机械结构将直接影响小车的结构稳定,和车模的高速时的性能。模型车的机械机构和组装形式是整个模型车身的基础,机械结构的好坏对智能车的运行速度有直接的影响。经过大量的实验经验可以看出,机械结构决定了智能车的上限速度,而软件算法的优化则是使车速不断接近这个上线速度,软件算法只有在精细的机械结构上才能够更好的提高智能车的整体性能。
3.1 舵机安装
舵机转向是整个控制系统中延迟较大的一个环节,为了减小此时间常数,通过改变舵机的安装位置,降低舵机的中心,将舵机的安装尽量低,而并非改变舵机本身结构的方法可以提高舵机的响应速度。分析舵机控制转向轮转向的原理可以发现,在相同的舵机转向条件下,转向连杆在舵机一端的连接点离舵机轴心距离越远,转向轮转向变化越快。舵机安装如下:
3.2 转向轮调整
轮定位包括主销后倾角、主销内倾角、前轮外倾角和前轮前束四个内容。车轮定位的作用是使汽车保持稳定的直线行驶和转向轻便,并减少汽车在行驶中轮胎和转向机件的磨损。
从车前后方向看轮胎时,主销轴向车身内侧倾斜,该角度称为主销内倾角。当车轮以主销为中心回转时,车轮的最低点将陷入路面以下,但实际上车轮下边缘不可能陷入路面以下,而是将转向车轮连同整个汽车前部向上抬起一个相应的高度,这样汽车本身的重力有使转向车轮回复到原来中间位置的因而舵机复位容易。
此外,主销内倾角还使得主销轴线与路面交点到车轮中心平面与地面交线的距离减小,从而减小转向时舵机的拉力,使转向操纵轻便,同时也可减少从转向轮传到舵机上的冲击力。但主销内倾角也不宜过大,否则加速了轮胎的磨损。
从前后方向看车轮时,轮胎并非垂直安装,而是稍微倾倒呈现“八”字形张开,称为负外倾,而朝反方向张开时称正外倾。前轮外倾角对汽车的转弯性能有直接影响,它的作用是提高前轮的转向安全性和转向操纵的轻便性。前轮外倾角俗称“外八字”,如果车轮垂直地面一旦满载就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。所以事先将车轮校偏一个外八字角度,这个角度约在1°左右。
脚尖向内,所谓“内八字脚”的意思,指的是左右前轮分别向内。采用这种结构目的是修正上述前轮外倾角引起的车轮向外侧转动。如前所述,由于有外倾,舵机转向变得容易。另一方面,由于车轮倾斜,左右前轮分别向外侧转动,为了修正这个问题,如果左右两轮带有向内的角度,则正负为零,左右两轮可保持直线行进,减少轮胎磨损。
3.3车体重心调整
车体重心位置对赛车加减速性能、转向性能和稳定性都有较大影响。重心调整主要包括重心高度和前后位置的调整。理论上,赛车重心越低稳定性越好。因此除了摄像头装得稍高以外,其他各个部件的安装高度都很低。除此之外,车辆重心前后方向的调整,对赛车行驶性能也有很大的影响。根据车辆运动学理论,车身重心前移,会增加转向,但降低转向的灵敏度(因为大部分重量压在前轮,转向负载增大),同时降低后轮的抓地力,影响加减速性能;重心后移,会减少转向,但增大转向灵敏度,后轮抓地力也会增加,提高加减速性能。因此,确定合适的车体重心,让车模更加适应比赛赛道是很关键的。今年我们赛车在车体中心位置上有了很大改革,将摄像头安装在车体靠后位置,这样使得赛车的重心后移,极大地增加了赛车的转向灵活度。
第四章 硬件电路设计
4.1电源设计
小车电源系统如下图所示。
4.2摄像头的选择
市场上容易买到的摄像头有 PC 用的 USB 摄像头,安防系统上使用的模拟输 出的单板摄像头,以及数字输出的摄像头模块和感光芯片。若使用 USB 摄像头,虽然价格低廉,但是需要增加 USB 接口芯片,并需要 充分了解其内部协议,增加了实现的复杂度。因而不考虑使用 USB 摄像头。若使用模拟输出的摄像头,可采用专用的视频处理芯片对信号进行数字化。例如,可以使用 LM1881M 对 PAL 制模拟信号实现行、场同步信号分离。
可以使 用专用的视频 A/D 转换器,如 XRD4460A,对模拟信号进行采集。因为多用于安防系统,模拟摄像头的成像质量好,边沿锐利,对比度高。使用模拟摄像头带来的问题是需要增加额外的硬件电路,容易受外界的干扰,因而对电路设计的要求也相对高一些若使用数转换,直接输出量化的图像信号,不需要再增加额外的硬件设备, 简化了字输出的摄像头,则可以由感光芯片中的处理器预先进行 A/D硬件设 计,减轻了重量,提高了设计的可靠性。和模拟摄像头相比,数字摄像头的重 量相差不大,而与 DSC 的接口更简单,使用起来更为方便。综合上面的分析,我们选择数字摄像头。
4.3各传感器的供电电路
我们选用的测速编码器需要使用3.3V供电,故需要通过线性稳压芯片为其 提供一个3.3V的电源。
4.4驱动电路设计
我们用两个半桥电路构成h全桥驱动电机正反转。BTS7960这款芯片非常适合电机驱动。BTS7960 是英飞凌公司制造的大电流电机驱动芯片,其最大电流为 43A,使用 2 片 BTS7960 可以组成一个 H 桥。我们共使用了 4 个 I/O 端口控制 4 片 BTS7960 来驱动 C 车的两个电机,可以实现电机的正、反转控制。电路如图:
4.5 速度测量模块
为了使得赛车能够平稳地沿着赛道运行,需要控制车速,使赛车在急转弯时速度不至过快而冲出赛道。通过控制驱动电机上的平均电压可以控制车速,但是如果开环控制电机转速,会受很多因素影响,例如电池电压、电机传动摩擦力、道路摩擦力和前轮转向角度等。这些因素会造成赛车运行不稳定。通过速度检测,对车模速度进行闭环反馈控制,即可消除上述各种因素的影响,使得车模运行得更稳定。
车速检测的方式有很多种,例如用测速发电机、转角编码盘、反射式光电检测、透射式光电检测和霍尔传感器检测。经过对去年测速方案和其它学校方案的比较,本次设计中速度传感器采用的是OMRON公司生产的E6A2-CS100型光电编码器。它由5-12V的直流供电,速度传感器用螺钉固定在塑料片上,塑料片固定在后轮支架上,这样固定好之后,就有了较高的稳定性。速度传感器通过后轮轴上的齿轮与电机相连,车轮每转一圈,速度传感器转过2.75圈。这样能够很好的稳定工作,且能很准确的得到电机的转速,比较可靠。
第五章 小车的软件设计
在编写程序过程中,为了便于调试和调用,本文将底层函数都以模块的方式封装起来,在模块中完成系统的初始化,赛道的识别,速度控制和电机控制。这样各个模块相对独立、结构清晰,便于理解,而且有利于后期修改。为了减轻单片机的处理任务,提高智能车控制的实时准确程度,本文对程序作了优化,避免了很多不必要的运算。系统框图如图:
5.1 赛道边沿提取算法
提取赛道边沿的原则是在保证准确性的前提下提高运算速度,并具有较好的环境适应能力。本文使用的双边沿提取算法的核心为:边缘检测算法。由于白板的灰度值很大,黑线的灰度值很小,所以会检测到一个下降沿的跳变,记录下跳变沿发生时的列号,就能确定出黑线的位置。
摄像头组的核心部分为左右边线的提取,从而推算出中心线的位置,引导车子的行进方向。我们使用了ov7620这款数字摄像头,返回的是灰度图像,远方图像较模糊,难以提取黑线。所以我们使用了边沿锐化算法,根据一定的阈值,对返回的灰度图像进行遍历,运算处理,得到反映图像边沿的二值图像,远方的信息也能较好地得到,再进行左右边线的提取。
只需设定好跳变的阈值,就可以比较准确的检测出黑色引导线。因为一幅图像白板与黑线的灰度值相对差值较大,这样可以减轻环境光线对边沿检测的影响,从而使智能车能够适应各种赛道环境。通过多次调试可以找出适宜的阀值大小。
双边沿提取的思路是:采用由近到远的搜索方式,搜索图像的有效边沿和无效边沿,找到左右边线,以黑线的位置为基准建立搜索窗口,然后分别在窗口内继续寻找双边线。
5.2 控制策略
智能车的车速主要采用增量式PID控制和位置式PD控制,将模糊控制与PID控制相结合,使智能车能够在赛道上平稳快速的行驶。 5.2.1 经典PID控制介绍
在工程实际中,应用最为广泛的调节控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器结构简单,稳定性好、工作可靠、调节方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能通过有效的测量手段来获取即不能得到精确的数学模型时,系统控制器的结构和参数必须依靠现场调试和经验来确定,这时应用PID控制技术最为方便。PID控制器是一种线性控制器,它根据给定值与实际输出值之间形成偏差,将偏差的比例(P)、
积分(I)、微分(D)通过线性组合构成控制量,对被控对象进行控制。 PID控制原理图如下
:
单位反馈e代表理想输入与实际输出的偏差,将偏差信号e送入控制器,控制器算出偏差信号e的微分值和积分值,将计算出来的微分值和积分值与原来的误差信号e进行线性组合,得到输出量u。计算公式如公式(4-1)所示。
1de(t)
(4-1) u(t)KPe(t)e(t)dtTD
Tidt
其中Kp、Ki、Kd分别成为比例系数、积分系数、微分系数;r(t)、 e(t) 、u(t)分别为控制器的输入信号、偏差信号、输出信号。
在PID控制系统中,比例调节是最简单的调节方式,它能够快速、无滞后的是被控参数稳定在给定值附近,并且能及时克服扰动干扰,一般增大比例系数Kp可以减小上升时间,但比例控制不能消除稳态误差,并且比例系数Kp过大时会导致系统不稳定。 5.2.2 位置式PID算法
在计算机控制系统中,使用的是数字PID控制器。数字PID控制算法可以分为位置式PID和增量式PID控制算法。
由于计算机控制是一种采样控制,它不能像模拟控制那样连续输出控制量进行连续控制,而只能根据采样时刻的偏差计算控制量,数字PID控制需要将微分项和积分项进行离散化处理。离散化处理方法为:采样周期为T,采样序号为k,则离散时间kT对应着连续时间t,得到离散化的PID表达式由公式(4-2)给出:
T
u(k)KPe(k)
TI
e(j)
j0
n
TD
e(k)e(k1)T (4-2)
其中,u(k) — 第K次采样时微机输出;
e(k) — 第K次采样时的偏差值; e(k1)— 第K-1次采样时的偏差值。
位置式PID控制是将输出量u(k)直接作用于执行结构,u(k)的值与执行机构的位置时一一对应的。由于位置式PID每次输出都与过去的状态有关,计算时要对ek进行累加,工作量大,并且当计算机出现故障时,输出量u(k)变化幅度很大,从而引起执行机构位置的大幅度变化,很有可能造成严重的生产事故,不能用于实际的生产。 5.2.3 增量式PID算法
增量式PID控制是将控制量的增量△u(k)作为数字控制器的输出,控制器的第k-1个采样时刻的输出值由公式(4-3)给出:
Tu(k1)Kp{e(k1)Ti
Td
[e(k1)e(k2)]}T (4-3) e(j)+
k1j0
将式(4-2)与式(4-3)相减并整理得,可以的到增量式PID控制器的增量△u(k),△u(k)由公式(4-4)给出:错误!未找到引用源。 (4-4)
KiKp
T
Ti积分系数; Td
T微分系数。
式中:
KdKp
此控制器输出的控制量的增量Δu(k)与采样周期、比例系数、积分时间常数和微分时间常数有关。当计算机控制系统采用恒定的采样周期T,确定KP、Ki、Kd,则只需要使用前后三次测量的偏差值,就可以求出控制量。增量式PID控制算法比位置式PID控制算法计算量小,在实际中应用广泛。
5.3 智能车的速度控制算法
智能车速度控制系统以K60单片机为控制系统的核心,由单片机给电机一个给定速度即理论速度,建立模糊PID控制器,利用模糊PID控制器来控制电机的转速,即控制智能车的实际速度。再利用光电编码器来测量智能车的实际车速,
并将实际车速反馈给模糊PID控制器,形成闭环负反馈回路。具体程序框架图如下:
第六章 调试工具
对于摄像头队而言,对图像的提取的处理无疑是一个很重要的环节,为了更好更准备的提取和处理黑线,我们开发了一个查看摄像头传回来图像的上位机。它能够将摄像头传回来的数据还原到真实的图像,以便于我们看到摄像头工作的情况,及时发现和处理摄像头方面的问题。该上位机的工作界面如下:
6.1摄像头调试软件
6.2 编译开发环境
对于 S128处理器的编程开发,使用开发工具:CodeWarrior 10.1(以下简称 CW10.1),它提供了高度可视化操作及自动创建复杂嵌入式系统应用的功能,编辑界面十分友好,可以对程序的阅读与开发带来很多便利。但正是因为它有如此强大的功能,所以运行时需要占用 PC 机更多的资源,包括软件启动在内的很多操作都执行的很慢,而且不具有变量实时查看功能,不利于系统的在线调试。
6.3 串口调试工具
由于模型车在跑道上实际运行时都处于高速运行状态,调试人员不可能随时跟着智能车进行观察。因此,要选用方便易用的蓝牙传输方式传送数据给上位机,调试人员就能在上位机上监视智能车的运行状况,方便地进行离线数据分析。蓝牙模块发挥的作用是:将智能车采集的图像、处理得到的双边线、中心线、车速和输出给电机的PWM波占空比等数据通过蓝牙模块发送到上位机上。此蓝牙模块可在10米内可靠传输数据。
6.4模拟示波器界面
第七章 车模参数与总结致谢
7.2 总结与致谢
本届比赛较以往而言,难度大大增加,增加了直角弯,中心黑色线,障碍物,还有灯塔,关键是预赛除了坡道之外所有的难度都有,在比赛是稍微的不注意就有可能死在各种难度上,所以本届比赛重点看的是车子的稳定性,只有在稳定性较好的基础上,再去处理各种难度才可以是车子跑的又快又稳;增加了比赛的难度有利于进一步提高选手的算法分析应用能力,这或许是以后比赛的一个重点所在。
历经沧桑,飞思卡尔智能车比赛已举行了十届了,回顾这几年的技术发展,每一年都有着很大的创新,一年又一年的不断地提高选手的能力,从第一年以光电车为主,到第二年摄像头车成绩遥遥领先,到第三年激光管车的出现,再到第五年电磁车的出现,每一个新的检测方法的出现都使车速提升到一个新的高度。虽然每年的赛道元素千变万化,但始终不变的是选手们对车子的热血激情;车因此不仅需要做到很好的路径优化,更重要的是车模的稳定性,因此调整车模的机械结构使其更加稳定花费了我们大量的时间。相信在不久的将来,车模的形态还会出现很大的改变,只有创新才会有进步。
这个比赛过程离不开学院、老师和学长们的支持,没有学院领导的重视,老师的悉心指导,学长们的热心帮助,我们不会有今天的成绩。感谢一路走来的队友,感谢一路陪伴的学习学妹们,感谢所有为飞思卡尔智能车做出努力的人们,感谢所有为安科智能车做出贡献的小伙伴。同时我要重点感谢我们的徐老师,他和我们一起坚持,熬夜;每次当我们遇到问题是他总是能够给我们悉心的指导和建议,同事他也不断地给我们以鼓励和生活上的照顾,也是我们最好的朋友。
参考文献
[1] 谭浩强著.C程序设计[M].北京:清华大学出版社,2003.
[2] 邵贝贝.单片机嵌入式应用的在线开发方法[M].北京.清华大学出版
社.2004.
[3] 阎石.数字电子技术基础[M]. 北京: 高等教育出版社. 2006.
[4] 贾秀江,李颢. 摄像头黑线识别算法和赛车行驶控制策略. 电子产品世界. 2007, 5(5):146-147
[5] 刘进、齐晓慧、李永科、基于视觉的智能车模糊PID控制算法.兵工自动化.2008,27(10)
[6] 卓晴、黄开胜,邵贝贝.学做智能车——挑战“飞思卡尔”杯.北京航空航天大学出版社.2007,3
[7]夏陆毅,电路原理图与电路板设计教程protel 99se[M],北京希望电子出版社,2002.6
[8]陈益飞,单片机原理及应用技术[M],国防工业出版社,2011
附录:部分代码
void TaskStart(void *pdata) {
INT8U err;
unsigned char i=0; unsigned char j;
unsigned char *pucTemp;
unsigned char temp_index,find_ok_hang; unsigned char summation;
unsigned char temp_i,tempFlag; unsigned char b_counter ; unsigned char n_counter;
unsigned char temp_xcs_maxphoto =xcs_maxphoto; //135 unsigned char int16sTemp1,int8sTemp,int16sTemp2; unsigned char temp_num; unsigned char NEW_IMAGE;
unsigned char sDistanceToPrevRowPos; //黑块距离上帧基距离 int TmpLeftStart, TmpLeftEnd, TmpRightStart, TmpRightEnd; int left,right;
Read_AD_6(); //读取滑动变阻器的值 G_MAX_PHOTO_YUZHI =(sensor_ad[6])/20;; temp_xcs_maxphoto= G_MAX_PHOTO_YUZHI;
//RTICTL=0x4f; // 实时中断控制寄存器
// CRGINT_RTIE=1; // 实时中断控制寄存器 CRGINT_RTIE=1;打开中断 =0关闭
//---------------------将数组的地址装入指针数组---------- for(i=0;i
p_addr_Buffer1[i] = &uca_Buffer1[i]; }
for(i=0;i
PosStore1[i]=IMAGE_COLUMN/2; //初始化黑线位置数组 两组 一组用于存放上一场 一组存放本场 默认是中间值 IMAGE_COLUMN/2 PosStore2[i]=PosStore1[i];
BlockSelectedIndex[i] = VIDEO_INIT_DATA; //初始化黑块个数 和 黑线在黑块中的索引
LINE_NFO_REC_PRE[i].i = IMAGE_COLUMN/2; LINE_NFO_REC_PRE[i].num =0;
LINE_NFO_REC[i].rec[0].i = IMAGE_COLUMN/2; }
LINE_NFO_PRE_F_END = ADJACENCY_FRAME_BASELINES_LIMIT;//初始化得偏差 printp(uart_putchar,"starting go..............\n");
TFLG1_C0F=1; // 清行中断标志 TFLG1_C1F=1; // 清场中断标志 TIE_C0I = 1; TIE_C1I = 1;
for(;;) //主循环 {
OSSemPend(SemPhoMake01,0,&err); i =0;
find_ok_hang= 0;//表示假设没有找到第一个有效基行 1 表示找到 ValidBottomRow = VIDEO_INIT_DATA;//首先假设是场无效的 ValidTopRow =0 ;//假设开始的最后一个位置是0 while(heixian
if(i
{ //0 1 2 3 4 5 6 temp_index = i;
pucTemp = p_addr_Buffer1[temp_index]; b_counter = 0;// 黑点块得索引 n_counter = 0;//黑点块得黑点个数
LINE_NFO_REC[temp_index].mul = 0; //表示本行没有黑点块
LINE_NFO_REC[temp_index].rec[2].num =0;//表示本行黑点没有异常 BlockSelectedIndex[i] = VIDEO_INIT_DATA; //初始化黑块个数 和 黑线在黑块中的索引 VIDEO_INIT_DATA =251
---------------------start---------------------------
//----先找到最左面和最最右面的点的位置---------------------- for(j=0; j
//全白是大数 全黑是最小值 故而 1是白 0是黑 if(*(pucTemp+j)> temp_xcs_maxphoto) //说明是白 {
G_a =j; G_a_back=j; break; } }
for(j=IMAGE_COLUMN-2; j>2; j=j-2)//,pucTemp1++j++ {
//全白是大数 全黑是最小值 故而 1是白 0是黑 if(*(pucTemp+j)> temp_xcs_maxphoto) //说明是 {
G_b =j;
G_b_back =j; break; }
}
for(j=LINE_NFO_REC[i].rec[0].i;j>3;j-=3) {
if(*(pucTemp+j)
G_a =j;
break; } }
for(j=LINE_NFO_REC[i].rec[0].i;j
if(*(pucTemp+j)
G_b =j; } } {
TmpLeftStart =(G_b+G_a)/2; //新的值 TmpRightStart =0; TmpRightEnd = IMAGE_COLUMN ;
if(LINE_NFO_REC[i].rec[0].i >=20&&LINE_NFO_REC[i].rec[0].i =20
}
for(j=TmpLeftEnd;j>(LINE_NFO_REC[i].rec[0].i)-20+2;j-=2) {
if(*(pucTemp+j)
{
// G_b= TmpRightEnd =j; right= j;
break; } }
if(abs(TmpRightStart- TmpRightEnd)
G_a= TmpRightStart; G_b= TmpRightEnd; }
if(abs(left- right)
find_ok_hang =abs(left- right); if(abs(left-TmpLeftStart)
for(j=left;j>2;j-=2) {
if(*(pucTemp+j)
{
find_ok_hang++; } } }
if( abs(right -TmpLeftEnd)
for(j=right;j
if(*(pucTemp+j)
if(find_ok_hang
G_a= left; G_b= right; }
}
} // if(abs(LINE_NFO_REC[i].rec[0].i -
TmpLeftStart)>=20&&LINE_NFO_REC[i].rec[0].i >=20&&LINE_NFO_REC[i].rec[0].i
if(G_a==G_b) {
if(G_a >=30&&G_a
TmpRightStart =0; TmpRightEnd =0;
for(j=G_a;j
if(*(pucTemp+j)
{
TmpRightStart+=2; } }
for(j=G_a;j>=G_a-15;j-=2) {
if(*(pucTemp+j)
// G_b= TmpRightEnd =j; TmpRightEnd +=2; } }
if(TmpRightStart+TmpRightEnd>=15) //表示可以 是黑点块 20 {
LINE_NFO_REC[i].rec[2].num = IMAGE_COLUMN;//表示黑了一片 }
} // if(G_a >=30&&G_a
// LINE_NFO_REC[temp_index].mul = 1;
LINE_NFO_REC[temp_index].rec[0].i =(G_a+G_b)/2; LINE_NFO_REC[temp_index].rec[0].num = abs(G_a-G_b);; i++;
} //end if(i
OSSemPost(SemPhotGet); //发送给控制任务可以开始控制任务了。 i=0;
} //end for(;;) //主循环
第十届“飞思卡尔”杯全国大学生
智能汽车竞赛
技 术 报 告
学 校:安徽科技学院
队伍名称:摄像头一队
参赛队员:....
带队教师:
....
- 1 -
关于技术报告和研究论文使用授权的说明 本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名: 陈超 陈康迪 葛朋朋
带队教师签名: 徐朝胜
闫改珍
日 期:2015.7.28
目 录
第一章 引言 ................................................................. - 4 -
1.1 智能车研究背景 ....................................................... - 4 -
1.2飞思卡尔智能车竞赛介绍 ................................................ - 4 -
1.3章节总述 ............................................................. - 5 -
第二章 设计概览 ............................................................. - 6 -
2.1整车设计思路 ........................................................ - 6 -
2.2车模整体造型 ........................................................ - 6 -
2.3智能车软件设计 ....................................................... - 7 -
第三章 小车的机械设计 ....................................................... - 8 -
3.1 舵机安装 ............................................................ - 8 -
3.2 转向轮调整 .......................................................... - 8 -
3.3车体重心调整 ........................................................ - 10 -
第四章 硬件电路设计 ........................................................ - 11 -
4.1电源设计 ........................................................... - 11 -
4.2摄像头的选择 ....................................................... - 11 -
4.3各传感器的供电电路 ................................................. - 11 -
4.4驱动电路设计 ........................................................ - 12 -
4.5 速度测量模块 ....................................................... - 13 -
第五章 小车的软件设计 ...................................................... - 13 -
5.1 赛道边沿提取算法 ................................................... - 14 -
5.2 控制策略 ........................................................... - 15 -
5.2.1 经典PID控制介绍 ............................................. - 15 -
5.2.2 位置式PID算法 ............................................... - 16 -
5.2.3 增量式PID算法 ............................................... - 17 -
5.3 智能车的速度控制算法 ............................................... - 18 -
第六章 调试工具 ............................................................ - 18 -
6.1摄像头调试软件 ..................................................... - 18 -
6.2 编译开发环境 ....................................................... - 19 -
6.3 串口调试工具 ....................................................... - 20 -
6.4模拟示波器界面 ..................................................... - 20 -
第七章 车模参数与总结致谢 .................................................. - 21 -
7.1 车模规格 ........................................................... - 21 -
7.2 总结与致谢 ......................................................... - 21 - 参考文献 ................................................................... - 22 - 附录:部分代码 ............................................................. - 23 -
第一章 引言
1.1 智能车研究背景
全国大学生智能汽车竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。 本竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。
本文讨论以OV7620摄像头为路径探测传感器的路径识别算法和以舵机为转向的控制算法的设计与开发,主要研究摄像头的道路检测方法、初步路径识别算法以飞思卡尔公司S128芯片为核心的自动控制,以及由此而得出的控速与转向方法。
智能小车,也称轮式机器人,是一种以汽车电子为背景,涵盖控制、模式识别、传感技术、电子、电气、计算机、机械等多科学的科技创意性设计,一般主要路径识别、速度采集、角度控制及车速控制等模块组成。一般而言,智能车系统要求小车在白色的场地上,通过控制小车的转向角和车速,使小车能自动地沿着一条任意给定的黑色带状引导线行驶。
1.2飞思卡尔智能车竞赛介绍
飞思卡尔公司开发嵌入式解决方案的历史可追溯到50多年前,现在,已发展成为在20多个国家设有业务机构,拥有 20,000多名员工的实力强大的独立企业。
飞思卡尔公司专门为汽车、消费电子、工业品、网络和无线应用提供“大脑”。他们无比丰富的电源管理解决方案、微处理器、微控制器、传感器、射频半导体、模块与混合信号电路及软件技术已嵌入在全球使用的各种产品中。并拥有雄厚的知识产权,其中包括多项专利。
为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革,受教育部高等教育司委托,由教育部高等自动化专业教学指导分委员会(以下简称自动化分教指委)主办全国大学生智能汽车竞赛。该竞赛以智能汽车为研究对象的创
意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神, 为优秀人才的脱颖而出创造条件。
该竞赛由竞赛秘书处为各参赛队提供/购置规定范围内的标准硬软件技术平台,竞赛过程包括理论设计、实际制 作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,保证竞赛向健康、普及,持续的方向发展。
全国大学生智能汽车竞赛一般在每年的10月份公布次年竞赛的题目和组织方式,并开始接受报名,次年的3月份进行相关技术培训,7月份进行分赛区竞赛,8月份进行全国总决赛。
1.3章节总述
本文共把章节安排如下:
第1章:引言、比赛背景介绍和章节概述。
第2章:设计概览、简述了设计的思路和设计方法。
第3章:机械结构设计与调整,详细描述车模机械结构的安装方式。
第4章:硬件电路设计,详细描述了硬件电路相关的包括单片机、电源、电机驱动、传感器、无线等各模块的内容。
第5章:软件系统设计,详细描述软件系统的理论分析与程序设计。
第6章:开发工具的使用和调试过程,主要介绍了codewarrior IDE作为系统的开发环境的使用以及调试的相关内容。
第7章:总结与参数说明,总结了在本届大赛当中所取得的成绩与不足之处,列出了车模的参数。
第二章 设计概览
2.1整车设计思路
智能车主要由三个部分组成:检测系统,控制决策系统,动力系统。其中检测系统采用CMOS数字摄像头ov7620,控制决策系统采用S128作为主控芯片,动力系统主要控制舵机的转角和直流电机的转速。整体的流程为,通过视觉传感器来检测前方的赛道信息,并将赛道信息发送给单片机。
同时,通过光电编码器构成的反馈渠道将车体的行驶速度信息传送给主控单片机。根据所取得的赛道信息和车体当前的速度信息,由主控单片机做出决策,并通过PWM信号控制直流电机和舵机进行相应动作,从而实现车体的转向控制和速度控制。
2.2车模整体造型
我们车模的整体设计简洁,轻便,可靠美观。如下图:
2.3智能车软件设计
系统硬件对于赛车来说是最基础的部分,软件算法则是赛车的核心部分。首先,赛车系统通过图像采样处理模块获取前方赛道的图像数据,同时通过速度传感器模块实时获取赛车的速度。然后S128利用边缘检测方法从图像数据中提取赛道黑线,求得赛车于黑线位置的偏差,接着采用PID 方法对舵机进行反馈控制,并在PID算法的基础上,整合加入模糊控制算法,有利于对小车系统的非线性特性因素的控制。
最终赛车根据检测到的速度,结合我们的速度控制策略,对赛车速度不断进行恰当的控制调整,使赛车在符合比赛规则情况下沿赛道快速前进。
第三章 小车的机械设计
良好的机械结构将直接影响小车的结构稳定,和车模的高速时的性能。模型车的机械机构和组装形式是整个模型车身的基础,机械结构的好坏对智能车的运行速度有直接的影响。经过大量的实验经验可以看出,机械结构决定了智能车的上限速度,而软件算法的优化则是使车速不断接近这个上线速度,软件算法只有在精细的机械结构上才能够更好的提高智能车的整体性能。
3.1 舵机安装
舵机转向是整个控制系统中延迟较大的一个环节,为了减小此时间常数,通过改变舵机的安装位置,降低舵机的中心,将舵机的安装尽量低,而并非改变舵机本身结构的方法可以提高舵机的响应速度。分析舵机控制转向轮转向的原理可以发现,在相同的舵机转向条件下,转向连杆在舵机一端的连接点离舵机轴心距离越远,转向轮转向变化越快。舵机安装如下:
3.2 转向轮调整
轮定位包括主销后倾角、主销内倾角、前轮外倾角和前轮前束四个内容。车轮定位的作用是使汽车保持稳定的直线行驶和转向轻便,并减少汽车在行驶中轮胎和转向机件的磨损。
从车前后方向看轮胎时,主销轴向车身内侧倾斜,该角度称为主销内倾角。当车轮以主销为中心回转时,车轮的最低点将陷入路面以下,但实际上车轮下边缘不可能陷入路面以下,而是将转向车轮连同整个汽车前部向上抬起一个相应的高度,这样汽车本身的重力有使转向车轮回复到原来中间位置的因而舵机复位容易。
此外,主销内倾角还使得主销轴线与路面交点到车轮中心平面与地面交线的距离减小,从而减小转向时舵机的拉力,使转向操纵轻便,同时也可减少从转向轮传到舵机上的冲击力。但主销内倾角也不宜过大,否则加速了轮胎的磨损。
从前后方向看车轮时,轮胎并非垂直安装,而是稍微倾倒呈现“八”字形张开,称为负外倾,而朝反方向张开时称正外倾。前轮外倾角对汽车的转弯性能有直接影响,它的作用是提高前轮的转向安全性和转向操纵的轻便性。前轮外倾角俗称“外八字”,如果车轮垂直地面一旦满载就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。所以事先将车轮校偏一个外八字角度,这个角度约在1°左右。
脚尖向内,所谓“内八字脚”的意思,指的是左右前轮分别向内。采用这种结构目的是修正上述前轮外倾角引起的车轮向外侧转动。如前所述,由于有外倾,舵机转向变得容易。另一方面,由于车轮倾斜,左右前轮分别向外侧转动,为了修正这个问题,如果左右两轮带有向内的角度,则正负为零,左右两轮可保持直线行进,减少轮胎磨损。
3.3车体重心调整
车体重心位置对赛车加减速性能、转向性能和稳定性都有较大影响。重心调整主要包括重心高度和前后位置的调整。理论上,赛车重心越低稳定性越好。因此除了摄像头装得稍高以外,其他各个部件的安装高度都很低。除此之外,车辆重心前后方向的调整,对赛车行驶性能也有很大的影响。根据车辆运动学理论,车身重心前移,会增加转向,但降低转向的灵敏度(因为大部分重量压在前轮,转向负载增大),同时降低后轮的抓地力,影响加减速性能;重心后移,会减少转向,但增大转向灵敏度,后轮抓地力也会增加,提高加减速性能。因此,确定合适的车体重心,让车模更加适应比赛赛道是很关键的。今年我们赛车在车体中心位置上有了很大改革,将摄像头安装在车体靠后位置,这样使得赛车的重心后移,极大地增加了赛车的转向灵活度。
第四章 硬件电路设计
4.1电源设计
小车电源系统如下图所示。
4.2摄像头的选择
市场上容易买到的摄像头有 PC 用的 USB 摄像头,安防系统上使用的模拟输 出的单板摄像头,以及数字输出的摄像头模块和感光芯片。若使用 USB 摄像头,虽然价格低廉,但是需要增加 USB 接口芯片,并需要 充分了解其内部协议,增加了实现的复杂度。因而不考虑使用 USB 摄像头。若使用模拟输出的摄像头,可采用专用的视频处理芯片对信号进行数字化。例如,可以使用 LM1881M 对 PAL 制模拟信号实现行、场同步信号分离。
可以使 用专用的视频 A/D 转换器,如 XRD4460A,对模拟信号进行采集。因为多用于安防系统,模拟摄像头的成像质量好,边沿锐利,对比度高。使用模拟摄像头带来的问题是需要增加额外的硬件电路,容易受外界的干扰,因而对电路设计的要求也相对高一些若使用数转换,直接输出量化的图像信号,不需要再增加额外的硬件设备, 简化了字输出的摄像头,则可以由感光芯片中的处理器预先进行 A/D硬件设 计,减轻了重量,提高了设计的可靠性。和模拟摄像头相比,数字摄像头的重 量相差不大,而与 DSC 的接口更简单,使用起来更为方便。综合上面的分析,我们选择数字摄像头。
4.3各传感器的供电电路
我们选用的测速编码器需要使用3.3V供电,故需要通过线性稳压芯片为其 提供一个3.3V的电源。
4.4驱动电路设计
我们用两个半桥电路构成h全桥驱动电机正反转。BTS7960这款芯片非常适合电机驱动。BTS7960 是英飞凌公司制造的大电流电机驱动芯片,其最大电流为 43A,使用 2 片 BTS7960 可以组成一个 H 桥。我们共使用了 4 个 I/O 端口控制 4 片 BTS7960 来驱动 C 车的两个电机,可以实现电机的正、反转控制。电路如图:
4.5 速度测量模块
为了使得赛车能够平稳地沿着赛道运行,需要控制车速,使赛车在急转弯时速度不至过快而冲出赛道。通过控制驱动电机上的平均电压可以控制车速,但是如果开环控制电机转速,会受很多因素影响,例如电池电压、电机传动摩擦力、道路摩擦力和前轮转向角度等。这些因素会造成赛车运行不稳定。通过速度检测,对车模速度进行闭环反馈控制,即可消除上述各种因素的影响,使得车模运行得更稳定。
车速检测的方式有很多种,例如用测速发电机、转角编码盘、反射式光电检测、透射式光电检测和霍尔传感器检测。经过对去年测速方案和其它学校方案的比较,本次设计中速度传感器采用的是OMRON公司生产的E6A2-CS100型光电编码器。它由5-12V的直流供电,速度传感器用螺钉固定在塑料片上,塑料片固定在后轮支架上,这样固定好之后,就有了较高的稳定性。速度传感器通过后轮轴上的齿轮与电机相连,车轮每转一圈,速度传感器转过2.75圈。这样能够很好的稳定工作,且能很准确的得到电机的转速,比较可靠。
第五章 小车的软件设计
在编写程序过程中,为了便于调试和调用,本文将底层函数都以模块的方式封装起来,在模块中完成系统的初始化,赛道的识别,速度控制和电机控制。这样各个模块相对独立、结构清晰,便于理解,而且有利于后期修改。为了减轻单片机的处理任务,提高智能车控制的实时准确程度,本文对程序作了优化,避免了很多不必要的运算。系统框图如图:
5.1 赛道边沿提取算法
提取赛道边沿的原则是在保证准确性的前提下提高运算速度,并具有较好的环境适应能力。本文使用的双边沿提取算法的核心为:边缘检测算法。由于白板的灰度值很大,黑线的灰度值很小,所以会检测到一个下降沿的跳变,记录下跳变沿发生时的列号,就能确定出黑线的位置。
摄像头组的核心部分为左右边线的提取,从而推算出中心线的位置,引导车子的行进方向。我们使用了ov7620这款数字摄像头,返回的是灰度图像,远方图像较模糊,难以提取黑线。所以我们使用了边沿锐化算法,根据一定的阈值,对返回的灰度图像进行遍历,运算处理,得到反映图像边沿的二值图像,远方的信息也能较好地得到,再进行左右边线的提取。
只需设定好跳变的阈值,就可以比较准确的检测出黑色引导线。因为一幅图像白板与黑线的灰度值相对差值较大,这样可以减轻环境光线对边沿检测的影响,从而使智能车能够适应各种赛道环境。通过多次调试可以找出适宜的阀值大小。
双边沿提取的思路是:采用由近到远的搜索方式,搜索图像的有效边沿和无效边沿,找到左右边线,以黑线的位置为基准建立搜索窗口,然后分别在窗口内继续寻找双边线。
5.2 控制策略
智能车的车速主要采用增量式PID控制和位置式PD控制,将模糊控制与PID控制相结合,使智能车能够在赛道上平稳快速的行驶。 5.2.1 经典PID控制介绍
在工程实际中,应用最为广泛的调节控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器结构简单,稳定性好、工作可靠、调节方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能通过有效的测量手段来获取即不能得到精确的数学模型时,系统控制器的结构和参数必须依靠现场调试和经验来确定,这时应用PID控制技术最为方便。PID控制器是一种线性控制器,它根据给定值与实际输出值之间形成偏差,将偏差的比例(P)、
积分(I)、微分(D)通过线性组合构成控制量,对被控对象进行控制。 PID控制原理图如下
:
单位反馈e代表理想输入与实际输出的偏差,将偏差信号e送入控制器,控制器算出偏差信号e的微分值和积分值,将计算出来的微分值和积分值与原来的误差信号e进行线性组合,得到输出量u。计算公式如公式(4-1)所示。
1de(t)
(4-1) u(t)KPe(t)e(t)dtTD
Tidt
其中Kp、Ki、Kd分别成为比例系数、积分系数、微分系数;r(t)、 e(t) 、u(t)分别为控制器的输入信号、偏差信号、输出信号。
在PID控制系统中,比例调节是最简单的调节方式,它能够快速、无滞后的是被控参数稳定在给定值附近,并且能及时克服扰动干扰,一般增大比例系数Kp可以减小上升时间,但比例控制不能消除稳态误差,并且比例系数Kp过大时会导致系统不稳定。 5.2.2 位置式PID算法
在计算机控制系统中,使用的是数字PID控制器。数字PID控制算法可以分为位置式PID和增量式PID控制算法。
由于计算机控制是一种采样控制,它不能像模拟控制那样连续输出控制量进行连续控制,而只能根据采样时刻的偏差计算控制量,数字PID控制需要将微分项和积分项进行离散化处理。离散化处理方法为:采样周期为T,采样序号为k,则离散时间kT对应着连续时间t,得到离散化的PID表达式由公式(4-2)给出:
T
u(k)KPe(k)
TI
e(j)
j0
n
TD
e(k)e(k1)T (4-2)
其中,u(k) — 第K次采样时微机输出;
e(k) — 第K次采样时的偏差值; e(k1)— 第K-1次采样时的偏差值。
位置式PID控制是将输出量u(k)直接作用于执行结构,u(k)的值与执行机构的位置时一一对应的。由于位置式PID每次输出都与过去的状态有关,计算时要对ek进行累加,工作量大,并且当计算机出现故障时,输出量u(k)变化幅度很大,从而引起执行机构位置的大幅度变化,很有可能造成严重的生产事故,不能用于实际的生产。 5.2.3 增量式PID算法
增量式PID控制是将控制量的增量△u(k)作为数字控制器的输出,控制器的第k-1个采样时刻的输出值由公式(4-3)给出:
Tu(k1)Kp{e(k1)Ti
Td
[e(k1)e(k2)]}T (4-3) e(j)+
k1j0
将式(4-2)与式(4-3)相减并整理得,可以的到增量式PID控制器的增量△u(k),△u(k)由公式(4-4)给出:错误!未找到引用源。 (4-4)
KiKp
T
Ti积分系数; Td
T微分系数。
式中:
KdKp
此控制器输出的控制量的增量Δu(k)与采样周期、比例系数、积分时间常数和微分时间常数有关。当计算机控制系统采用恒定的采样周期T,确定KP、Ki、Kd,则只需要使用前后三次测量的偏差值,就可以求出控制量。增量式PID控制算法比位置式PID控制算法计算量小,在实际中应用广泛。
5.3 智能车的速度控制算法
智能车速度控制系统以K60单片机为控制系统的核心,由单片机给电机一个给定速度即理论速度,建立模糊PID控制器,利用模糊PID控制器来控制电机的转速,即控制智能车的实际速度。再利用光电编码器来测量智能车的实际车速,
并将实际车速反馈给模糊PID控制器,形成闭环负反馈回路。具体程序框架图如下:
第六章 调试工具
对于摄像头队而言,对图像的提取的处理无疑是一个很重要的环节,为了更好更准备的提取和处理黑线,我们开发了一个查看摄像头传回来图像的上位机。它能够将摄像头传回来的数据还原到真实的图像,以便于我们看到摄像头工作的情况,及时发现和处理摄像头方面的问题。该上位机的工作界面如下:
6.1摄像头调试软件
6.2 编译开发环境
对于 S128处理器的编程开发,使用开发工具:CodeWarrior 10.1(以下简称 CW10.1),它提供了高度可视化操作及自动创建复杂嵌入式系统应用的功能,编辑界面十分友好,可以对程序的阅读与开发带来很多便利。但正是因为它有如此强大的功能,所以运行时需要占用 PC 机更多的资源,包括软件启动在内的很多操作都执行的很慢,而且不具有变量实时查看功能,不利于系统的在线调试。
6.3 串口调试工具
由于模型车在跑道上实际运行时都处于高速运行状态,调试人员不可能随时跟着智能车进行观察。因此,要选用方便易用的蓝牙传输方式传送数据给上位机,调试人员就能在上位机上监视智能车的运行状况,方便地进行离线数据分析。蓝牙模块发挥的作用是:将智能车采集的图像、处理得到的双边线、中心线、车速和输出给电机的PWM波占空比等数据通过蓝牙模块发送到上位机上。此蓝牙模块可在10米内可靠传输数据。
6.4模拟示波器界面
第七章 车模参数与总结致谢
7.2 总结与致谢
本届比赛较以往而言,难度大大增加,增加了直角弯,中心黑色线,障碍物,还有灯塔,关键是预赛除了坡道之外所有的难度都有,在比赛是稍微的不注意就有可能死在各种难度上,所以本届比赛重点看的是车子的稳定性,只有在稳定性较好的基础上,再去处理各种难度才可以是车子跑的又快又稳;增加了比赛的难度有利于进一步提高选手的算法分析应用能力,这或许是以后比赛的一个重点所在。
历经沧桑,飞思卡尔智能车比赛已举行了十届了,回顾这几年的技术发展,每一年都有着很大的创新,一年又一年的不断地提高选手的能力,从第一年以光电车为主,到第二年摄像头车成绩遥遥领先,到第三年激光管车的出现,再到第五年电磁车的出现,每一个新的检测方法的出现都使车速提升到一个新的高度。虽然每年的赛道元素千变万化,但始终不变的是选手们对车子的热血激情;车因此不仅需要做到很好的路径优化,更重要的是车模的稳定性,因此调整车模的机械结构使其更加稳定花费了我们大量的时间。相信在不久的将来,车模的形态还会出现很大的改变,只有创新才会有进步。
这个比赛过程离不开学院、老师和学长们的支持,没有学院领导的重视,老师的悉心指导,学长们的热心帮助,我们不会有今天的成绩。感谢一路走来的队友,感谢一路陪伴的学习学妹们,感谢所有为飞思卡尔智能车做出努力的人们,感谢所有为安科智能车做出贡献的小伙伴。同时我要重点感谢我们的徐老师,他和我们一起坚持,熬夜;每次当我们遇到问题是他总是能够给我们悉心的指导和建议,同事他也不断地给我们以鼓励和生活上的照顾,也是我们最好的朋友。
参考文献
[1] 谭浩强著.C程序设计[M].北京:清华大学出版社,2003.
[2] 邵贝贝.单片机嵌入式应用的在线开发方法[M].北京.清华大学出版
社.2004.
[3] 阎石.数字电子技术基础[M]. 北京: 高等教育出版社. 2006.
[4] 贾秀江,李颢. 摄像头黑线识别算法和赛车行驶控制策略. 电子产品世界. 2007, 5(5):146-147
[5] 刘进、齐晓慧、李永科、基于视觉的智能车模糊PID控制算法.兵工自动化.2008,27(10)
[6] 卓晴、黄开胜,邵贝贝.学做智能车——挑战“飞思卡尔”杯.北京航空航天大学出版社.2007,3
[7]夏陆毅,电路原理图与电路板设计教程protel 99se[M],北京希望电子出版社,2002.6
[8]陈益飞,单片机原理及应用技术[M],国防工业出版社,2011
附录:部分代码
void TaskStart(void *pdata) {
INT8U err;
unsigned char i=0; unsigned char j;
unsigned char *pucTemp;
unsigned char temp_index,find_ok_hang; unsigned char summation;
unsigned char temp_i,tempFlag; unsigned char b_counter ; unsigned char n_counter;
unsigned char temp_xcs_maxphoto =xcs_maxphoto; //135 unsigned char int16sTemp1,int8sTemp,int16sTemp2; unsigned char temp_num; unsigned char NEW_IMAGE;
unsigned char sDistanceToPrevRowPos; //黑块距离上帧基距离 int TmpLeftStart, TmpLeftEnd, TmpRightStart, TmpRightEnd; int left,right;
Read_AD_6(); //读取滑动变阻器的值 G_MAX_PHOTO_YUZHI =(sensor_ad[6])/20;; temp_xcs_maxphoto= G_MAX_PHOTO_YUZHI;
//RTICTL=0x4f; // 实时中断控制寄存器
// CRGINT_RTIE=1; // 实时中断控制寄存器 CRGINT_RTIE=1;打开中断 =0关闭
//---------------------将数组的地址装入指针数组---------- for(i=0;i
p_addr_Buffer1[i] = &uca_Buffer1[i]; }
for(i=0;i
PosStore1[i]=IMAGE_COLUMN/2; //初始化黑线位置数组 两组 一组用于存放上一场 一组存放本场 默认是中间值 IMAGE_COLUMN/2 PosStore2[i]=PosStore1[i];
BlockSelectedIndex[i] = VIDEO_INIT_DATA; //初始化黑块个数 和 黑线在黑块中的索引
LINE_NFO_REC_PRE[i].i = IMAGE_COLUMN/2; LINE_NFO_REC_PRE[i].num =0;
LINE_NFO_REC[i].rec[0].i = IMAGE_COLUMN/2; }
LINE_NFO_PRE_F_END = ADJACENCY_FRAME_BASELINES_LIMIT;//初始化得偏差 printp(uart_putchar,"starting go..............\n");
TFLG1_C0F=1; // 清行中断标志 TFLG1_C1F=1; // 清场中断标志 TIE_C0I = 1; TIE_C1I = 1;
for(;;) //主循环 {
OSSemPend(SemPhoMake01,0,&err); i =0;
find_ok_hang= 0;//表示假设没有找到第一个有效基行 1 表示找到 ValidBottomRow = VIDEO_INIT_DATA;//首先假设是场无效的 ValidTopRow =0 ;//假设开始的最后一个位置是0 while(heixian
if(i
{ //0 1 2 3 4 5 6 temp_index = i;
pucTemp = p_addr_Buffer1[temp_index]; b_counter = 0;// 黑点块得索引 n_counter = 0;//黑点块得黑点个数
LINE_NFO_REC[temp_index].mul = 0; //表示本行没有黑点块
LINE_NFO_REC[temp_index].rec[2].num =0;//表示本行黑点没有异常 BlockSelectedIndex[i] = VIDEO_INIT_DATA; //初始化黑块个数 和 黑线在黑块中的索引 VIDEO_INIT_DATA =251
---------------------start---------------------------
//----先找到最左面和最最右面的点的位置---------------------- for(j=0; j
//全白是大数 全黑是最小值 故而 1是白 0是黑 if(*(pucTemp+j)> temp_xcs_maxphoto) //说明是白 {
G_a =j; G_a_back=j; break; } }
for(j=IMAGE_COLUMN-2; j>2; j=j-2)//,pucTemp1++j++ {
//全白是大数 全黑是最小值 故而 1是白 0是黑 if(*(pucTemp+j)> temp_xcs_maxphoto) //说明是 {
G_b =j;
G_b_back =j; break; }
}
for(j=LINE_NFO_REC[i].rec[0].i;j>3;j-=3) {
if(*(pucTemp+j)
G_a =j;
break; } }
for(j=LINE_NFO_REC[i].rec[0].i;j
if(*(pucTemp+j)
G_b =j; } } {
TmpLeftStart =(G_b+G_a)/2; //新的值 TmpRightStart =0; TmpRightEnd = IMAGE_COLUMN ;
if(LINE_NFO_REC[i].rec[0].i >=20&&LINE_NFO_REC[i].rec[0].i =20
}
for(j=TmpLeftEnd;j>(LINE_NFO_REC[i].rec[0].i)-20+2;j-=2) {
if(*(pucTemp+j)
{
// G_b= TmpRightEnd =j; right= j;
break; } }
if(abs(TmpRightStart- TmpRightEnd)
G_a= TmpRightStart; G_b= TmpRightEnd; }
if(abs(left- right)
find_ok_hang =abs(left- right); if(abs(left-TmpLeftStart)
for(j=left;j>2;j-=2) {
if(*(pucTemp+j)
{
find_ok_hang++; } } }
if( abs(right -TmpLeftEnd)
for(j=right;j
if(*(pucTemp+j)
if(find_ok_hang
G_a= left; G_b= right; }
}
} // if(abs(LINE_NFO_REC[i].rec[0].i -
TmpLeftStart)>=20&&LINE_NFO_REC[i].rec[0].i >=20&&LINE_NFO_REC[i].rec[0].i
if(G_a==G_b) {
if(G_a >=30&&G_a
TmpRightStart =0; TmpRightEnd =0;
for(j=G_a;j
if(*(pucTemp+j)
{
TmpRightStart+=2; } }
for(j=G_a;j>=G_a-15;j-=2) {
if(*(pucTemp+j)
// G_b= TmpRightEnd =j; TmpRightEnd +=2; } }
if(TmpRightStart+TmpRightEnd>=15) //表示可以 是黑点块 20 {
LINE_NFO_REC[i].rec[2].num = IMAGE_COLUMN;//表示黑了一片 }
} // if(G_a >=30&&G_a
// LINE_NFO_REC[temp_index].mul = 1;
LINE_NFO_REC[temp_index].rec[0].i =(G_a+G_b)/2; LINE_NFO_REC[temp_index].rec[0].num = abs(G_a-G_b);; i++;
} //end if(i
OSSemPost(SemPhotGet); //发送给控制任务可以开始控制任务了。 i=0;
} //end for(;;) //主循环