飞思卡尔智能车
2011-11-25 17:18:41
访问量:2889789
我就是从这篇文章开始的,希望你也是。
我的智能车经历
--范浩锋
前言:
从我接触智能车到现在已经差不多快一年了,第一次听说飞思卡尔智能车这个竞赛还是在大一时的一次学长的交流会上,当时我也刚刚接触电子,什么也不了解,听说小车能够循着黑线跑感觉挺有趣也挺神奇的,于是我便开始去了解飞思卡尔智能车。当然开始也只是随便浏览些资料,还不是涉及到里面核心的内容,大一暑期因为参加电子设计集训,再加上对智能车的热情所以就准备做辆能够循迹的小车玩玩,通过网上资料的查阅与学习,我知道了要做一辆循迹小车必须具备哪些模块,当然这是我第一次做循迹小车所以我采用比较简单的红外对管作为循迹传感器,单片机采用初学的89S51,鉴于红外对管和单片机都是5V供电,我采用了经典的7805稳压芯片作为5V供电电路。当时驱动电路用的是L298电路,车模选用的是比较简陋的玩具车加了个自己买的舵机。这样一辆红外循迹车就成形了,当然那时候根本就没用到速度反馈,通过几天的软件调试我的小车居然能在黑线跑道上跑起来了,当时别提有多兴奋了,虽然直线跑的扭来扭去,程序也没加什么算法,但是它也成功的行驶在了赛道上。也许这个经历为我之后的飞思卡尔之路打下了一定的基础。我真正接触飞思卡尔智能车是在大二寒假,那时我很荣幸的被选入了第五届智能车队。从此我便开始了为期8个月的智能车道路,下面就来谈谈我的做车经历吧。
在此之前,我想说的是一些作为一个做车的人必备的一些素质。首先,我们既然选择了智能车,那么就应该对智能车充满激情,要有一种坚持不懈敢于探索创新的精神,有必要通宵的时候就该通宵。其次就是要有一种很强的团队意识,我们不是一个人在努力,而是整个团队在努力,如果没有大家的共同付出你也不会有赛道去调试。一个完整的团队总是分工很明确的,我们整个团队可以根据个人的优势和兴趣分成多个小团队,有的可以负责机械、有的可以负责软件、有的可以负责硬件、还有的可以负责创新与调试等等,这也是我们第五届的智能车队采取的管理方式。或许在这方面做的最好的应该就属传统强队“北京科技大学”了。另外就是不要因为自己比别人起步晚而失去信心,只要自己努力了就能赶上他们,甚至还能超越他们。也许我们在调试小车的时候会碰到很多这些那些的问题而烦躁,但是我们能够承受住这些压力,通俗的讲就是要耐得住寂寞,尤其是后期调软件的同学。我觉得在智能车的赛场上没有失败与成功的区别,只有努力与不努力的区别,只要你努力去做了,即使最后没有获得大奖那你也是成功的,当然我们大家都希望自己能够获得荣誉,能够为学校争光哈。
入门:
我们开始做智能车之前都是对智能车不怎么了解的,都是要从一段时间的学习去慢慢的懂得其中的一些知识与技术。那么智能车该如何入门呢?这是每一个新手都会碰到的问题,我当时也是经历了那么一段迷茫期,就是不知道该如何去开始制作智能车。那么此时,我们就要向学长们请教一些经验,一些学习的技巧。一开始要多读历届强队的技术报告,这样对学习的促进会很有利的。我是做摄像头组别的软件部分,所以我就来说说我做摄像头车时是如何入门的吧。我觉得吧,首先,第一个要学的就是S12单片机,如果之前没接触过单片机的那么先可以学习51单片机练练手,以便更好的上手飞思卡尔单片机,当然如果你觉得自己有能力的话就可以直接用S12单片机做入门,因为当时我们车队里面就有几个人之前什么单片机都没学过就直接开始学S12了,后面他们也能运用的很好。学习S12单片机的时候就要分模块去学,然后给自己制定目标,哪几天学习哪几个模块等等,这样的话差不多应该半个月就能把单片机玩的很熟练了。注意在学习PWM的时候,如果在同一个周期内单片机给PWM值的话它是不会有反应的,所以给PWM的周期必须比PWM自身的周期长,以及舵机和电机的PWM控制最好用16位级联,这样就能更精确。在学中断的时候记得要清标志位。在学习单片机的同时你还可以抽点时间了解一下智能车的整体结构,它主要分哪些模块,每个模块有哪些作用等等,以便能够更短的时间让车子跑起来。
※摄像头的选型:
做摄像头车的话,一开始我们还要了解一些关于摄像头的知识,用示波器采集视频信号并且从信号上分析,虽然这波形可能也看不懂,但是我们可以学习到一些知识。从摄像头出来的一些同步信号我们要清楚,什么时候该采集图像什么时候该舍去,这些都是以后写软件所必须的。还有,摄像头的选型也很重要,选CCD还是CMOS?这也是一个很重要的事情,因为他们各有千秋,CCD成像稳定,动态效应较好,CMOS动态环境下容易糊,但是CMOS功耗低,重量上有优势,大多比较小巧,而且CCD供电需要12V而CMOS可以在5V~12V之间都能工作。我们学校采用的好像都是CCD的模拟的摄像头,从全国诸强看的话,大概CCD和CMOS都平分秋色吧,CMOS的强队典型有北京科技大学,CCD的强队有上海大学和南京师范大学,上海交大等很多学校采用的数字式的摄像头,当然各自有各自的优势吧。我们学长曾经把黑白摄像头和彩色摄像头做过比较,发现彩色的摄像头的对比度比较鲜明,更有利与分辨黑白。对于选择CMOS和CCD的话我们可以做一些尝试吧,因为我们那届就没有去尝试,直接沿用学长方案了。摄像头也有好坏之分,买摄像头一定要买SONY或者夏普芯片的,它们的成像都比较清晰,有些杂牌摄像头的话可能动态效应就不是很好,记得我
在全国赛前几天换上去一个不知道什么芯片的摄像头,结果原来可以的起跑线检测程序变得检测不出来了,后来折腾了很久才发现原来是摄像头的问题,高速状态就模糊了,导致起跑线直接被硬件滤掉了。由此看来摄像头的选型还是很重要的。
※电源模块:
一辆智能车要运行就必须供给各部分适合的电源,摄像头车的话基本上就以下几部分:升压12V电路,单片机及其他部分5V电路,3.3V储存卡及液晶的供电电路,6V舵机供电电路。这些电路基本在各种大学的或者我们的技术报告中都能找到,注意升压电路要稳定,不能被电机驱动给拉低电压,单片机供电要线性电源,也是讲究稳定性,不然的话单片机很容易复位,到时候可能由于这个原因而纠结到底是程序问题还是硬件问题,所以这些都是要之前都做好准备的。舵机其实可以直接用电池电压供电,但是这样会极易损坏,所以6V的电源电路还是需要的,毕竟我们还需要几个月的调试呢。一个稳定的电源模块就能为你的后期调试节省很多的时间。
※电机驱动:
智能车上的电机是直流电机,电流很大,因为单片机的I/O口根本没法驱动,所以必须采用驱动电路,驱动电路也有多种,全桥与半桥都有采用。我们采用的是集成半桥的芯片组合的一个全桥驱动,这个方案也是从上海交大的车上了解来的,全桥的话可以控制电机正反转,对于高速行驶的智能车的急刹有一定的效果,而半桥驱动是只能控制电机往一个方向转,要刹车的话就没有全桥那么灵活自如,但是它可以短路一个桥壁来制动刹车,也能起到很好的效果。驱动设计必须以驱动电流大、内阻小、功耗低为前提,由于全桥驱动利用反向电流进行制动刹车,加剧了电机的损坏,所以可以尝试用半桥驱动进行物理制动,并研究新的软件制动策略。其实我们两种方式都采用过,后来用惯了全桥就一直用全桥驱动了。
※PCB制作
PCB的制作主要的原则是经济、合理、美观、可靠。布线过程中,在工作稳定性要求方面同一级电路的接地点应尽量靠近,加粗强电流引线以减少自激,阻抗高的走线尽量短可以提高抗干扰性,完整合理的布局决定了整个PCB的基础。其实我们最初因为经验不够投来的板子都是不可用的,当时浪费了很多元器件,所以我们画板布局的时候一定要注意。
车模机械结构:
在动手制作之前,我们先要了解的是一些模型车的结构,这些东西在网上都能找到,对于如何调校车模在很多技术报告中都有详细的介绍。去年我们采用的
B型车模结构比较复杂,所以我们在车模方面的投入也注重了很多。一些车模的参数都是比较重要的,比如说车高、重心、差速、虚位、前轮的内束和外张角、主销倾角以及悬挂调节等等,各种结构的调节都有一定的标准,根据自己车子的情况可以做不同的调整。在全国赛之前调试的那段时间里,我的车差速老出问题,导致一些连续弯道一直过不好,最后还是先去把差速调整好了才能继续下去。我觉得最好能够亲自去一些模型店与一些车模玩家亲自交流一下,这样的话会有很大收获的,我们今年就去过一个车场请教过,的确也收获了很多。我觉得一辆车能够跑的快跟它的良好的机械结够有着密不可分的联系。像第四届的北科与上大还有第五届的南京师范大学都是在机械上做了很大的文章,对于机械的研究调校是随着软件的进步逐渐体现出来的,可能就会导致翻车等现象,当一辆车软硬件做到极致之后也许受制约的就是机械问题了。
纵观历届获得很好名次的一些学校,我们都会发现他们的车子都很漂亮的,机械架构都是比较清爽整洁。以此看来,如果想要让车跑的快那就首先要架出一辆漂亮的车,不管车子跑不跑的快,一辆整洁漂亮的车给人的第一印象就觉得是一辆能跑的好车,架车方面也有一定的技巧,如低、轻、少、巧等。我们前期架的车应该是比较耐用的,因为前期程序或硬件不稳定会导致车子经常跑出赛道,这样的话可以很好的保护车子,中期应该架的是轻巧型的车子,有利于提高速度。后期那就是要做辆美观型的车子,因为后期的话基本上已经成型了,一辆漂亮的车可以让视觉上得到震撼力,尤其是去参加比赛的时候,别人就自然而然会把你认为是辆好车。
对于摄像头的架法也可谓是多种多样,高高低低都有,但是摄像头的架法还是有一定的讲究的,首先,是架高还是架低的问题,把摄像头架高的话有利于提高前瞻,远处图像也会比较清晰,反光问题就比较小,有利于做赛道分析判断,但是这样又会导致车模的整体重心增高,所以就要做到底盘和电路板尽量架得够低,摄像头就可以架得适当的高。而摄像头架低的话会使车的整体看起来比较轻巧,但是远处图像畸变严重,很多情况下会遇到反光,图像处理要求比较高,但是这样的架法可以使得车模整体重心降低不容易翻车,对于反光而言我们可以用偏光镜滤掉一部分的反光,我们备战全国赛的车就是架成比较低的,我们发现这样的确有利于提速。其次是摄像头的倾角问题,摄像头的倾角也是比较重要的一项,因为摄像头的图像接近中心部分就比较清晰,而越到边上就越模糊而且畸变也逐渐增大,所以要使得你所拍到的道路图像在中心部分,这样也可以利于图像算法的处理。
舵机架法,自从有学校开始采用加长舵机力臂之后的每届比赛,基本上我们都会对舵机进行位置调整与舵机臂长调整,舵机可以竖直立着,也可以平躺着,
还可以侧趟着,这些方法都有人采用。舵机加长臂长可以使反应时间减少,有利于更快速的摆角。但是这也要看舵机的负载能力的,比如我们用的B车舵机它就不能把臂长加的很长,因为它能承载的力不够,加长臂长之后舵机的力就无法带动前轮的转向了。舵机的两根推杆要与车底盘平行,并且要等长,其实舵机的架法对于智能车也起着举足轻重的作用。
软件调试:
我是负责写软件部分的,作为一个写软件的,那么我们就要做好打持久战的准备,因为我们的任务只有在比赛完了才算正真完成。我们平时写软件一定要保持一个良好的习惯,那就是每天新建一个工程进行调试,不要每天都在同一个工程中改参数,因为在后期我们的程序已经是很烦琐了,稍微做一些修改就会发生很大的变化,万一程序越该越差那就可以从前几天的程序中找到原来的程序再进行修改。我发现我的那个程序文件夹里面已经建了近200个工程了。还有要把能够使车子跑的不错的程序做一下记录,以防万一后来想用的时候找不出来了。
※图像采集与处理
图像采集主要有单片机的中断执行,根据图像信号中由1881分离出来的行同步信号以及场同步信号进行图像采集处理。摄像头的图像是分奇场和偶场的,但是在小车行进过程中奇场和偶场的图像是有一些区别,所以我们就把奇场和偶场单独使用作为一幅图像。由于单片机内存有限,所以我们采集的图像分辨率不能达到很大,我们尽量在单片机内存允许的范围内尽量使图像的分辨率达到最大,毕竟图像更清晰就更容易进行图像处理以及控制算法的研究。有些学校他们采集图像还采用其他方法,比如说北京科技大学就直接把图像给硬件二值化了,这样单片机的图像处理就简单了许多。有时候我们可能会碰到采集的图像偏黑、偏暗,黑白对比度不明显,这些有可能是因为图像的基准电压处了问题,或者AD采集出了问题。还有时候会碰到程序进不去,车子毫无反应的现象,这些的话有可能就是图像同步信号没有出来中断没有进去等等。
图像处理是摄像头软件的核心部分,没有一个稳定的图像处理算法就无法去做控制算法。所以前期最重要的就是图像处理,对于图像的处理就必须先花时间利用SD卡或者flash卡采集大量的原始图像,这个原始图像最好包括了各种恶劣的情况,比如说很暗的角落或者反光强烈的地方等等,然后利用上位机在电脑上做反复调试、处理原始图像,直致做到基本每幅图像都不会丢失为止。在图像处理中最常见的就是边缘检测法,根据阈值来判断黑线和白底,由于同一幅图像中也会有明暗变化,就会导致同一个阈值无法将整幅赛道给提取出来,所以我们就有必要将阈值给动态化,这样就能更好的适应光线的突变,使得每幅图像都能
检测检测出来。图像处理部分可以去参照上海大学和上海交大的报告,里面有些很好的算法研究。
起跑线和坡道的检测有时候也是比较重要的,比赛规定不能在起跑线一定区域内停下来就会罚一秒。检测起跑线可以在图像近处检测,这样的化可以更清晰的看到起跑线,检测方法可以有很多种,用的最多的应该就是检测多段黑线的宽度,并且要经过多次测试去实现。对于坡道的检测可能在摄像头车方面用处不是很大,但是有时候就会用到,比如说车速过快过坡会飞起来导致落地不稳,又或是过坡之后一个急转弯,小车就来不及刹车了,今年全国赛就出现了这样的情况。对于检测坡道我们采用的是判断前瞻变化,过坡的时候前瞻会出现越来越小的情况,利用这个特征进行处理就应该能检测到坡了。
※控制算法
在一套稳定图像算法的基础上我们就必须去研究合理的控制算法,一套优秀的控制算法和一套稳定的图像算法配合起来那就会使得我们小车的路径更加优越。首先是电机闭环控制算法,它基本上可以可以分为PID算法和bang-bang算法还有就是两种方法的联调,bang-bang算法是上海交大采用的算法,他们报告中说道电机由驱动控制,控制特性较软,而bang-bang算法比较适合,他它的工作原理就是在一个特定范围内输出不变,高于这个范围就输出最小值,小于这个范围就输出最大值,这个算法对于A车模比较适合而对于机械传动比较复杂的B车模来说容易损坏齿轮。PID算法是一个典型的算法,我们大多数都是采用这个算法的。他由比例P、积分I、微分D组成,对于PID算法,资料是很多的,只要找一份好的认真看几遍就能熟悉了。直观的举个例子吧:
假如你控制一个人让他以PID控制的方式走110步后停下
(1).P比例控制,就是让他走110步,他按照一定的步伐走到一百零几步(如108步)或100多步(如112步)就停了。(2).PI积分控制,就是他按照一定的步伐走到112步然后回头接着走,走到108步位置时,然后又回头向110步位置走。在110步位置处来回晃几次,最后停在110步的位置。(3).PD微分控制,就是他按照一定的步伐走到一百零几步后,再慢慢地向110步的位置靠近,如果最后能精确停在110步的位置,就是无静差控制;如果停在110步附近(如109步或111步位置),就是有静差控制。
对于调PID参数也是一个比较麻烦的问题,有时候我们必须从几百几千组数据中去找出那么一组比较好一点的来使用。在调参数的时候要把状态和参数记录下来以便能够找出最适合的一组数据。
速度控制也可以有很多种,北科采用的就是二次函数曲线给定速度,中间速度比较大,两边逐渐减少,就是在直道上速度最大,弯道逐渐减小,我们那时候
也是仿照他们的思想差不多的控制策略。我们还可以根据赛道分析在不同的曲率半径下的道路给予不同的速度,不过这个前提就要赛道分析比较精准,一出差错就会跑乱掉。
舵机打角控制也是重点之一,整个小车方向的控制就是靠它的作用。对于何时打角这个问题就是在于控制,我们都知道舵机的反应是有延时的,所以我们必须在入弯差不多半米就要给它信号控制了,舵机控制在上海大学的报告中指出的是PD控制,这个在他的报告中介绍的很详细,还有的就是我们采用的三段法控制,三段法就是在直道一种打角,弯道一种曲线式打角,两边则打到舵机能够达到的最大值,这样的话就可以实现小S的直走,大S的切弯等等,不过这个打角参考行的选取也是要通过实际测试在得出来的。其实大S弯要走好也是要通过很长一段时间的调试的,我当时就是其他弯都能跑好但就是大S弯跑不好,这也是非常纠结的问题,后来我发现大S弯的的打角就是要打的较远才行。
我们在小车调试过程中,一般以上这些都是联调的,只有在整体配合好的基础上才能使车子跑好,后期的工作也主要是这些,别看只有这么点东西,实际上的工作量还是很大的,有时候在很长一段时间内就一点速度都提升不了,所以我们还必须采用上位机进行调试,应该在车子运行过程中我们无法知道具体的路径和数据是什么,但是有了上位机之后就可以把数据储存下来发到电脑上用上位机进行观察,然后就能很直观的反应问题了,不然的话我们就是在盲调,盲调是很浪费时间很没效率的,所以我们就亲自针对自己的车子写了自己的上位机,并且还能把单片机中的算法加入其中,这样就能把单片机的处理和上位机的处理进行比较了,这是一个既省时又方便的调试方法。
总结:
总之,做一辆好车不是一天两天的事情,而是一个长期的积累,吃得苦中苦方为人上人。我们在平时要多浏览那些强队的技术报告,通过多种方法的比对总能得出自己想要的结果,我觉得智能车制作这个网站上有些资料还是蛮有用的,各个学校分享出来的一些技术资料我们都是可以去学习学习,自己的一些新想法可以去实践一下,可能经过一段时间的努力就能成为一种方案。并且我们不要轻易去否定一些新观点,或许这些观点方法就是你以后需要努力的目标。最后我想说,智能车的生活虽然有点枯燥,但是在经历了这些之后,我们会慢慢发现自己长大了许多,也许当你回头观望时你会发现,原来这是一段多么难忘的回忆啊。