• 516.93 KB
  • 2022-04-22 11:25:50 发布

基于Kinect 的自主避障智能车

  • 24页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'中国科学技术大学本科毕业论文中国科学技术大学本科毕业论文题目基于Kinect的自主避障智能车英文Kinect-equippedsmartcarforAutonomousobstacleavoidance院系少年班学院姓名孙瀚学号PB11000337导师刘利刚教授日期二〇一五年五月 中国科学技术大学本科毕业论文致谢转眼间,本科四年的生活,就要画上句号了。四年的时光,真如白驹过隙一般,入学军训时的场景仿佛还历历在目,如今竟已到了要说再见的时候。接下来的几年,我将在科大继续我的研究生阶段的生活,在这人生的路口,我想就留下这篇论文当做纪念吧!能够顺利完成这篇论文,离不开无数人的帮助和支持。首先要感谢的就是我的导师刘利刚老师,他的循循善诱和一丝不苟才促成了我这篇论文的完成。从选题时,他新颖的角度和启发式的思路,到毕设进行之中,他严谨的态度和孜孜不倦的教诲,都给了我莫大的帮助,让我在毕设过程中能够不断学习,不断成长。定期的组会不但能让我时刻了解到自己的进展和存在的问题,也强化了我的时间规划的能力,学会了如何有条不紊地完成科研任务。在我遇到困难之时,刘老师会耐心地与我共同分析问题,提供新的思路,让我豁然开朗;在我懈怠和停滞不前的时候,刘老师也会严厉地指出,让我警醒,督促我继续前进。可以说,刘老师对待科研一丝不苟的态度,开放活跃的思维,勇于探索的精神,以及一颗永远充满热情充满激情的内心深深感染了我,让我感到遇到这样一位人生导师是如此的幸运。也衷心的希望接下来的日子里,我能从刘老师身上学习到更多,成为一个像他一样对自己所做的东西充满热爱的人!当然,我还要感谢我的父母和家人,他们一直对我无条件地支持,无论遇到了多大的困难和挑战,我知道他们一定会默默地站在我的身后,让我自信满满,真的感谢他们这么多年来对我的关心和付出!于此同时,我也要感谢在毕设期间与我一起学习一起讨论的夏熙同学,从微软开始与我一路走来相互支持的钟亚焘同学,给了我很多帮助的西交大机器人团队的三位同学以及实验室的各位老师、师兄、同学,希望以后能在实验室这个大家庭中共同成长,共同进步!最后,我想将这份毕业的喜悦与所有关心我,在乎我的人一同分享,感谢在我的人生中认识了你们,我会在你们的注目之下,一直向前,向前。 中国科学技术大学本科毕业论文目录中文内容摘要........................................................................................................2英文内容摘要........................................................................................................3第一章绪论..........................................................................................................4§1论文背景......................................................................................................4§2工作内容.........................................................................................................4§3章节安排........................................................................................................5第二章智能车的底层硬件系统搭建..................................................................6§1硬件系统的组成:主机系统和底层硬件系统..........................................6§2底层硬件系统的核心:Arduino控制板....................................................62.1Arduino简介............................................................................................62.2Arduino控制板........................................................................................7§3驱动部分......................................................................................................73.1步进电机.................................................................................................83.2电机驱动模块.........................................................................................8§4通信部分......................................................................................................94.1Wi-Fi模块.................................................................................................9§5电源部分......................................................................................................9第三章基于深度信息的障碍物获取及判定......................................................11§1Kinect传感器..............................................................................................111.1Kinect简介.................................................................................................111.2Kinect深度传感器工作原理.....................................................................111.3KinectSDK以及NUIAPI.........................................................................12§2深度信息获取................................................................................................12§3基于深度信息的物体识别和位置计算.......................................................133.1物体识别....................................................................................................133.2位置计算....................................................................................................15§4障碍物判定....................................................................................................16第四章智能车避障算法以及试验结果................................................................18§1智能车避障算法.........................................................................................181.1避障算法..................................................................................................181.2通信..........................................................................................................191.3智能车运动控制......................................................................................19§2试验结果........................................................................................................20第五章结论与展望...............................................................................................21参考文献......................................................................................................................221 中国科学技术大学本科毕业论文中文内容摘要在机器人技术的迅速发展的今天,智能机器人已经成为目前研究的热门领域,可以预见未来将有越来越多的智能机器人投入工业界,进入人们的生活。作为智能机器人研究的核心部分,如何感知周围世界的信息一直是一大课题之一。而微软推出的Kinect深度传感器也为此问题研究提供了新的思路,借助其作为机器人的传感器,可以加强智能机器人对于环境的理解能力。本文对机器人和Kinect相结合的研究工作进行了初步的尝试,搭建了一套完整的基于Kinect的自主避障智能车系统,可以实时地扫描场景,判断障碍物的位置,然后控制智能车自主地绕过障碍物。本系统的新颖部分在于两点,一是没有使用现成的机器人套件,而是自行从底层搭建出了完整的智能车硬件系统,二是使用Kinect代替传统的传感器设备,从而提高了智能车对周围环境的理解。该系统分为底层硬件系统和主机系统,整套硬件系统全部为自己搭建,其中,智能车的底层硬件系统以Arduino板为核心,配合运动部分(步进电机以及电机驱动模块),wifi通信模块以及其他相关部分完成小车的运动要求。小车通过其上搭载的Kinect摄像头获取深度数据,经由障碍物提取和判定算法,小车避障算法等相关算法,将控制信息传回小车,完成避障功能。借由此系统,可以进一步开发完成诸如自主路径规划,三维场景重建等一系列有价值和前景的功能和研究。2 中国科学技术大学本科毕业论文ABSTRACTIntheeraofemergingrobottechnologiesburstingout,smartrobotisbecominganextremelyheatedfieldandwebelievetherewillbeanincreasingamountofrobotscomingintoserviceinbothindustriesanddailylife.Atthecoreoftheresearchonsmartrobot,howtocapturethesurroundinginformationhasalwaysbeenamajortask.WithMicrosoftlaunchingitsdepthsensorKinect,anovelsolutionisavailabletothisprimarytaskinresearch.TakingtheadvantageofKinectsensor,thecapabilityofrobotunderstandingthesurroundingsisfarmoreenhanced.ThisthesistookaresearchtrialinthefieldofrobotandKinectcombinationandbuiltupasmartcarsystemwithautomaticcollisionavoidance.Thesmartcarcanachievereal-timescenescanning,self-judgmentofobstaclepositionandautomaticobstaclebypassing.Thesystemacquiresitsnoveltyintworeasons.First,thesystemiscompletelyconstructedfrombottomupwithoutexistingaccessorysuites.Second,thesystemisequippedwithKinectinplaceoftraditionalsensordevices,henceaboostinitscapabilitytounderstandthesurroundings.Theentiresystemiscomprisedofahostandalow-levelhardwaresystem,whichtookArduinoasthecorewithmotionmodule(steppingmotorandmotordrive),Wi-Ficommunicationmoduleandotherrelatedcomponentstofulfillitsmotionrequirement.ThecarcapturesthedepthdatafromKinectsensor,whichisthenprocessedbyobstacleextractionandjudgingalgorithms,afterwhichthecarreceivesthecontrolsignalsothatitcanachievecollisionavoidance.Withresorttothissystem,aseriesofvaluableandpromisingresearcharefareasilyaccessiblesuchasmotionplanningandscenereconstruction.3 中国科学技术大学本科毕业论文第一章绪论§1论文背景随着机器人技术的迅速发展,各类机器人已经广泛应用于工业和人类日常生活之中,智能机器人研究已经成为当今的一个热门领域。与此同时,如何提高智能机器人对周围环境的理解能力成为了一个重要的课题之一。而之前存在的传感器,要么价格昂贵,十分笨重,要么价格便宜,但测量精度不足。以超声和激光测距雷达为例,这两者是目前移动机器人获取环境信息的主要传感器,超声雷达获取的环境信息十分粗糙,而激光雷达获得的信息虽然相对丰富但是成本很高。Kinect传感器可以在获取光学图像的同时提取周围环境的深度信息,具有成本低廉,精度较高,内容丰富,简单轻巧,功能强大等诸多优点。本文使用Kinect传感器代替传统的测距传感器,与智能车硬件系统相结合,构建出了完整的智能车自主避障系统。§2工作内容对于一直研究算法的我来说,此前并没有任何机器人相关的学习背景,所以学习搭建智能车硬件系统成为了我的一大挑战。所以从寒假开始,我便进行了Arduino套件及其编程的熟悉和学习工作。之后又尝试了各种模块,各种外设与之组合,以便之后搭建智能车时能迅速上手。事实证明,这一切为我后面硬件系统的搭建起到了极大的帮助。但是,在进行硬件部分的试验过程中,依然遇到了大大小小很多问题,比如在测试步进电机的过程中,就烧坏了无数个电机驱动模块,也经常会因为一个一根接线断路而导致整个电路需要重新搭建,不过好在最终还是克服了这些种种困难,成功完成了硬件部分的内容。在进行硬件系统搭建的同时,我也在同步自学Kinect开发的相关内容,同样是从零开始,不过相对来说这方面遇到的挑战要小一点,一方面是因为得到了导师和师兄的帮助,另一方面联系到一个有过类似项目经验的西交大的团队,也向他们获取了诸多宝贵的经验。最终将这两者结合,经过多次测试,终于完成了本次毕设的全部结果。4 中国科学技术大学本科毕业论文§3章节安排本文分为五个部分。第一章是绪论,介绍论文的背景,我的工作内容和论文的章节安排;第二章是介绍智能车底层硬件系统的搭建,介绍了硬件系统的整体结构并且详细介绍了底层硬件系统的各个硬件模块;第三章是基于深度信息的障碍物获取及判定,介绍了如何从Kinect传感器中获取深度信息并从中识别出物体和判断为障碍物;第四章是智能车避障算法以及试验结果,介绍了在获得障碍物信息之后如何控制小车避开障碍物以及实际的试验结果;第五章是结论与展望,总结我论文的工作,并提出下一步可能的研究方向。5 中国科学技术大学本科毕业论文第二章智能车的底层硬件系统搭建§1硬件系统的组成:主机系统和底层硬件系统本智能车硬件系统由主机系统和底层硬件系统组成,系统总体结构如图1所示。主机系统由PC机和Kinect传感器构成,用于扫描环境,然后进行图像处理,识别出障碍物及其位置,由避障算法得出小车运动控制信息,并将其运动信息传送给底层硬件系统。底层硬件系统是一个动作执行智能车,它的控制系统由Arduino控制板,驱动部分,通信部分和电源部分构成,用于执行主机系统传来的运动信息,实现避障和其他功能。Kinect传感器电机驱动模块PC机Arduino控制板电机驱动模块无线串口通信模块步进电机(a)主机系统结构图(b)底层硬件系统结构图图一系统总体结构图§2底层硬件系统的核心:Arduino控制板底层硬件系统用以完成智能车的所有运动功能,其中,由Arduino控制板统筹控制各个模块的运行和工作,所以底层硬件系统的核心是Arduino控制板。2.1Arduino简介6 中国科学技术大学本科毕业论文Arduino是一款便捷灵活的开源电子原型平台,包含硬件和软件两个部分。硬件部分由单片机,I/O接口和其他相关电路组成。软件部分即ArduinoIDE,包含程序编译器和程序下载器。Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是利用Arduino编程语言和Arduino开发环境来实现的。2.2Arduino控制板本设计中采用的ArduinoUNOR3控制板,如图二所示。该控制板使用的微处理器是ATmega328。该控制板包括14个数字输入输出I/O口,6个模拟输入输出I/O口,16MHZ的晶体。其工作电压为5V,输入电压为7~12V,每个数I/O口的直流电40mA。存储空间方面,板载32KBFLASHMemory,2KBSRAM和1KBEPROM。图二两块不同厂家生产的ArduinoUNOR3控制板§3驱动部分经过测试我们发现,普通的直流电机无法精确控制其转子旋转圈数,运动的时的稳定性和准确性均无法保证。为了可以精确控制智能车的运动精度,保证运动时动力和稳定性,在驱动部分我们选用了步进电机和其对应的驱动模块,如图三所示。7 中国科学技术大学本科毕业论文(a)步进电机(b)A4988驱动模块图三步进电机及其对应的驱动模块3.1步进电机步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。本次设计采用了四个42系列两相混合式步进电机,其步距精度为5%,步距角为1.8°,轴径为5mm,轴长为19mm,机身长度为31mm,额定电流为1.2A,电机重量约为0.3kg,如图三(a)所示。3.2电机驱动模块这里选用了能与Arduino控制板完美结合的A4988驱动模块。A4988模块是一个内置简单操作转换的微电机驱动模块。它被设计用以控制两相步进电机全,半,四分之一,八分之一和十六分之一下的步进模式,具有高达35V和±2A输出驱动能力。A4988包括一个固定关断时间电流稳压器,具有可在慢或混合衰减模式下工作的能力。A4988只需在一个步进输入中输入一个脉冲,即可驱动电动机产生一个微步,而无需相位顺序表,高频率控制行或复杂的界面。在一个复杂的微处理器不可用或负担过重的时候,A4988模块将是一种理想的选择。8 中国科学技术大学本科毕业论文§4通信部分底层硬件系统与主机系统的通信可以选用有线和无线两种方式,考虑到智能车需要实时运动的特性,有线必然会限制车的运动范围,所以我们选用无线的方式。同时考虑到Arduino与外界的通信均为串口方式,故我们最后选择无线串口通信作为我们的通信方式。4.1Wi-Fi模块如图四所示,这里使用了OCROBOTSEEDWi-Fi模块。OCROBOTSEED基于ESP8266芯片平台,是一种低廉的Wi-Fi串口解决方案模块,其结构简单,只有四根接线口,两根电源线,两根信号传输线。其工作电压为3.3V,可以直接用Arduino主板对其进行供电,另外将两根信号传输口分别接到Arduino主板的两个I/O口上,即可完成将Wi-Fi信号转换成Arduino能识别的串口信号的功能。图四Wi-Fi模块§5电源部分对于底层的各个硬件,即Arduino控制板,电机驱动模块和Wi-Fi模块,均需电源供电。然而,各个硬件所需的额定电压并不尽相同。其中Arduino板的供电电压为5V最大电压为9V,电机驱动模块的输入电压为8-35V,Wi-Fi模块的输入电压为9V。考虑到实际小车运动的动力问题,经过多次试验和测试,最终决定Arduino控制板和Wi-Fi模块使用8V锂电池电源供电,而电源驱动模块使9 中国科学技术大学本科毕业论文用另外的12V锂电池电源供电,以满足电机运动要求。10 中国科学技术大学本科毕业论文第三章基于深度信息的障碍物获取及判定§1Kinect传感器主机系统由PC机和Kinect传感器构成,这里摒弃了以前经常被使用的各种传感器,转而使用Kinect传感器感知周围的环境,故Kinect将是本章研究的核心。1.1Kinect简介Kinect是微软公司与2010年6月针对游戏主机Xbox360开发出的一款传感器,如图五所示。随着KinectforWindows的出现以及代码的开源,加上其功能强大,价格低廉的特点,出现越来越多基于Kinect的开发和研究,逐渐应用于各个领域。Kinect由彩色摄像头,红外线装置,麦克风阵列,逻辑电路和马达等部分构成。Kinect有三个摄像头,除了中间的常见的RGB彩色摄像头外,左右两边镜头分别为红外线发射器和CMOS红外摄像头所构成的3D深度传感器,可以同时获取彩色和深度图像。图五Kinect传感器1.2Kinect深度传感器工作原理深度摄像头的成像原理一般有ToF(TimeofLight)方法和结构光扫描法两种,前者通过计算脉冲光往返时间差测量与障碍物的距离,后者通过对接收到的物体11 中国科学技术大学本科毕业论文表面反射的结构光图案在图像上的位置和形变程度来计算物体表面的空间信息。Kinect中3D深度传感器的核心部件PrimeSensor设备采用了LightCoding技术,它不同于上面提到的一般的结构光技术,而是能投射具有三维空间体编码的LaserSpeckle激光光斑,对测量空间进行编码。由于这种散斑具有很高的随机性,又对距离变化特别敏感,在空间中任意两区域得到的散斑图案都不相同,故可以以此获取物体的空间信息。1.3KinectSDK以及NUIAPI微软在2011年6月推出了KinectforWindowsSDKBeta,方便开发人员使用。SDK主要包括驱动程序,丰富的原始感测数据流程式开发接口(RawSensorStreamAPI),自然用户接口,安装文件以及参考数据,可以使用C++或C#搭配VS平台轻易开发使用。SDK的结构图如图六所示。图六KinectSDK结构图在本设计中,主要使用了SDK中的NUIAPI。NUIAPI是Kinect的核心API,它支持基本的图像和设备管理功能,包括访问访问连接到计算机的Kinect传感器,访问来自传感器的图像及深度数据流和提供处理后的图像及深度数据支持骨骼追踪。运用它我们可以完成后面深度信息获取的工作。§2深度信息的获取12 中国科学技术大学本科毕业论文利用NUIAPI可以完成深度数据的获取。初始化NUIAPI(初始化选项中加入深度选项),通过事件方式,传递一个缓冲区给帧检索方法,获取最近的图像数据帧,数据已准备则拷贝至缓冲区。需要使用该帧数据时,即从缓冲区中取出即可。深度信息的图像帧有640×480,320×240和80×60像素尺寸。每个像素值代表了从摄像头平面到最近对象的x、y坐标面上以毫米为单位的笛卡尔距离,如图七所示。若为0,则表示传感器在该位置范围内没有发现任何对象。图像帧的x、y坐标不代表空间的物理单元,它们表示深度图像传感器上的像素点。x、y坐标的含义依赖特定光学图像传感器的规范。图七深度数据示意图为了适应本设计的内容,这里做了一定程度的优化:因为第一帧数据往往有瑕疵而会影响后面的结果,故这里我们加入了循环等待数据以提取第N帧的数据(如N取3),得到数据我们也进行一些预处理使之代表的坐标值大小与实际的距离单位相吻合。§3基于深度信息的物体识别和位置计算为了从深度信息中识别获和取出障碍物信息,我们需要借助第三方视觉开发库OPENCV库来实现算法。这里借鉴了[1]中的处理方法。3.1物体识别13 中国科学技术大学本科毕业论文深度图像的物体识别是Kinect端的主要算法之一,用以从Kinect的摄像头得到的深度图像中找的识别出物体,以完成后面障碍物的判别。这里主要使用了连通体识别以及多边形拟合等图像处理的经典算法,经过处理后得到前方障碍物的轮廓。首先注意到,由上一步获得深度数据是一个深度距离的二维数组,它的单位是毫米。根据Kinect深度传感器的探测范围,我们可以设置阈值去除过远的距离。然后我们对该数据进行255归一化,以方便后续的图像处理操作。如果实际的场景过于复杂,我们还需去除地面影响,这里可以将无障碍物的场景作为参考帧进行插帧,就很好地去除地面的干扰。考虑到其他噪声干扰,我们使用了膨胀腐蚀等一些算法消除噪声的影响。然后对得到的图像进行连通体识别和轮廓面积计算,从而得到符合一定规则的连通体,即成功识别出了物体。如图八所示,(a)为原始的Kinect提取出的彩色图像,(b)为其对应的深度信息,从图中可以看出在Kinect前我们放置了三个障碍物,与此同时背景中还有其他的一些干扰(比如椅子),另外可以看到,在深度信息中也有很多噪声干扰。运用我们的物体识别算法,可以很好的识别出我们所设置的三个障碍物,见(c)。(a)Kinect提取彩色图,大小640*480(像素)14 中国科学技术大学本科毕业论文(b)Kinect提取深度图,大小320*240(像素)(c)经过物体识别后的算法得到的结果图图八物体识别算法示意图3.2位置计算首先定义智能车的运动坐标系,如图九所示,定义智能车所在中心位置为原点,运动在X-Z平面上,Kinect所对的方向为Z方向。图九智能车运动坐标系考虑物体相对于智能车的位置,只需考虑其在X方向和Z方向上的相对距离即可。其中Z方向上的相对距离可以通过深度数据直接获得,所以我们的重点在于如何获得物体在X方向上的距离。这里我们利用成像原理完成摄像头的标定。在精度要求不高的情况下,我们以光学中的针孔模型近似深度摄像头的成像模型。在二维图像中,可以通过像素点(u,v)偏离图像中心位置(u,v)的坐标,00并利用针孔成像模型进行计算得到(u,v)点在X方向上的物理中心偏移距离:15 中国科学技术大学本科毕业论文ddepth(u,v)x=(3-1)|u−u|f0x上式中,d是(u,v)点在X方向的物理偏移距离,depth(u,v)表示该点对应的x深度距离,f为摄像头内部参数,表示X方向上的焦距,可以在官方文档中查x到。化简上式即可得到:depth(u,v)d=|u−u|x0fxz=depth(u,v)(3-2)由于深度数据采集图像的尺寸为320*240,故图像的中心位置(u,v)为00(160,120)。所以通过(3-2),我们仅由像素点(u,v)处的深度值,获得了其在X方向上的相对距离。一旦我们推导出了空间内某一点坐标的求解方法,我们即可通过计算得到所示别处物体相关信息,包括物体的深度距离,物体的宽度,物体左右边界距离中线Z=0的距离等,将这些信息保存在数组中,如图十所示,供之后处理使用。图十物体信息记录示意图§4障碍物判定由之前的操作我们已经实现了智能车前方物体的识别和位置的计算,接下来就需要判断前方的物体是否对智能车构成威胁,如果构成了威胁,则将其判定为障碍物,否则不予理睬。判断一个物体是否构成障碍物,不仅与该物体的位置有关,还与智能车的大小有关,所以我们需要制定障碍物判别准则。我们首先设置一个大于智能车二分之一宽度的安全距离,然后对于之前识别的每一个物体进行遍历,并将其归为三类,并分析其是否对于智能车构成障碍物。根据障碍物相对于智能车的位置,分为以下三种情况:16 中国科学技术大学本科毕业论文左边:物体右边沿的X坐标处在X轴正半轴且小于安全距离;右边:物体左边沿的X坐标处在X轴负半轴且小于安全距离;中间:物体左边沿的X坐标处在X轴正半轴且物体右边沿的X坐标处在X轴负半轴。需要注意的是,两个障碍物存在着合并的可能性,比如两个障碍物都位于左边,那么会将它们视作一个整体,只需关注更右边的那个障碍物的右边沿即可。物体的放置如上一节图八(a)所示,在智能车前方有三个障碍物,它们分别位于左边,中间和右边。使用本节中的障碍物判断算法,即可得到如图十一所示的结果,三个物体全部被判断为了障碍物,符合之前的假设。图十一障碍物识别结果17 中国科学技术大学本科毕业论文第四章智能车避障算法以及试验结果§1智能车避障算法通过第三章的内容我们已经成功通过Kinect深度数据获得智能车面前的全部障碍物的信息,下一步即是制定智能车避障算法。即对于不同的障碍物分布情况,智能车执行相应的运动策略。1.1避障算法具体的避障算法只需考虑两种情况,第一种是只有一个障碍物,第二种是存在两个位置的障碍物。对于这两种情况,分别制定不同的避障策略。情况1如果只有一个障碍物,有上述讨论可知,存在三种位置关系:如果若障碍物位于左边,则应当右转;如果障碍物位于右边,则应当左转;如果障碍物位于中间,则分别判断哪个左右边沿距离最近,如果障碍物的位置为中间偏右,那么智能车向左运动,相反,则向右运动更加合适。如图十二所示,智能车前方有一个物体,且物体的位置相对靠右,所以应选择左转。图十二机器人前方有一个物体情况2对于两个障碍物,首先判断是否存在着合并障碍物的情况。如果两个障碍物都位于左边,那么只需这两个障碍物看成一个,同时只关心两个当中更右边的那个障碍物的右边沿距离即可。同理,两个障碍物都位于右边,也只需关心最左边18 中国科学技术大学本科毕业论文障碍物的左边距离。如果两个障碍物一个在左边,一个在右边,那么首先需要计算两个障碍物之间的距离,当距离大于智能车宽度时,智能车直接穿过即可。否则,则需要选择左转和右转之中所需偏移距离最小的那个。如图十三所示,智能车前方有两个障碍物,分别位于智能车的左边和右边。首先判断两个障碍物之间的距离并不足以使智能车通过,故需要分析智能车左转和右转的代价,很显然右转所需的偏移距离更小,所以此时智能车应右转。图十三智能车前方有两个物体1.2通信对于由避障算法得到的结果,需要将实际需要运动的数值转换为Arduino控制端的数据,然后通过wifi通信模块以串口的方式传输到Arduino控制板上即可。这里具体的通信方式采用Socket编程。1.3智能车运动控制在底层运动端,使用Arduino控制板完成智能车的运动控制。主要任务为接收通信和控制电机两个部分。在接收通信部分,使用Serial.available()判断是否串口传来信息,若有,则通过Serial.read()接收读入的数据。在控制电机部分,需要将读入的数据转化为电机控制信息,以实现智能车的运动。对每一个电机,根据A4899模块,我们可以分别定义方向接口dirPin和步进接口stepperPin,其中dirPin用于控制电机正传还是反转,而给定步进数19 中国科学技术大学本科毕业论文steps,即可使用以下代码控制单个步进电机运动:1.for(inti=0;i