摄像头组 国防科技大学 摄像铁军一师 技术报告.doc
-
资源ID:51825722
资源大小:370.50KB
全文页数:42页
- 资源格式: DOC
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
摄像头组 国防科技大学 摄像铁军一师 技术报告.doc
第七届“飞思卡尔”杯全国大学生智能汽车竞赛技 术 报 告学 校:国防科学技术大学队伍名称:摄像铁军一师 参赛队员:赖 俊陆书海唐邓清带队教师:技术报告和研究论文使用授权的说明 本人完全了解第七届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。参赛队员签名: 唐邓清 陆书海 赖 俊 带队教师签名: 日 期: 目录目录I第一章 引言11.1 整车设计思路1第二章 系统控制策略22.1 智能车系统控制的特点2第三章 硬件设计43.1 小车机械改造43.1.1 码盘功能及选型43.1.2 舵机的改装53.2 摄像头的对比选型63.3 CMOS 摄像头接口设计73.4 电路设计8第四章 软件设计11第五章 总结11第六章 车模规格11参考文献I附录II第一章 引言1.1 整车设计思路智能汽车比赛关键就是能以较快的速度在符合组委会规定下完成比赛,由此我们把小车重要模块分为三类:环境感知系统、自主决策系统、操作执行系统。这三个组成部分,相互联系、相互制约,共同完成控制任务。环境感知系统,我们的该部分主要包括感知路面信息的传感器和感知车体状态的传感器。我们选用CMOS 摄像头:获取赛道信息。光电码盘:得到车体当前速度。自主决策系统,通过对单片机的编程来实现决策控制。操作执行系统,也就是硬件系统,主要就是相应的驱动电路。三系统相互合作,帮助小车跑的更好更快。比赛要求在组委会提供统一智能车竞赛车模下、我们选用飞思卡尔公司的16 位微处理器MC9S12XS128 为控制核心,应用BDM 在线调试,采用CodeWarrior 软件、无线串口、红外遥控等作为调试工具进行调试制作出一个能够自主识别路线的智能车,它将在专门设计的跑道上自动识别道路行驶。比赛要求在不违反大赛规则的情况下以最短时间完成单圈赛道。第二章 系统控制策略2.1 智能车系统控制的特点为保证小车一直沿着2根黑色的引导线快速行驶,我们对控制对象小车的转向和车速应该十分的注意。即应使小车在直道上以最快的速度行驶。在进入弯道的时刻适当减速,且角度的转向要适合弯道的曲率,确保小车平滑地转弯,并在弯道中保持恒速。从弯道进入直道时,小车的舵机要转向至中间,速度应该立即得到提升,直至以最大的速度行进。为实现上述控制思想,我们采用不同的控制方法来控制小车的转角和速度。(1) 转角的控制调整舵机的原则是:小车处于直道,则摆正舵机。小车处于弯道的曲率越大,则将舵机的转角摆的越大。(2) 车速的控制因为小车比赛的赛道是未知的,弯道的分布情况也不能确定,小车可能频繁的进出弯道,不停的调整速度来适应不同轨迹。所以,本系统需要对智能车的速度进行控制,使得小车的速度能够频繁地变化,且能在很短的时间内由当前速度转变为我们期望的转速。基于这几点的考虑,本系统选择了PID控制算法来控制转速。设计思路如下:小车后轮安装的旋转编码器可以在后轮旋转一圈后产生600个脉冲,所以,本系统通过每一段时间dt读入脉冲数间接测得转速speed,将speed与期望小车运行的速度speed_enactment比较,由以下公式求得速度偏差ek与速度偏差率dek。ek = speed_enactment speed; (式3.1) dek = ek ek1; (式3.2) 式3.2中的ek1为上一时刻的ek,经过增量式PID算法,以及对其参数的反复调试,我们就可以得出PWM输出信号,该信号可以控制后轮的驱动电机来调整小车行驶速度。2.2 智能车系统控制方案的设计本系统根据路径识别单元和车速检测单元获得的路径和车速的当前信息,控制转向伺服电机和直流驱动电机联单相应的调整智能车的行驶方向和速度。最终的目的是使智能车在直道行驶时方向迅速保持稳定、不抖动,同时速度迅速升到最大值并达到稳定。小车在行驶过程中会遇到以下几种情况: (1)当小车由直道高速进入弯道时,转角方向和车速应根据弯道的曲率迅速做出相应的改变,原则是弯道曲率越大则方向变化角度越大,车速越低。(2)小车还会遇到大小S弯,回环弯等多种复杂的赛道,在判断出前方赛道路况的基础上,我们要对各种不同的路况对自己的算法做出相应的改变,以期能快速、平稳地通过赛道。小车角度的控制采用开环控制。根据不同的检测路径,判断出小车所在位置,按不同的区间给出不同的伺服电机PWM控制信号,小车转过相应的角度。为了使得赛车能够平稳地沿着赛道运行,需要控制车速,使赛车在急转弯时速度不至过快而冲出赛道。通过控制驱动电机上的平均电压可以控制车速,但是如果开环控制电机转速,会受很多因素影响,例如电池电压、电机传动摩擦力、道路摩擦力和前轮转向角度等。这些因素会造成赛车运行不稳定。通过速度检测,对车模速度进行闭环反馈控制,即可消除上述各种因素的影响,使得车模运行得更稳定。第三章 硬件设计3.1 小车机械改造3.1.1 码盘功能及选型光电编码器有如下功能:1)将角度位移按一定的比例关系转换成输出脉冲数;2)将角速度按一定的比例关系转换成输出脉冲频率;我们用过小巧的500线双线编码器,配发的齿轮和小车的差速器齿轮啮合得不是很好,并且在校赛前离奇损坏,这也可能跟它为拆机货有关,从这我得到的教训是不要盲目追求最轻最小巧,而应该从小车的整体出发考虑整个系统的稳定性和高速性,选择适合的编码器最后我们采用实验室配发的码盘对速度进行检测,采用闭环反馈来实现速度控制,码盘具体情况如下图:图图3-13.1.2 舵机的改装 由于舵机初始位置空程较大,所以我们自行建模,对比试验,最终选择平放舵机来提高响应速度灵敏和足够的转角,在改装的初期,因为舵机安放位置和舵机拉杆的长度有选择到位,使得小车前轮空乘特别大,舵机使不上力,小车在赛道上甩尾特别严重,使得舵机经常坏,需要经常更换。通过了一段时间改造,我们小车舵机位置最后固定,见下图:图3-23.2 摄像头的对比选型目前市场上的摄像头所采用的感光器件分为 CCD 和CMOS 两种。与CCD 摄像头相比之下,CMOS 摄像头不需要斩波升压来提供电源,并且具有较强的可编程控制能力,也不需要额外地进行A/D 采样,我们认为各方面都更适合于作为小车的视觉传感器。CMOS 图像传感器产产品种类很多,大部分是彩色的分辨率也很高,考虑小车的具体情况,小巧而CIF 分辨率甚至QCIF 分辨率的黑白摄像头足够满足小车赛道情况采集与路径识别的需要。摄像头具体情况见下图:图3-43.3 CMOS 摄像头接口设计在选定 CMOS 摄像头型号后,紧接着的工作就是如何把摄像头与主控器连接起来,构建方便可靠的数据传输通道。在实践中,我们选择了用FIFO 做数据缓冲的方法设计摄像头的接口。这样我们就可以采用流水线方式,提高CUP 利用率,即启动采集(曝光), 启动传输,等待数据(启动下一次曝光),启动传输。FIFO 内部的核心部分是双口SRAM,只是把地址信号集成到片内,由读写时钟自行产生地址指针,外部控制上要比双口SRAM 简单许多。通过对FIFO写时钟的控制,可以最大限度地利用内部存储空间。由于 FIFO 在写操作时,只需要一个写时钟信号进行同步就可以。读操作也类似于写操作,由单片机产生读时钟,FIFO 就会自动把数据挂到总线上。下图是 FIFO 的读写操作时序图:图3-53.5 电路设计 我们为了使小车在行驶的过程中更加稳定,我们不仅从机械上尽量减轻整车重量,降低车体重心位置,同时使电路设计尽量简洁,尽量减少元器件使用数量,缩小电路板面积,使电路部分重量轻,易于安装。我们在对电路进行详细、彻底的分析后,对电路进行了大量简化,并合理设计元件排列和电路走线,使得单片机在超频条件下能够稳定工作,这样使本系统硬件电路部分能够紧紧贴在车模底盘上面。 第四章 软件设计本系统控制软件采用大赛提供的CodeWarrior软件及BDM作为调试工具,此外,厂家提供的编程环境支持C语言和汇编语言的程序设计,以及C语言与汇编语言的混合编程,大大方便了用户的程序设计,提高了系统开发效率。本系统程序代码使用C语言编写。本程序设计由以下几个模块组成:单片机初始化模块,实时路径检测模块,舵机控制模块,驱动电机控制模块,中断速度采集模块,速度PID控制模块。(1)单片机的初始化模块包括:I/O模块、PWM模块、计时器模块、定时中断模块初始化。(2)实时路径检测模块:我们运用CMOS摄像头获取前方道路的信息,通过二值化方法得到了两条引导线的位置,通过与CMOS摄像头和FIFO的时钟配合,我们的摄像头捕获速率可以达到40到50fps。(3)舵机控制模块,驱动电机控制模块:通过直接输出PWM信号控制。舵机的控制采用开环控制,驱动电机采用PID算法闭环控制。(4)中断速度PID控制模块实现:通过输出比较中断实现每10ms产生一次中断,并由累加器从旋转编码器信号线读入脉冲数,通过增量式PID运算得出PWM信号值输出控制转速电机控制速度。第五章 总结自去年12月开始学校的智能车选拔,我们已经走过九个月的历程,一路拼搏,一起参加了校赛、省赛,赛区赛,这一路上我们历经风风雨雨,走到现在。在小车的各方面设计,我们都有详细的分析和思考,并尽自己的最大能力将整车的结构与算法调整至最佳水平。与此之外我们在各个细节方面进行了优化。现在,面对即将到来的大赛,我们充满了信心,在这几个月的备战中,非常感谢实验室的大力支持,在此特别感谢一直支持和关注智能车比赛并给我们悉心指导的老师和学长。同时也感谢比赛组委会能组织这样一项很有意义的比赛。 第六章 车模规格车长:28cm车宽:17cm车高:29cm车重:920g检查所用电容不超过组委会要求参考文献1 邵贝贝, 嵌入式实时操作系统LCOS-(第2版), 清华大学出版社,20042 邵贝贝, 单片机嵌入式应用的在线开发方法M,清华大学出版社,20043 邓兆祥、褚志刚等,“汽车前轮定位参数优化设计”,重庆大学机械传动国家重点实验室4 谭浩强,C 程序设计(第二版) ,清华大学出版社, 1999.12 5 Motorola, MCS12ATD10B8C Block User Guide V2.1, 2003.2.21 6 Motorola, MCS12ECT16B8C Block User Guide V1.04, 2002.7.18 7 Motorola, MCS12PWM8B8C Block User Guide V1.16, 2002.3.14 8 Motorola, MCS12CRG Block User Guide V3.08, 2002.3.119 孙同景、陈贵友,Freescale 9S12 十六位单片机原理及嵌入式开发技术,机械工业出版社,200810 王威,HCS12微控制器原理及应用,北京航空航天大学出版社,200711 赵广林,常用电子元器件识别/检测/选用一读通,电子工业出版社,2009附录附录 A 算法源程序/=/一、文件包含部分,局部宏定义,外部变量定义/1.1 系统文件: /这些文件可能是要替换的:与单片机的型号对应#include <hidef.h> /* common defines and macros */#include <MC9S12XS128.h> /* derivative information */1.2 自定义头文件: /这些文件应该不用修改#include "main.h" /主函数 头文件#include "InitMCU.h"/硬件初始化 头文件 #include "GetSensorInfo.h"/取得传感器信息 头文件/#include "Controller.h"/=/二、变量定义:/=uchar watchtemp;uint edge_count=0;clan Rise_clanCLAN_NUM;clan Fall_clanCLAN_NUM;int Fall_clan_num=-1;/必要时改为int int Rise_clan_num=-1; int rise_main_edgeEDGE_NUM;int fall_main_edgeEDGE_NUM;int rise_main_edge_index=-1;int fall_main_edge_index=-1;Lane_Class Main_class;Lane_Class Sub_class;word gSpeed; /根本不可能溢出/word gSpeedLeft;/word gSpeedRight;word gPulseAcc;word gPulseAccLast;uchar speedtfbuffer 512= 0 ;/投影用到的数据/int gXCenterLINE_NUMBER; /X的中心位置int gXParaLINE_NUMBER; /X的比例系数int gYValueLINE_NUMBER; /Y的索引值uchar gMINPNOITLENLINE_NUMBER;uchar gMAXPNOITLENLINE_NUMBER;typeRealLane gReal_FallLINE_NUMBER;typeRealLane gReal_RiseLINE_NUMBER;int sumX=0; /''''''''''''int averX=0;int SUMP=0;/三、函数定义:/= int abs(int a)if(a>=0)return(a);else return(-a);/=以上为调试的程序 void InitProjectPara(void) int i; int bottomX =87; int topX = 86; int bottomW = 11; int topW = 4;/5; int Y0 = 154;/150; int K0 = 331*X_PARA; long KY = 43730; long BY =-123 ; /必须保证,其值的合理性,首先必须比零大,而且必须有一定的绝对值,保证精度 for(i=0;i<LINE_NUMBER;i+) /最小线宽2,最大线宽我们标定一下,但是如果是蛇道会怎样? /控制在垂直宽度的3倍左右就不会有太大问题 gMINPNOITLENi = 2; gMAXPNOITLENi = bottomW + (topW-bottomW)*i/(LINE_NUMBER-1); /这个i是可以按比例来的 gXCenteri = bottomX + (topX-bottomX)*i/(LINE_NUMBER-1); /这个i必须是3倍 gXParai = K0/(Y0-3*i-3); gYValuei = KY/(Y0-3*i-3)+BY; /全局变量初始化:维护本文件的所有外部变量的初始化void InitSensorPara(void) uchar i,j;Fall_clan_num=-1;Rise_clan_num=-1;rise_main_edge_index=-1;fall_main_edge_index=-1;Main_class.Index=-1;Main_class.Indexlittle=-1;Main_class.Length=0;Main_class.Width=0;Main_class.K=0;Sub_class.Index=-1;Sub_class.Indexlittle=-1;Sub_class.Length=0;Sub_class.Width=0;Sub_class.K=0; / Rise_clanFall_clanfor(i=0;i<CLAN_NUM;i+)Rise_clani.Top=0;Rise_clani.Bottom=0;Rise_clani.iPixelNum=0;Rise_clani.TopPos=0;Rise_clani.BottomPos=0;Rise_clani.TopDelta=0;Rise_clani.Type=0;Fall_clani.Top=0;Fall_clani.Bottom=0;Fall_clani.iPixelNum=0;Fall_clani.TopPos=0;Fall_clani.BottomPos=0;Fall_clani.TopDelta=0;Fall_clani.Type=0;for(j=0;j<LINE_NUMBER;j+)Fall_clani.Linej=0;Rise_clani.Linej=0;for(i=0;i<EDGE_NUM;i+)rise_main_edgei=0;fall_main_edgei=0; / gSpeed = 0; /速度读取的状态 / 速度历史值 gPulseAcc = 0; gPulseAccLast = 0; /*dword wtaddr=0x0401; uchar speedtfbuffer512= 0 ;*/ / InitProjectPara();/=/读取码盘求速度函数:void GetSpeed(void) word temp; /十六位无符号整形:与寄存器对应 gPulseAcc = PACNT; / RightEN=RightEN; if(PAFLG&0x02) / 检查是否溢出 temp = 65535 - gPulseAccLast + gPulseAcc + 1; asm BSET PAFLG,#$02 / 清溢出标志 else temp = gPulseAcc - gPulseAccLast; gPulseAccLast = gPulseAcc; /if(!RightEN) gSpeed = temp; /很经典,可以实现速度读取 realspeed= gSpeed * 9/10; realspeed+= gSpeed*15/1000; / else / gSpeedLeft =temp; /SendSCI(byte)temp);/PORTAB/=/读图像函数:void ReadImage(void) uchar mrflag=0;char getin=0;char recyclable;uchar PixelNow=0; uchar PixelBefore=0;uchar PixelB_Before=0;uchar tempPixel1;uchar tempPixel2;uchar PixelCount=0; /像素计数器,在一行完后清零uchar StableCount=0;uchar RiseCount=0;uchar FallCount=0;uchar LineCount=0;int DeltaPixel=0;uchar distmp;char line_dif;uchar RisePos=0; /上升沿位置uchar FallPos=0;/下降沿位置int WantedPos;uint mindis=0;char betterindex;char type;char index1;char re_index;char tmpBetter;uchar aux_index;char tmpindex;uchar c;char tmpc1;int tmpval;uint Pxiel_Sum=0;watchtemp=0;edge_count=0;rise_main_edge_index=-1;fall_main_edge_index=-1;Fall_clan_num=-1;Rise_clan_num=-1; if (ImgDeayCount!=0) ImgDeayCount-; while(!FIFO_EF) FIFO_RCLK = 1; asm NOP; NOP; NOP; NOP ;/这里加了三个。 /研究一下FIFO的时序(感觉FIFO的速度应该很快才对啊 /),再结合实际调好这个NOP的个数 FIFO_RCLK = 0; while(FIFO_EF) PixelB_Before=PixelBefore; PixelBefore=PixelNow;if(mrflag=0)mrflag=1;FIFO_RCLK=1;asmNOP;tempPixel1 = PORTB;/首先认为PORTB为低字节,因为后面的程序是先发送的tempPixel1tempPixel2 = PORTA;PixelNow=tempPixel1;/先这样,再采图像看一下FIFO_RCLK=0;if (ImgDeayCount=1) SendSCI(tempPixel1); SendSCI(tempPixel2);elsePixelNow=tempPixel2;mrflag=0;PixelCount+;Pxiel_Sum+;/我的程序 if (PixelCount>=3)/当采得的像素个数大于三时 DeltaPixel=PixelNow-PixelB_Before;/间隔一步,向右看齐 if (DeltaPixel<DELTA_PIXEL_MAX)&&(DeltaPixel>(-DELTA_PIXEL_MAX) StableCount=StableCount+1; if(StableCount>=STABLE_NUM) if(RiseCount>0) rise_main_edge_index=rise_main_edge_index+1;if(rise_main_edge_index<EDGE_NUM)rise_main_edgerise_main_edge_index=RisePos;else rise_main_edge_index-; RiseCount=0; FallCount=0; else if(DeltaPixel>=DELTA_PIXEL_MAX)RiseCount=RiseCount+1; FallCount=0;StableCount=0;RisePos=PixelCount-1;/和后面的 FallPos=PixelCount;有点歧义诶!