基于视频导航的智能车系统的设计与实现 The smart car system based on video navigation design and implementation 摘要 本课题以第十三届全国大学生智能车竞赛为背景,主要通过优化小车程序的算法继而提高智能车的速度和稳定性。此智能车系统是一个软硬件和机械结构组合而成的复杂系统,以“恩智浦”半导体公司生产的生产的32位单片机MK60N512ZVLQ10作为主控芯片,通过MT9V032摄像头采集回来赛道视频图像,经过图像的去噪和二值化处理后,得到清晰的灰度图像,从而提取出中心线。由于智能车本身就是一个很大的积分计算,因此为了减小软件算法的计算量,电机驱动采用PID控制算法中的PD两项进行速度的控制,将I项置为零。为了打角转向的安全及计算量简便,采用了保守策略,舵机采用PID控制算法中的P项的固定值进行控制。整个智能车系统通过主控芯片的合理控制,最终能实现“直道全速行驶,弯道安全通过”的控制。 关键词:智能车 摄像头 中心线 PID控制算法 Abstract This topic in the thirteenth session of the national college students' smart car competition as the background, main cars by optimizing the program algorithm and improve the speed and stability of the smart car. The intelligent car system is a complex system composed of hardware, software and mechanical structure. The 32-bit single-chip computer MK60N512ZVLQ10 produced by “NXP“ semiconductor company is used as the main control chip. The track video image is collected through MT9V032 camera. Because the smart car itself is a very big integral calculation, so in order to reduce the amount of calculation software algorithm, the PID control algorithm of motor drive speed control of PD two, will I set to zero. In order to ensure the safety of Angle steering and make the calculation easy, a conservative strategy is adopted. The steering gear is controlled by the fixed value of P in PID control algorithm. Through the reasonable control of the master control chip, the whole intelligent car system can finally achieve the control of “straight road full speed, safe curve through“. Key words: smart car camera center line PID control algorithm 目录 第1章 绪论 1 1.1 背景 1 1.2 智能车的研究发展现状及方向 2 1.2.1 国外研究发展现状 2 1.2.2 国内研究发展现状 3 1.2.3发展方向 3 1.3 本论文研究的主要内容 3 第二章 智能车系统总体设计 4 2.1 总体设计概述 4 2.1.1 机械系统 4 2.1.2 硬件系统 4 2.1.3 软件系统 5 2.2 总体设计框图 5 第三章 机械结构设计 6 3.1 电池位置 6 3.2 编码器安装 6 3.3 摄像头安装位置 6 3.4 硬件电路板安装 6 第四章 电路硬件设计 7 4.1 电源模块电路设计 7 4.1.1 3.3V稳压电源模块 7 4.1.2 6V稳压电源模块 8 4.1.3 12V稳压电源模块 8 4.2 重要接口模块 8 4.3 MOS管单路驱动 9 第五章 软件算法优化 10 5.1 开发工具 10 5.2 图像采集 11 5.3 图像处理 12 5.3.1 图像去噪处理 13 5.3.2 图像二值化 14 5.4 提取中心线 15 5.5 路径识别 16 5.6 直流电机控制 16 5.7 舵机控制 18 第六章 结论 20 参 考 文 献 21 致 谢 22 附 录 23 第1章 绪论 1.1 背景 随着各种各样的智能技术快速发展,越来越多的行业领域都将这些高新的技术应用上,从而使各个行业内的产品、服务等物质变得更加安全便利,继而推动各国去研究智能技术。我们都知道由于社会的发展以及汽车的普及,导致交通拥挤的现象已成为全世界范围内的困扰问题之一。全世界的快速发展都依赖着互联网、计算机等科技技术的支撑,人们生活水平不断地提高,基本每家每户都会有私家车,因此,在人们出行高峰期便会出现交通拥挤现象,为了解决此问题,许多国家纷纷研究智能汽车,即将各种先进的智能技术带到汽车领域中。智能化的汽车不仅仅是为了解决人们日常生活交通拥挤的问题,更是体现一个国家汽车技术快速提高的标志以及国家经济水平的增长。我们都看到世界到处都在不断变化着,在生活各个方面,不只是汽车被智能化了,现在各大企业集团都纷纷在研究智能技术,有研究就有成果。比如在各大商场、博览会中,我们都会遇到为人们解决问题的地图机器人;机器人餐厅也在不断出现,实现了点餐缴费、炒菜做饭、出餐的一体化;天猫、京东的智能配送机器人在每年双十一减少了企业的损失及快递员的工作压力;智能化的汽车不仅让汽车行业发生了翻天覆地的改变,还让其它行业也紧跟着发展变化。相信在不久的将来,更多的智能产品会出现在人们生活中,让生活更安全便利。 随着智能技术的发展以及人们日常生活遇到的各种交通问题,各大企业纷纷涌入智能车领域,将现代社会的计算机技术带到汽车行业中,不断加强了对智能车的研究。在20世纪初时,有一些国家已开始研究智能车技术,他们的做法是在汽车行驶的公路中间去铺设磁块,使汽车沿着公路上的磁块进行导航,这种想法在技术上是具有可行性的,但考虑到成本高昂而不利于大面积铺设等问题,他们也因此放弃了。“眼睛就像一扇窗户,打开它,你就能看到五彩斑斓的世界”。这虽是文学中所描述的,但从中我们可以知道眼睛能让你看到很多不同的东西,为何我们不能在智能技术找到一款产品或者研究一种技术去代替我们的眼睛呢?通过人们对视觉传感器的研究,发现其具有诸多优点和可行性的图像处理技术,因此,利用摄像头进行视频导航不断地被应用到智能车技术的研究中。 如果您是一名驾驶员开过车,那你会知道开车时要通过双眼去获取道路状况、道路标志、车辆数目、路口、行人等92%以上的道路环境信息。通过以上分析,我们可以想到,人类可以通过视觉去获取一些东西,那为何我们不可以通过机器视觉去获取道路环境信息进而处理识别,这样可以减少驾驶员在行驶汽车过程中因环境等因素而导致的交通事故。对于计算机技术发展还未成熟的年代,机器视觉获取的实时图像处理的计算能力是十分有限的。但随着各国研发人员对计算机技术的研究,现在的计算机技术能广泛应用到多行业和实时图像处理技术也有了很大的提高。首先,计算机技术的广泛应用体现了其技术的成熟,使得相关处理器和传感器在降价,由于价格下降,也使得更多人去研究有关图像处理的技术。其次,由于技术的成熟和传感器价格的下降,视频导航技术不仅被应用到汽车行业中,还被应用到物流、制造等行业。汽车安全辅助驾驶、无人驾驶等就是智能车视频导航的体现。我们相信再过数年后,在更多的场合都会出现智能车的身影,智能车会代替人类完成高难度及危险的工作,例如危险工作区的采样、宇宙星球探险、军事探测等。社会的发展不仅仅是GDP经济上的体现,人们生活、工作变得便捷也在其中,将智能车技术应用到各个方面会变得备受人们关注,因此,研究视频导航技术是有必要和非常有价值的。 1.2 智能车的研究发展现状及方向 如今,智能车已经成为智能交通系统的重点研究对象,各大汽车企业不断在研究无人驾驶、安全辅助等智能汽车产品。智能汽车不仅仅是在民用方面解决当今交通拥挤问题,在未来它可以应用在各个行业领域中都非常有发展前景,例如太空星际探测、危险工作区域采样、物流仓库巡逻、军事防护等等。 在20世纪,中国家家户户还在为温饱而奔波的时候,国外就已经出现无人驾驶汽车了,这样的差距不仅没有让中国气馁,反而使得中国在不断努力进步。我国研究智能车技术同发达国家相提并论是起步较晚,即使相关科学技术和研究的总体水平会略落后于发达国家,但是我们从来没有停止过智能车技术的研究。在国家人民生活水平不断提高时,为了使我国的汽车变得智能化,我国的各大高校和汽车公司也纷纷开始研究智能车技术。例如: 我国成功研制的第一辆自主驾驶轿车,型号7B.8,主要用于军事领域,其具有多种传感器等。另外在2002年,我国也开始重视智能交通系统,启动项目计划开始研究车辆安全和辅助驾驶。国家给智能车的研究提供了一个科技和经济的支持,为此,各大高校也纷纷涌现出智能化的相关专业。 在各大高校中,学校也紧跟社会进步的步伐,纷纷出现嵌入式开发、软件工程、电子信息工程等很多智能技术的相关专业,专业内的老师也不断鼓励学生去参加大学生创新创业、合泰杯、恩智浦智能车等创新项目。这些做法不仅能让学生在校学习当代社会先进潮流技术的相关知识,培养学生对智能技术的兴趣爱好,进而培养出相关技术人才。学生通过学以致用,将自己所学知识应用到各个行业领域,变得智能化起来。相信在未来,我国的智能车技术能远超于发达国家。 1.2.1 国外研究发展现状 在2000年,首届大学生智能模型车竞赛的举办方——韩国汉阳大学,是一场大学生课外科技竞赛,该竞赛需要学生自行设计硬件电路和对HCS12单片机软件开发应用,智能车系统的核心控制器由飞思卡尔公司资助。每年有100支左右高校队伍参赛,他们要使用组委会提供的三件套,分别为车模、可充电式电池和直流电机,然后利用三件套和结合学科知识去创作出一个能够自主识别赛道路径的智能车。如果参赛队伍想要成为最终的冠军,不仅需要智能车在不冲出赛道情况下用最短时间行驶完官方指定的路径,而且参赛队伍的技术报告评分也要高。整个智能车系统包括机械结构设计、硬件电路设计、软件编程设计,这需要每个参赛队伍成员都要学习智能车系统的相关知识和工具使用。从2004年开始,韩国现代公司为促进更多大学生积极参赛,以捐赠一辆轿车作为竞赛的特等奖。 韩国高校举办赛事的成功可以证明,智能车科技竞赛体现了学生对未来智能技术的热爱,学校和社会的支持不仅可以提高学校教学的整体水平,而且最终能将学生的自主创新能力应用到企业的汽车产品研究中。 1.2.2 国内研究发展现状 受韩国智能模型车竞赛的影响,在其举办5届后,2006年8月我国在清华大学也举办了首届大学生智能模型车竞赛,当时共邀请了57所院校的112支队伍前来参赛,这不仅受到各大院校的热情参与,而且教育部也非常重视改赛事,最后将其列入教育部主办的全国五大竞赛之一,体现了该竞赛对学生自主创新能力的重要性。至今该竞赛已成功举办了14届,非常受大学生关注,或许在过几年,该竞赛不仅仅只针对于大学生了,中小学生也可获得参赛资格。该竞赛涉及众多学科专业知识,不仅能让学生所学知识得以融会贯通和培养动手创新能力,而且能提高高校对智能车的研究水平,推动社会对智能汽车产品的研究发展。 1.2.3发展方向 无人驾驶的智能车是未来科技发展的重要方向之一,视频导航技术的研究在不断地提高。视频导航的智能车以普通汽车为基础,以高科技为辅助,向各个行业领域不断拓展且成熟、广泛应用,例如星际探测、危险工作区域采样、物流仓库巡逻、军事防护等等。 1.3 本论文研究的主要内容 (1)对摄像头采集的图像做处理,并提取出中心线; (2)优化算法,提高小车原来的速度和稳定性; (3)减小软件算法的计算量,舵机的PD控制算法转变为P项; (4)减小硬件面积。 第二章 智能车系统总体设计 通过上一章节对智能车的介绍,相信大家对智能车系统的组成有所了解了。没错,它是由机械、硬件和软件构成的。在本章中将对智能车的总体设计概述作出阐述,并画出总体框图。 2.1 总体设计概述 智能车总体工作模式为:以型号为MK60N512ZVLQ10的32位单片机作为核心控制器,对电机和舵机进行控制;然后利用型号为MT9V032的摄像头采集赛道图像,进而识别出赛道路径,继而相互结合控制小车速度和转向完成规定赛道的行驶。在机械结构稳定和硬件电路安全的情况下,通过优化算法,从而可提高小车的速度和稳定性,“做到直道全速行驶,弯道安全通过”,最后在不冲出赛道的情况下以最快的速度完成比赛。 2.1.1 机械系统 根据第十三届比赛规则规定,竞速的光电四轮组使用的车模必须是指定的B型车模。该车模使用官方指定的B型车模,其长为28.5cm,宽为17.8cm,底部距离地面35cm。 为了提高智能车各方面的性能,机械结构需要重新设计,其中包括B型车模的改装处理,舵机、编码器、摄像头、电池等其他零件的安装。 2.1.2 硬件系统 智能车控制系统平台的硬件系统主要由MK60N512ZVLQ10控制模块、电源模块、重要接口及电机驱动电路组成。 MK60N512ZVLQ10控制模块:该智能车系统是采用官方指定的 MK60N512ZVLQ10 作为控制核心,具有144个引脚,其中100个可供外部使用,主要处理摄像头采集的信号,以及根据PID控制算法做出对电机转速和舵机打角转向的决策,最终完成智能汽车的自主循迹以及高速运行。 电源模块:根据不同模块所需要的电压值设计了不同的电源稳压电路模块,采用的芯片型号为SPX1117M3,该芯片价格便宜及性能高,能分别为3.3V、5V的电源电路进行稳压。 重要接口有摄像头、速度采集、舵机和OLED显示屏等接口模块组成。(1)摄像头模块:采用 MT9V032完成了赛道信息的采集,电压为3.3V。(2)速度采集模块:MINI512 线编码器完成了速度检测,将速度值反馈到MK60,继而控制小车的加减速。(3)舵机模块:舵机型号为S-D5,电压为6V。(4)OLED显示屏模块:该模块主要是对所调参数进行显示以及图像显示,方便实时观察摄像头采集到的赛道信息。当软件开发人员需要调试摄像头高度及广角时,可手推小车行驶时从而实时观察摄像头采集到的赛道图像。 电机驱动模块:B型车模是单电机,因此设计了单路电机模块。 2.1.3 软件系统 该智能车软件控制平台,图像传感器的型号为MT9V032,图像分辨率为60*120。摄像头利用了场中断和行中断进行图像采集,将采集回的图像经过去噪和二值化处理,然后提取出中心线,最后微控制器对小车速度和转向进行控制,从而实现了自主导航完成指定赛道的行驶。图像中心线的提取是提高车速的辅助,电机是通过输出PWM占空比对小车的速度进行控制,在本设计中,由于小车本身就是一个很大的积分计算量,因此采用PID控制算法中的PD两项进行控制小车速度,舵机则采用固定值P项进行控制小车的打角转向。因此,整个软件系统中,对图像的采集、处理和中心线的提取,电机速度控制和舵机打角转向的控制算法是非常重要的。 2.2 总体设计框图 智能车能在赛道上自主行驶,这依赖于不同模块各自的功能作用,其总体框图如下图所示: 图2.2 智能车系统框图 第三章 机械结构设计 合理的机械结构设计能为硬件电路和软件算法提供稳定性的支撑,因此在本章中会对智能车机械结构模块配件的位置摆放和重心的调整进行分节介绍。例如,小车静止在赛道上时,四个轮胎能否平稳地摆放在跑道上,还有行驶时不会发生侧翻和后轮甩尾,这都需要有质量保证的小车机械结构。可靠的机械结构不仅能提高小车的稳定性,而且对小车在行驶时的转弯、速度和图像采集都有很好的效果。 3.1 电池位置 由于小车的电机固定安装在后轮处,整辆车的动力也在这了。电池本身质量和车模本身的质量相接近,因此这大大增加了小车的质量。考虑到如果将电池安装在车模前桥,这会使小车的重心往前移,从而增大小车在行驶过程中出现甩尾的现象,因此应将电池安装在车模后部分且贴近底盘,这不仅能在结构上提高小车的运行速度和稳定性,还能使车头的舵机能更加灵活地转向。 3.2 编码器安装 本课题研究的小车使用的编码器能快速精确得采集到电机正反速度。因此编码器的安装需要将其齿轮与电机的齿轮相耦合,这样才能采集到精确的小车在各种路径行驶的速度。 3.3 摄像头安装位置 为了避免摄像头拍摄出现盲区,应将摄像头安装在车模的中间,也就是在电池的前方,这个位置是车模原有固定的,在不想给车模打孔的情况下,这个位置是最为适合的了。摄像头支杆的材料是碳纤维素,具有极强的稳固性。 3.4 硬件电路板安装 本课题研究的小车所使用的硬件电路均为自主设计,为减小小车质量,将固定电路板的铜柱换成塑料材质的。主板和驱动板的安装不能有元器件的接触,以免短路。为降低小车重心,将主板安装在车模底板相贴近的位置,凹槽卡住在摄像头支杆处。驱动板需要安装在散热处好的位置,因此可将其用长的塑料柱高高架起来。而且将驱动板安装在车后桥的电机上方是可以使车子的重心往后移从而增加车轮的抓地力防止甩尾。 第四章 电路硬件设计 硬件电路是小车系统的基础组成,没有它的存在,再好的软件算法也不能将小车驱动起来。强大可靠的硬件电路是保障系统安全稳定的前提,因此在设计硬件电路时需要对各模块电路做好接地、滤波等工作,同时也要将高速的数字电路与模拟电路分开。在上一章中有介绍过小车质量会对车速造成不良影响,所以在设计硬件电路时可以减小电路板的面积。如何减小电路板的面积呢?可以在设计原理图时减少一些元器件的数量与合理布局PCB图,这样就可以减小电路板的面积来减轻车子的质量。本章节将简单介绍硬件电路中各模块的供电、驱动及各个重要接口模块的电路设计。 4.1 电源模块电路设计 根据恩智浦智能车竞赛规则,每辆车的供电电源都统一使用官方指定的7.2V可充电镍镉电池,在硬件电路设计中,每个模块都需要电源才能工作,那么7.2V的电源将分别为哪些模块供电多少V呢?下面将介绍小车电源模块电路设计。 图4.1 电源模块电路设计 4.1.1 3.3V稳压电源模块 3.3V的电源主要为最小系统板MK60、速度采集、摄像头、串口、OLED等模块供电。原理图设计如下: 图4.1.1.1 最小系统板K60电源模块 4.1.2 6V稳压电源模块 B车模的舵机型号是S-D5,舵机所需要的电源为6V。 图4.1.2 舵机6V稳压电源 4.1.3 12V稳压电源模块 B车模只有一个电机,因此只需要设计单驱动电路,其所需的电源是12V。 图4.1.3 电机12V稳压电源 4.2 重要接口模块 硬件电路中有许多重要的接口模块,分别为速度采集编码器、摄像头模块、OLED显示屏模块等重要接口模块,部分接口模块原理图如下所示: 图4.1.1.2 速度采集编码器接口 图4.1.1.3 摄像头接口 图4.1.14 OLED接口 4.3 MOS管单路驱动 H桥驱动电路是一种非常典型实用的参考电路,供很多用户参考使用,本课题单电机驱动电路设计也参考了此电路,由4个MOS管和一个电机组成。MOS管芯片型号为IRLR7843TRPBF,当对角线上的一对MOS管导通,则电机便会转动。MOS管导通后的电流方向决定了电机正反向的转动。 图4.3 驱动电路 第五章 软件算法优化 智能车导航系统的基本思路是首先摄像头传感器采集赛道图像,然后对图像进行处理,从而将处理好的赛道图像信息反馈到MK60微控制器,由微控制器对小车速度和方向做出下一步的控制动作。 智能车的视频导航是一个什么实现过程呢?现在简单描述下,首先,小车在行驶过程中,摄像头传感器能提前获取道路的前方信息;然后摄像头传感器对前方道路进行图像采集,然后经过图像处理后将提取出赛道中心线,继而对赛道路径作出识别,最后控制小车的速度和转向。 智能车的视频导航系统的软件算法是本课题设计中的重点,需要考虑的因素很多。首先要考虑如何通过摄像头传感器去采集图像,那采集回来的图像大小需要设置为多大才是合理的呢?其次就是摄像头采集回来的原始图像存在过多的干扰,那需要对采集的图像进行哪些处理,才能区分哪些是车道的边界黑线,哪些是背景图像。最后经过去噪和二值化处理的图像应如何提取出中线,随后,控制器又如何对小车速度和方向做出控制。这些疑问将在本章节中一一做出解答。以下是软件算法总体流程图: 图5 软件算法总体流程 5.1 开发工具 本课题使用的编程开发工具是IAR Embedded Workbench IDE,此工具对于新学者来说是一款操作简单、上手快等优点的编程开发工具。在这里需要提示一点就是,在NXP公司收购了飞思卡尔公司后,新版IAR的option选项中已没有freescale项。因此当你使用这款软件对新建工程进行配置时,需到NXP选项里进行单片机的型号选择。选择了具有简洁灵活、易对硬件操作、移植性高等特点的C语言作为软件开发的编程语言。 5.2 图像采集 本课题研究的智能车使用的图像采集传感器是基于MT9V032芯片设计的摄像头,灰度值范围是0-255,拍摄广角为120°,摄像头采集图像宽度大小范围是1-752,但由于MK60不允许采集的图像宽度超过170,因此选择的宽度为120;图像高度的范围是1-480,选择的高度为60,因此采集到的图像大小为60*120,图像大小也就是图像分辨率。灰度值范围是指从摄像头得到的图像信息是含有256个灰度级的图像。摄像头采集图像的速度为50场每秒,输出的信号不仅有场同步信号和行同步信号,还有各自之间的消隐信号。摄像头模块的MT9V032芯片具有视频同步分离功能,可以分离输出信号,最终得到场同步信号和行同步信号的时序信息并进行控制。由于行中断在采集该行信号时,对时间要求和中断优先级较高,因此将HREF中断请求入口作为行同步信号输入口,VSYNC为场同步信号输入口。摄像头每秒采集图像的速度不同于单片机处理数据的速度,它有固定的帧数,因此为了保证小车在高速情况下行驶所采集的图像不失真,仅捕捉场信号的下降沿。 摄像头拍摄距离可达3米远,为了避免摄像头拍摄到赛道外元素及邻近赛道从而造成误判、干扰等问题,经过调试可设定摄像头只拍摄前方1.2米距离即可,这样既不会拍摄到多余的图像,也不会影响控制器对小车速度和转向做出控制。摄像头采集的原始图像也同于我们人眼看到的东西一样,在近处看到的是大而清晰,远了就会变小和模糊,如同几何图形中的梯形。由于摄像头拍摄前轮至前方20cm处为盲区,会导致小车在起跑时未采集到起跑线,为了防止这种现象发生,可在剩下的1米有效范围内取每2.5cm至少采集一行,故一幅图像至少要采集40行,但为了减小误差,可将采集的行数增大,设定为60行,一行采集的点数为120。 采集图像的思路:首先,判断场中断的图像缓冲区是否为空,如果为空则开启行中断并计数每行的采集;然后当累计的行数与一幅图像的行数相等,便关闭行中断,将图像缓冲区置满;最后清零各个计数器,以等待下一幅图像采集。具体流程图如下: 图5.2.1 判断场中断 图5.2.2 采集图像基本思路 5.3 图像处理 当小车在高速行驶时,图像的处理速度需要快,那此时图像处理的方法需对图像中的标志进行取舍。提取图像中心线是很简单的,但由于有光线不均匀和赛道路径不同等影响因素,因此需要对图像进行处理才能快速提取出中心线。为了提高系统的处理速度,保证系统的实时性,需要对原始图像进行去噪和二值化处理,才能提取出中心线。 图像的去噪处理和二值化处理是提取中心线的重要支持,本节对这两种处理方法进行说明。图像去噪处理是将采集回来的原始图像进行中值滤波,去除掉与周围像素灰度值的差较大的像素点,并用中值取而代之。由于赛道是白色的PV板,背景是蓝色,可对图像进行二值化处理,即对图像进行灰度化,灰度化后的图像只有黑白两种颜色,用灰度值0代表黑色,255代表白色。 5.3.1 图像去噪处理 摄像头采集回来的原始图像在数字化和传输过程中会受到外界环境噪声等干扰因素的影响,若不经过处理,会影响后续中心线的提取,因此可采用图像去噪处理,减少数字图像中噪声的过程。去噪处理方法多种多样,本次使用中值滤波去噪方法,即使用中值代替去除掉与周围像素灰度值的差较大的像素点。 图5.3.1.1 未去噪处理的原始图像 图5.3.1.2 未去噪处理分析图 图 5.3.1.3 去噪处理后图像 5.3.2 图像二值化 二值化图像只有黑白两种颜色,它的所有像素点灰度值只有0和255,0代表黑色,255代表白色。二值化图像的处理思想是将不同特征的像素点分割到不同的区域中。那如何找出这些像素点的相似和不同特征呢?由此引入了阈值,图像二值化时,阈值是一直在变化的。我们都知道摄像头在采集图像时,每相邻的两张图之间的时间间隔很小,因此我们可以参考上一张图,从而计算出阈值。图像二值化常用的算法主要有固定阈值二值化和自适应阈值法。 如果你了解过恩智浦智能车竞赛,那你就会知道它的赛道是有固定结构的,而且还有明显的白色赛道和蓝色背景。因此,研究人员可以利用赛道颜色差别大的特点,选择适合的二值化算法。基于这个重要的特点,也为了简化算法,可选用固定阈值法对图像进行二值化处理。由于阈值固定,所以阈值的确定就显得尤为重要了,这就关系到整幅图像二值化处理后的效果。阈值更新代码如下: void Get_threshold(void) { uint8 i, j; Sumof_threshold=0; for(i=0; i<ROW; i++) for(j=0; j<COL; j++) { Sumof_threshold+=image[i][j]; if(image[i][j]>Update_threshold) Image_user[i][j]=1; else Image_user[i][j]=0; if(j==119 || j==0) Image_user[i][j]=0; } Update_threshold=Sumof_threshold/(ROW*COL); } 5.4 提取中心线 分析采集图像可知,赛道的左右边沿线和中心线都是连续的,因此为了智能车能稳定地行驶在赛道中间,就必须将中心线提取出。 提取中心线的方法是先从每一行的第一列的第一个点开始遍历,将图像的最大宽度和高度设置为赛道左右边界线;然后将左右两个边界点加起来,除以2就可算出中点,点连成线继而形成中心线。但并非采集到的图像都有左右边界线,例如当小车进入大S弯时,只采集到赛道左或右的边界线,那么可以进行一边丢线或者补线求出中心线。当小车进入十字路口或者圆环时,摄像头采集到的是一幅大空白的图像,那么从最后几行开始遍历,对最后几行的左右边沿线做丢线处理,延伸到开始行。以下为中心线提取的核心代码: void Draw_midline_algorithm(void) { uint8 i,j; for(i=59; i>0; i--) { ADD_Left[i]=0; ADD_Right[i]=0; for(j=Mid[i]; j<120; j++) { if(Image_user[i][j] && !Image_user[i][j+1]) { Right[i]=j; break; } } for(j=Mid[i]; j>0; j--) { if(Image_user[i][j] && !Image_user[i][j-1]) { Left[i]=j; break; } } 图5.4 提取出中心线的图像 5.5 路径识别 路径识别的基础是需要经摄像头采集回来的图像经过处理,然后提取出中心线。在往届的智能车比赛中,赛道的主要路径有直道,小S弯道,大S弯道,十字路口,起跑线和路障的识别,但在今年增加了一个路径新元素,即圆环。圆环有不同大小的规格,分别为50cm,100cm及150cm,圆环这一元素使得图像信息变得更为复杂,要在复杂的图像信息中提取出有效中心进行循环是比较困难的,因为当小车在行驶入圆环时,摄像头采集回来的图像中表现为底部大面积空白,于是可以选择最高点下面几行空白块作为判断圆环的标志。 5.6 直流电机控制 在中学物理中学到,物体的质量越大,其惯性越大,速度也会越大。在本课题中所研究的智能车,其本身的车模加上电池的质量就已经超过500g,更何况当加上硬件、配件的质量,如此大的质量对小车的速度也会造成很大的影响,因此如何选择最优算法来减小智能车本身的惯性也极为重要。一个物体在静止时的速度是为零,那么小车在刚准备启动时的速度也是零,而此时电机的输出会很大。那什么时候电机的输出不会很大呢?那就是小车在跑道上平稳匀速行驶的时候。考虑到小车行驶时的惯性、本身的质量和电池的电量都会对小车速度造成不可漠视的影响,因此选择闭环控制算法能很好地将小车的速度控制得当。 那如何对直流电机进行控制呢?其实就是对小车的速度进行控制。当小车能做到“直道全速行驶,弯道安全通过”,那就能在最短的时间跑完全程。PID和鲁棒控制算法的结合能对速度进行完美的控制。由于车速控制通道的时间滞后比较小,且车速本身就是一个很大的积分环节,因此可以将PID算法中的积分项省略,采用PD的控制算法即可。那为何说加入鲁棒控制算法后就可以完美控制小车速度了呢?因为小车行驶的跑道上有直道和弯道等各种路径,这时小车需在最短的时间内对不同路径进行加减速度的控制,而鲁棒控制算法的优点就是如果编码器读取的速度值与目标速度相差很大时,该算法会将PWM占空比迅速变大,加快调节系统的速度,这就是引进鲁棒控制算法的原因。 具有线性关系的两个变量就会有一定的比例关系,由于多种因素使得车速和PWM成非线性关系。如果它们是线性关系,那么调速就会变得很容易,例如小车当前速度为1.5m/s,PWM为45%,而设定的目标速度为3m/s,那直接将PWM提高到90%是不是就可以了,这完全是忽略了外界所有的干扰因素,就类似一道物理题的计算忽略摩擦力。既然不是线性关系,那应如何控制PWM使小车速度达到设定的速度?小车控制系统加上复杂的外界因素,使得PWM与速度之间存在什么关系都是无法确定的,为了使当前速度能以最快的时间达到设定的目标速度,因此引入了PID控制算法来调整小车行驶时的速度。 PID控制算法有位置式和增量式,大部分人都会选择增量式PID作为小车控制系统的算法。原因如下:位置式算法的控制变量状态与过去有关,需与过去的偏差值进行大量累加;而增量式只与最近几次偏差值有关。还有位置式算法的输出是全量输出,这样对小车动作的影响较大。两者区别如下图所示: 图5.6.1 位置式与增量式控制算法区别 PID控制算法公式中的P为比例,就是输入偏差乘以一个常数;I为积分,就是对输入偏差进行积分运算;D为微分,对输入偏差进行微分运算,这里所说的输入偏差是指读出被控制对象的值减去设定值。例如开发人员想控制车速为3m/s,但从编码器中读取出的速度值为1.5m/s。因此3m/s为设定值,1.5m/s为读出被控制对象的值。 PID算法对速度的调整起到很好控制作用,在本次课题研究中只用到PD两项,将I项置为0。调速的过程中发现,当P项参数增大时,能很好地控制小车速度,但如果一昧地去提高车速,小车在行驶过程中就会发生严重的抖动现象。而D项在小车速度控制系统中起到调节时间的作用,就比如现在小车在直道上行驶,那它此时总不能以过弯时的速度行驶吧?所以D项能在最短的时间内将小车的速度提高上来。 综上所述,使用PID的原因归结为三点:(1)小车要在最短时间内达到最快速度;(2)小车在行驶过程中会因为外界因素影响可能变得不稳定;(3)小车的速度控制系统是闭环才能满足整个系统的稳定要求。 通过对智能车速度控制系统的PID算法进一步研究,对原来赛车的速度作出调整,在最短的时间内将原来平均1.7m/s速度提高到2m/s。经过一段时间对电机PID的调参,总结了一些技巧,(1)通过对比多届赛道路径,发现起跑时都为直道,因此可以在起跑时将PWM输出为最大,全速直冲;(2)如果想让小车急刹车,那可以将I项值设为很大,但这会出现小车甩尾和驱动板发热现象。以下表格列举出速度调整前后U(k)各项参数和PWM占空比值: 调整前后速度 P项 I项 D项 PWM占空比值 1.7m/s 0.54 100 0.47 60 2m/s 0.83 0 0.2 80 表5.6 调速前后参数值 5.7 舵机控制 舵机在智能车系统中的作用是通过打角转弯来控制小车的行驶方向。通过阅读各种文献,发现很多研究智能车的人都会使用舵机PD控制算法。但经过我一段时间的调试发现,如果小车速度还未达到2.5m/s而采用舵机PD控制算法,那只会增加调试D项的工作量,因此当速度未达到2.5m/s时,只需用到P一个参数也能使小车进行稳定地打角转弯。经过反复调试,使用PD两个参数确实也能稳定控制效果,但当P项的调整达到一定的程度后,D项就会影响小车行驶的稳定性,还需要慢慢调试,这又耗费了人力和时间。如果你使用PD控制,那建议你在调参时可先将P值调到刚刚使舵机有一点转不了方向,然后给D值一个比P值大上百倍的数值。在本课题中,小车的速度是从1.7m/s提升到2m/s,未达到2.5m/s,因此只使用一个P定值就可以使小车在任何路径中都能稳定行驶。下表列举出不同路径方向的P值: P值 路径 左转P值 右转P值 直道、大小S弯、十字路口 70 70 圆环 80 65 表5.7 舵机P值 以下是控制舵机的核心程序: void Geer_PID_algorithm(void) { if(Find_Left_Ring_Flag || Find_Right_Ring_Flag) { if(Geer_perror>=0) Geer_P_gain=80; else if(Geer_perror<0) Geer_P_gain=65; } else { if(Geer_perror>=0) Geer_P_gain=70; else if(Geer_perror<0) Geer_P_gain=70; } } 第六章 结论 本课题以第十三届全国大学生智能车竞赛为背景,该智能车系统通过摄像头采集赛道图像,将采集的图像进行去噪和二值化处理后,然后提取出中心线,主控芯片通过摄像头信号对不同赛道元素作出判断,最终对电机速度和舵机打角做出控制,保证智能车在不冲出赛道的情况下用最短时间行驶完全程。回顾本次毕业设计,本文从以下几个方面进行总结: 1、 在智能车系统的硬件设计上,重点对单路电机驱动电路进行设计;因为在最初布线时,未考虑到单路电机驱动的电流过大,不对大电流的线进行加粗,最终导致短路冒烟。 2、 调节电机PWM和PID算法进行调速,最终提高车速。 3、 在舵机的PID控制算法中,采用了固定值P项进行控制,从而减小系统的运算量,提高小车的稳定性。 4、 优化圆环的图像处理算法。 在对小车系统做出改进后,但也存在着一些不足: 1、 当小车以最快的速度行驶时,会偶尔出现甩尾的现象,智能车系统的稳定性有待提高。 2、 当车速达到2.5m/s以上,需重新调试舵机PID参数。。 3、 根据实际的测试发现,官方规定使用的镍铬电池,当电源电压稍微低于7.2V时就会对小车的稳定性造成影响,不利于小车长时间行驶和调试摄像头采集的图像,这个问题目前还未得到合理解决。 参 考 文 献 [1] 黄凯龙. 基于飞思卡尔单片机的智能车及其调试系统设计[D].湖南大学,2014. [2] 胡房武. 基于图像采集的智能车系统设计[D].大连海事大学,2011. [3] 李久芳.基于二值化的边缘图像滤波方法[J].电子工业专用设备,2010,39(02):25-27. [4] 许寰,鲁五一,赵治平.摄像头路径识别和小车控制策略[J].计算机工程与科 学,2009,31(05):110-111+115. [5] 罗丛波. 基于视频导航的飞思卡尔智能车系统的设计与实现[D].吉林大学,2016. [6] 王泽元. 基于CMOS图像传感器视觉系统的智能小车的设计实现[D].吉林大学,2011. [7] 王洋. 基于视觉导航的智能车系统研究[D].南昌大学,2008. [8] 邹华东,贾瑞清,张畅.飞思卡尔智能车赛道识别及控制策略研究[J].机床与液 压,2018,46(15):94-98. [9] 陈思宇,张倩,钱程,熊扬扬.基于飞思卡尔K60的二值化图像无线传输[J].科技风,2019(07):66. [10] 张瑾,孟利利,梁剑飞.基于“飞思卡尔”单片机MK60DN512ZVLQ10的智能车设计[J].黑龙江 科技信息,2016(32):108. [11] 王宏旭. 基于飞思卡尔智能车的视频导航控制技术研究[D].沈阳理工大学,2014. [12] 马启瑞,田洪亮.基于飞思卡尔智能车无线图像处理实时监控系统设计[J].无线互联科 技,2013(11):60+69. 致 谢 本次论文能够顺利完成,首先要感谢我的指导老师沈宏锐。从2019年的论文选题开始,指导老师一直与我们时刻保持联系,尽心尽力地指导着每个同学,老师指导着我们如何查阅文献、编写开题报告中的文献综述,一直到论文定稿的每个历程。由于我的粗心大意,在写论文时出现了一些格式错误,老师能一针见血批注出来,这严谨的治学态度深深地影响了我。我相信在经历过本次毕设的每个阶段,我能在以后的做事方面变得更加细心。在此,特向我的指导老师——沈宏锐老师表示最诚挚的感谢。 其次,我感谢广东东软学院的所有领导和老师。因为学校的所有领导和老师的付出,使我在大学四年期间学到了很多专业知识,并参加了许多锻炼我自身专业水平的竞赛,让我的大学生活变得多彩多样。老师们的渊博知识和严谨教风,一直在不断地激励我向前迈进。“精勤博学,学以致用”,我在东软学院的四年大学的学习生活里,我在不断地成长和进步,感谢校园中默默付出的领导和老师们。 最后,我要感谢我的家人、同学和朋友们,在我做毕设期间,遇到了一些困难,心情很受影响,但因为他们的鼓励和支持,让我重新振作起来。在这里还要感谢我在写论文期间所参考文献的作者们,他们学术研究的成果给了我很大的启发。感谢每一位为我付出的人,我在往后追求理想的人生道路上会一直想着你们曾经对我的关爱、奉献和温暖,我会一直往前冲。 附 录 附录1 主控板原理图: 图1 主控板原理图 驱动板原理图: 图2 单驱动原理图 附录2 主程序main.c: #include “headfile.h“ #define Smotor_P_gain 5 #define Smotor_I_gain 1 #define Smotor_D_gain 0 uint8 Geer_P_gain=50; #define Geer_I_gain 0 #define Geer_D_gain 700 /** **获得并更新阈值 */ uint8 Image_user[ROW][COL]; uint8 Update_threshold=120; uint32 Sumof_threshold=0; void Get_threshold(void) { uint8 i, j; Sumof_threshold=0; for(i=0; i<ROW; i++) for(j=0; j<COL; j++) { Sumof_threshold+=image[i][j]; if(image[i][j]>Update_threshold) Image_user[i][j]=1; else Image_user[i][j]=0; if(j==119 || j==0) Image_user[i][j]=0; } Update_threshold=Sumof_threshold/(ROW*COL); } /** **电机PID */ int16 Smotor_perror=0; int16 Smotor_daterror=0; int16 Smotor_pidout=0; int16 Want_speed=1000; void Smotor_PID_algorithm(void) { Smotor_perror=Want_speed-speed; Smotor_pidout= Smotor_P_gain * Smotor_perror + Smotor_I_gain * (Smotor_perror+Smotor_daterror) + Smotor_D_gain * (Smotor_perror-Smotor_daterror) ; Smotor_daterror=Smotor_perror; } /** **电机控制 */ int16 Smotor_duty=0; void Smotor_control(void) { Smotor_duty=Smotor_pidout; if(Smotor_duty>0) { if(Smotor_duty > 8000 ) Smotor_duty=8000; //if(Smotor_perror > 400) Smotor_duty=6000; ftm_pwm_duty(ftm0,ftm_ch1,0); ftm_pwm_duty(ftm0,ftm_ch0,Smotor_duty); } else if(Smotor_duty<=0) { Smotor_duty=-Smotor_duty; if(Smotor_duty> 8000 ) Smotor_duty=8000; //if(Smotor_perror < -400) Smotor_duty=6000; ftm_pwm_duty(ftm0,ftm_ch1,Smotor_duty); ftm_pwm_duty(ftm0,ftm_ch0,0); } } /** **舵机PID */ int16 Geer_perror=0; int16 Geer_daterror=0; int16 Geer_pidout=0; void Geer_PID_algorithm(void) { if(Find_Left_Ring_Flag || Find_Right_Ring_Flag) { if(Geer_perror>=0) Geer_P_gain=80; else if(Geer_perror<0) Geer_P_gain=65; } else { if(Geer_perror>=0) Geer_P_gain=70; else if(Geer_perror<0) Geer_P_gain=70; } Geer_pidout= (int)Geer_P_gain * Geer_perror + (int)Geer_I_gain * (Geer_perror+Geer_daterror) + (int)Geer_D_gain * (Geer_perror-Geer_daterror); Geer_daterror=Geer_perror; } /** **舵机控制 */ uint16 Geer_duty=7400; void Geer_control(void) { Geer_duty = 7400 + Geer_pidout; if(Geer_duty>11900) Geer_duty=11900; else if(Geer_duty<2900) Geer_duty=2900; ftm_pwm_duty(ftm0,ftm_ch7,Geer_duty); } /** **起跑线识别 */ uint8 stop=0; uint8 starting_line=0; void Seek_Starting_Line(void) { uint8 i, j; starting_line=0; for(i=55; i>45; i--) { for(j=60; j<80; j++) { if(image[i][j] < Update_threshold && image[i][j+1] > Update_threshold) starting_line++; if(image[i][j] > Update_threshold && image[i][j+1] < Update_threshold) starting_line++; } for(j=60; j>40; j--) { if(image[i][j] < Update_threshold && image[i][j-1] > Update_threshold) starting_line++; if(image[i][j] > Update_threshold && image[i][j-1] < Update_threshold) starting_line++; } } if(starting_line > 50) stop=1; } /** **主程序入口 */ void main(void) { get_clk();//上电后必须运行一次这个函数,获取各个频率信息,便于后面各个模块的参数设置 //uart_init (uart2, 115200); //初始换串口与电脑通信 camera_init(); pit_init_ms(pit0, 50); //初始化正交采集模块 ftm_quad_init(ftm1); //开启上拉电阻 port_init_NoAlt (A12, PULLUP ); port_init_NoAlt (A13, PULLUP ); enable_irq(PIT0_IRQn); EnableInterrupts; ftm_pwm_init(ftm0,ftm_ch0,10000,0); ftm_pwm_init(ftm0,ftm_ch1,10000,0); ftm_pwm_init(ftm0,ftm_ch7,50,7400); Init_Road(); while(1) { if(mt9v032_finish_flag) { mt9v032_finish_flag = 0; Get_threshold(); Draw_midline_algorithm(); Seek_Starting_Line(); Geer_PID_algorithm(); Geer_control(); if(stop) { if(Starting_Line_Distance > 4000) Want_speed=0; else if(Find_Left_Ring_Flag || Find_Right_Ring_Flag) Want_speed=1200; else if(Mid[45] >68 || Mid[45]<52) Want_speed=1200; else if(Mid[25] >70|| Mid[25] <50) Want_speed=1200; else if(Geer_duty>7000 && Geer_duty <8000) Want_speed=1500; else Want_speed=1500; } else { if(speed_m>10) Want_speed=0; else if(Find_Left_Ring_Flag || Find_Right_Ring_Flag) Want_speed=1200; else if(Mid[45] >68 || Mid[45]<52) Want_speed=1300; else if(Mid[25] >70|| Mid[25] <50) Want_speed=1300; else if(Geer_duty>7000 && Geer_duty <8000) Want_speed=1500; else Want_speed=1500; } Smotor_PID_algorithm(); Smotor_control(); //Uart_Send_Image(); } } } 本文档由香当网(https://www.xiangdang.net)用户上传