东北大学猎豹队技术报告

上传人:cn****1 文档编号:576609482 上传时间:2024-08-20 格式:PDF 页数:71 大小:8.67MB
返回 下载 相关 举报
东北大学猎豹队技术报告_第1页
第1页 / 共71页
东北大学猎豹队技术报告_第2页
第2页 / 共71页
东北大学猎豹队技术报告_第3页
第3页 / 共71页
东北大学猎豹队技术报告_第4页
第4页 / 共71页
东北大学猎豹队技术报告_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《东北大学猎豹队技术报告》由会员分享,可在线阅读,更多相关《东北大学猎豹队技术报告(71页珍藏版)》请在金锄头文库上搜索。

1、第 二 届 全 国 大 学 生 “飞 思 卡 尔 ” 杯智 能 汽 车 竞 赛技 术 报 告学 校: 东北大学队伍名称: 猎 豹参赛队员:秦召兵、师恩义、王力带队教师: 张云洲关于技术报告和研究论文使用授权的说明本人完全了解第二届全国大学生“ 飞思卡尔”杯智能汽车竞赛关保留、使用技术报告和研究论文的规定,B |J :参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料 ,并将相关内容编纂收录在组委会出版论文集中。参赛队员签名:带队教师签名:日 期 :目 录第 一 章 引 言 . . . . . . . .

2、 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1第二章智能汽车整体设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 .1 导航方案的选取. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3、. . . . . . . . . . . . . . . . . . . 32 .2 系统资源需求与分配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 .3 机械结构设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52.3.1 车模结构特点. . . . . . . . . . . .

4、 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52.3.1 电路板. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 .4 开发流程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5、. . . . . . . . . 62.4.1 编译环境. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62.4.2 下载调试. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6第三章 视频信号采集. . . . . . . . . . . . . . . . . . . . . .

6、 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73 .1 采集分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 .2 采集时序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7、. . . . . . . 73 .3 中断分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9第四章 智能汽车硬件设计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124 .1 电源模块. . . . . . . . . . . . . . . . . . . . .

8、 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124.1.1 5V供电电源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134.1.2 6V 供电电源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134.1.3 1

9、2V升压电路. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 .2 时钟模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 .3 串口模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10、. . . . . . . . . . . . . . . . . . . . . . . . . . 154 .4 测速模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 .5 循线模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11、. 174 .6 电机驱动模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 .7 抗干扰技术. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19第五章智能汽车软件设计. . . . . . . . . . . . . . . . . . . . . . .

12、 . . . . . . . . . . . . . . . . . . . . . . . . . . 215 .1 路径识别与自适应阈值计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 .2 抗干扰处理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .245 .3 算法实现. . . . . . . . .

13、. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275.3.1 偏航距离的计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275.3.2 偏航角度的计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14、. . . 285.3.3 曲率的计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .285 .4 速度PID算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30第六章 总结与展望. . . . . . . . . . . . . . . . . . . . . . . . . . . .

15、. . . . . . . . . . . . . . . . . . . . . . . . . .32参考文献. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34附录A:程序源代码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16、 . 36II第 一 章 引 言智能小车以匕思卡尔16位微控制M C 9s12DG128B作为唯的核心控制单元, 电机驱动芯片选用了M C33886,采用CCD摄像头采集图像循线,实现了通过记忆算法解决跑道的S型的难题; 运用反射式红外传感器自行设计了速度监测模块和坡度检测模块。同时,采用PW M 和PID技术,控制舵机的转向和电机转速。系统还扩展了LED和键盘模块作为人机操作界面,以便于智能小车的调试与相关参数调整。此外,软件系统增加了复位快速自动重启技术,防止小车受到干扰后不能正常运行情况的出现。本系统中,视觉导航作为一个关键部分, 对其处理的好坏直接决定了小车运行状态和动态性能。本文分析

17、了 PAL制式模拟视频信号的特点,并给出了视频采集的流程和程序实现方法。针对特定的环境和稀少的计算资源,提出了一种非均行采集和坐标变换的方法实现了摄像头标定,这在历届的参赛队伍中尚属首次。阈值分割是路径识别的有效方法, 提出了一种渐进式动态阈值计算方法,并经实验证明了该方法的有效性和对环境中不均匀光线的良好适应。路径参数的准确计算是智能小车控制的前提。在路径滤波的基础上, 给出了偏移量、斜率和曲率参数的计算方法,其中对于曲率采用计算三角形外接圆半径的方法是本文的创新。技术报告以智能小车的设计为主线,包括小车的构架设计、软硬件设计,以及控制算法研究等,共分为六章。其中,第一章为引言部分;第二章主

18、要介绍了小车的总体方案的选取,对单片机资源的分配作了说明。第四章对小车的硬件设计进行了详细的介绍, 主要介绍了电路的设计; 第五章描述了小车的软件设计和相关算法。第六章中叙述了我们在设计过程中遇到的问题和解决方法。第二届全国大学生智能汽车竞赛技术报告2第二章智能汽车整体设计智能车系统主要包括以下模块:S12单片机模块、驱动电机、舵机、转速反馈和 CCD视频采集模块。整体结构框图如图2.1所示。图2.1智能车系统功能模块图2 .1导航方案的选取以 MC9s12DG128为核心,设计寻线方案并尽可能的提高车速,是获得比赛胜利的关键。传统的寻线方案是使用“ 线型检测阵列”的红外传感器,这种方案实现简

19、单,稳定性高,但只能获取有限的点信息,限制了更高级算法的应用,也限制了赛车速度的进一步提高。而摄像头获取的信息是面信息,不仅能获得当前赛车的偏移量,而且能判断前方赛道路面信息,为应用高级的控制算法提供了基础。摄像头所能探测的赛道信息远多于“ 线型检测阵列”探测到的,而且摄像头也有足够远的探测距离以方便对前方路况进行预判。另外一方面比赛规定使用的飞思卡尔16位单片机MC9S12的运算速度和自身A/D端口的采样速度,能够适应对黑白低线数摄像头的有效视频采样和对大量图像数据的处理。首届比赛中, 采用摄像头方案的赛车普遍取得了比采用红外传感器方案的赛车更好的成绩,说明为得到更好的控制效果而增加系统的复

20、杂性是值得的。采用红外传感器方案的清华大学二队之所以能获得冠军,应归功于其所采用的记忆算法,而3第二章智能汽车整体设计采用摄像头方案后也可以采用记忆算法,并且用摄像头判断直道和弯道要比用红外判断更可靠,记忆算法也更容易实现。基于摄像头导航的种种优势,本系统选择了CCD面阵摄像头作为唯一的导航传感器。表2系统资源需求表驱动电机速度控制1路16位的PWM输出PWM01电源7.2V供电驱动舵机转向控制1路16位的PWM输出PWM23电源7.2V电源2个传感器A采集道路信息PORTT的2位电源5V电源1个传感器B速度反馈1个脉冲累加器外部引脚PACN32电源5V电源摄像头图像采集A/D 端口ADO通道

21、3个中断引脚PHO、PHI、PH2电源7.2V电源串口和电脑数据交流接收RX 口和发送TX 口SCIO控制板程序开始按钮1个I/O端口PORTKB1T4复位按钮1个指示灯3个I/O输出口PORTKBITO-PORTKBIT22 .2系统资源需求与分配根据本次大赛的特点,智能车的控制系统主要有道路信息采集模块,速度检测4第二章智能汽车整体设计模块,电机驱动模块,舵机驱动模块及串口模块等,根据这些模块的功能和特点,现将所需要的资源总结表2 . 1所示。2. 3机械结构设计2 .3 .1 车模结构特点本项目采用后轮驱动,前轮转向。使用单个C C D摄像头进行导航,摄像头位于舵机正上方3 7 0 m

22、m处。前方用2个传感器探测坡度,其位置位于小车前部10 0 m m处,15度倾角向上偏起。电路板置于小车腹部。整个小车重心在中部偏后,有较好的稳定性。底盘无改动。经过改装后的车模参数如表2. 2。表 2. 2车模参数表长4 0 0 m m宽20 0 m m高3 5 0 m m重1 . 16 K g传感器个数3 个 ( 1 个 C C D , 2 个红外)其它伺服电机个数0检测精度、频率25 H z车模平均电流( 匀速行驶)8 0 0 毫安2.3. 1 电路板共用到一块P C B电路板,即车身主板( 包括M C U ,调试电路,电源电路,红外传感器,加速度传感器电路,测速传感器等),其外形尺寸见

23、表2. 3。表 2. 3 电路板参数表长16 0 m m宽7 7 m m所有电容总容量小于15 0 0 u F除M C 9 s 12D G 128外的主要芯片L M 29 4 0 , M M A 7 26 0 , M C 3 3 8 8 6 , L M 1117 , L M 18 8 15第二届全国大学生智能汽车竞赛技术报告2 .4开发流程2.4. 1 编译环境在制作过程中,运行的编译环境为CodeWarrior 4.1 。CodeWarrior4.1是Metrowerks公司一套比较著名的集成开发环境,具有直观,易用的优点。CodeWarrior4.1包括项目管理,代码生成,语法敏感编辑器等

24、,具有快速下载,单步调控的特点,同时可以融合C 语言和汇编语言的混合编程。CodeWarrior4.1具有在线调试,单步运行程序的功能,同时能够观察到主程序中定义的所有的变量的值1o 这一功能在进行程序错误检查和改正时起到了至关重要的作用。下图即为CodeWarrior4.1的编程界面:图2.2 CodeWarrior4.I编程界而2 .4 .2 下载调试调试下载工具应用的是由东北大学飞思卡尔实验室开发的BDM调试器。6第三章视频信号采集3 .1采集分析本系统所使用的CCD摄像头输出的是PAL制式的视频信号,其一幅图像包含575个图像行,每行最多有767个 点 ( 按荧光屏的长宽比为4: 3

25、计算) ,因此其图像 解 析 度 能 达 到 575 X 767-440000个象 素 。而对于智能车系统而言,由于受MC9S12DG128单片机内存和运算速度的限制, 这么大解析度的图像是无法处理的。因此必须降低图像的分辨率。根据实际需要,在分辨率为30X 30的情况下,仍然能够获得清晰的赛道图像,满足控制车辆的需要。路径检测需要的图像的特点是水平分辨率高,垂直分辨率低,而 S12单片机受ATD转换速率的限制,在水平方向上每一行中只能采集8 个点,而垂直方向上则能够采集数百行,因此该文作者提出了将摄像头旋转90度的方法解决这一矛盾。 而本文作者经过实验验证, 通过降低ATD的采集精度, 将单

26、片机CPU超频, 配合提高ATD时钟, 能够在一行数据有效的522时间内, 最多采集48个点,这对于路径检测来说也已经足够了, 无需将摄像头旋转90度。 不旋转摄像头的好处还在于能够一边采集数据, 一边完成对数据的初步处理。我们最终确定采集图像的分辨率为4 8 X 4 0 ,即每行采集48个点,每幅图像采集40行。3. 2采集时序具体说来,采集一场的流程是这样的:第一步, LM1881分离出的奇场同步信号在DG128的 H 口产生中断。 根据PAL规范,此时意味着还有2 2 行 ( 约 1408gs,视 LM1881的信号延时而定)将开始第一个数据行。 为确保正确的采集到数据, 使定时器定时2

27、3.5行( 23.5x642 = 15042) ,定时结束后,开启行中断,准备采集数据。第二步,定时器定时1504gs时间到,此时开启行通道,允许中断,并使控制ATD转换的行计数器归零,以标志一幅图像的开始。第三步, 大约3 2 . ( 0.5行) 后, 行中断到。由于一场中有280多个行, 但 ATD只采集其中的40行,为此设置了一个行计数器,每次行中断都将该计数器加一,当7第二届全国大学生智能汽车竞赛技术报告该计数器的值与预存数组里的某个数相等时, 表示该行应该采集。 根据PAL的规范,在数据行中,行同步信号后6MS ( 上升沿,如果选下降沿有效,应 该 是 10.3小)才会有真正的图像数

28、据出现, 并持续5 2 2 到该行结束。为此在该行的行中断中使定时器定时6 2,定时时结束后才能开始采集。第四步,定时器定时6 2 时间到。此时应立即开始ATD采集。由于ATD是按序列采集的,一个序列可以连续采集18 个点,并可设置是单序列还是扫描方式。每个序列采集完成后将产生一次ATD中断。为减少ATD中断次数,在 ATD初始化中已设置转换序列长度为8。 此时以扫描方式开启ATD,采集48个点需要6 次 ATD中断。第五步,每隔约8MS, ATD中断发生一次。该步中最重要的就是把ATD的数据转移到存储图像的数组中。由于一行中ATD要采集6 个序列, 因此要记录已经采集的序列数,每次进入ATD

29、中断,都使之加一,当序列数为6 时,标志着一个行已经采集完了。一行采集完后将采集行计数器( 注意:不是第三步中提到的行计数器)加一,并应停止A T D ,但 是 S12中并没有使ATD停止直接方法,唯一的办法是使ATD以单序列采集方式再采集一次。但是这次完成后仍然会发生中断,中断处理程序可根据采集的序列数来判断是否是这种额外的情况,如果是,中断处理程序除了读一下ATD数据寄存器以清中断标志位之外,并不需要做任何事。第六步,ATD中断不断的向图像数组中写入数据,直到行计数器计到40。此时意味着一幅图像数据已经采集完成。此时应关掉行中断,以免其产生额外动作。第七步,偶场中断到。其实就是奇场同步信号

30、的下降沿,如果没有进行相应设置和接线,将没有这个中断。PAL制式的信号中,奇场同步信号和偶场同步信号以20ms的间隔交替出现,因此可以将此两种信号作为小车调整的基准时间。 此后直到下一个奇场中断到来,开始另一场的采集。可见,程序的运行完全是由各个中断的来推动的。程序的流程图如图3.1。8第三章视频信号采集图 3. 1 视频采集流程图3 . 3中断分析视频采集共涉及到6 个中断:奇场中断、偶场中断、行中断、定时器中断1、定时器中断2、A T D 中断。但是只有3 个硬件中断源,即 H 口中断、定时器中断和9第二届全国大学生智能汽车竞赛技术报告ATD中断, 对应只有3 个中断服务程序。为此需要在中

31、断程序中区分中断的类型。1) H 口中断H 口中断服务程序要区分是奇场中断、偶场中断还是行中断,这是通过寄存器的中断标志为来实现的。中断程序如下:void interrupt PORTH_ISR(void)if(PIFH_PIFH2&PIEH_PIEH2) ift(! FrameFinish)&VideoEnable) if(vRow=VROWRow)行同步中断如果视频采集允许如果行数等于预定的行数,采集该行MCCTL=MCCTL_MCZ1_MASK|MCCTL_MCEN_MASK;MCCNT=154;MdcScrviccNumber=2;)vRow-H-;)else ifi; PIFH_PI

32、FHO&PIEH_PIEHO) OddValid=l;OddCounter+;iftVideoEnable= 1) FrameFinish=O;定时 6.25us置服务标志更新行计数奇场同步中断/ / 置奇场标志更新奇场计数如果视频采集允许 清场完成标志MCCTL=MCCTL_MCZI_MASK|MCCTL_MCEN_MASK; 打开定时器MCCNT=34560;定时22+1.5行MdcServiccNumber=l;置定时器服务标志else ifi; PIFH_PlFH 1 &PIEH PIEH 1) 偶场同步中断EvenValid=l;/ / 置偶场标志EvenCounter+;更新偶场计

33、数PIFH=P1FH;清中断标志2 ) 定时器中断10定时器中断要区分是定时了多少时间。为此我们设置了一个“ 服务标志” ,不同的定时时间设置不同的服务标志,void interrupt MDC_ISR(void)MCFLG|=MCFLG_MCZF_MASK;MCCTL=0x00;if(MdcServiceNumber= 1) /makerecord(FEILD_START);PIFH=PIFH;PERH=0x07;PIEH=0x07;vRow=0;Row=0;else if(MdcServiceNumber=2) AdCounter=0;MdcServiceNumber=O;卜3) ATD中

34、断ATD0CTL5=ATD0CTL5 SCAN MASK;以使定时器中断程序做不同的处理/ / 清中断标志关闭计数器/ / 如果奇场定时时间到记录此事件/ / 清中断标志/ / 开启行同步信号通道开启行同步信号中断修改以改变第一个采样行的位置清行计数器 如果行定时时间到以扫描方式开启AD置AD序列计数器初值清服务标志A T D中断的首要任务是及时把结果寄存器中的值转移出来,因为A T D是以扫描方式不停的在采集转移不及时, 新的结果会把原来的结果覆盖掉。 然后A T D中断程序需要根据一系列计数器的值计算本次采集结果对应的图像位置,然后保存到数组中。 最后A T D中断还要判断何时一行结束、

35、何时一场结束。A T D在采集时每隔8ps就要发生一次中断,中断服务程序必须要在这段时间内完成,因此要求程序不能过于冗杂。第四章智能汽车硬件设计系统主要由S12单片机、SCI、视频采集、驱动电机、舵机、转速传感器等功能模块组成。如图4.1。MC9s12单片机的主频高达25M H z,同时片上还集成了许多标准模块,包括2个异步串行通信口 SCI、 3 个同步串行通信口 SPI、 8 通道输入捕捉/ 输出比较定时器、2 个 10位 8 通道A/D转换模块、 1 个 8 通道脉宽调制模块、 49个独立数字I/O 口 ( 其中 20个具有外部中断及唤醒功能) 、兼容CAN2. 0A/B协议的5 个 C

36、AN模块以及一个内部IC 总线模块;片内拥有256kB的 Flash EEPROM, 12kB的 RAM、4kB的EEPROM川。这些资源能够满足完成智能车所需要的所有的条件。以下即是单片机周围硬件模块设计。图4.1 . 系统功能结构图4 . 1电源模块电源模块为系统其它各个模块提供所需要的电源,设计中,除了要考虑到电压范围和电流容量等基本参数之外,还要在电源转换效率、降低噪声、防止干扰和电路简单等方面进行优化。可靠的电源方案是整个硬件电路稳定可靠运行的基础。第二届全国大学生智能汽车竞赛技术报告4.1.1 5V 供电电源5V 电压用来供给MC9s12单片机,红外传感器、MAX232串口、无线串

37、口等,因此采用两片稳压芯片进行并联供电。选用的是型号为LM2940和 LM 1117_5.0型号的稳压芯片, LM2940具有大电流、低功耗、电路简单可靠的优点。电路图如图4.2所示。4.1.2 6V供电电源6V供电电压用来给舵机供电。 本次大赛中, 使用的是LM1117稳压芯片, LM1117内部由过热过流保护,静态功耗为4 m A ,最大输出电流为1A,完全能够满足舵机所需要的电压和电流。电路图如图4.3所示。4.1.3 12V升压电路摄像头需要用12V供电,本系统中采用PWM斩波升压方式得到12V ,电路图如图4.4所示。图 4.2 5V供电压供电电路13第二届全国大学生智能汽车竞赛技术

38、报告图4.3 6V 电压供电电路图4.4 12V斩波升压电路14第四章智能汽车硬件设计4. 2 时钟模块在本次大赛中,由于需要单片机处理的数据量大,速度快,所以在单片机外部使用了 16M的外部晶震,同时通过使用单片机内部的锁向环的功能, 使得最终单片机的总线频率达到了 2 4 M ,满足了本次比赛的要求。外部时钟接线电路如图4.5所7J oEXT ALMCUXT AL22pF |-|Y1CM7 MT XT AL22pF图4.5外部振荡电路4 .3 串口模块智能车的行走路线是根据跑道上的黑线确定的,根据摄像头采集到的路况信息控制舵机及后轮电机。而为了获取路况信息,就要求单片机能够和PC 机通信,

39、而比较方便有效的方式就是串行通讯。同时在进行系统调试的时候:比如PID参数测定,采用传感器记忆数据时也要用到串口。所以,串口电路必不可少。连接电缆图4.6 PC机与单片机的通信接口单片机15第四章智能汽车硬件设计C28斗 匕VDD-1C31 T luF_ lC33 luFY ,PC图4.7 PC机与单片机的通信接口4. 4 测速模块基本原理即为:在很短的时间内,通过光电传感器来测量固定在后轮的轴上的码盘通过的孔数,输送到单片机的脉冲累加器外部引脚,经过换算计算出智能车的实际速度,为速度PID控制环节提供可靠的数据。光电传感器是经过改造制成的。我们以智能车原来所携带的安装在后轮的轴上的齿轮作为码

40、盘,齿轮本身具有76个齿,即相当于光电码盘上有76个孔,具有相当的精确度。另外自己制作基本的支架,通过光电传感器来实现对后轮电机的速度采集。光电传感器的供电电压为5 V ,外 加 1K的上拉电阻,输出信号的是05V 高低电平。16第四章智能汽车硬件设计图4.8改造后的测速模块4. 5 循线模块在本次比赛中,采用的是用摄像头实时的采集道路信息,经过单片机的内部处理,来控制智能车的转向和电机的加减速。由于比赛道路信息比较简单,只有黑白两种颜色,因此选用了一款市场上非常常见的型号为203cA 的 CMOS摄像头。为了采集图像信息,CPU需要根据行、场同步信号启动A/D转换器,具体将就是在等待到行同步

41、信号之后启动A D 转换器, 同时通过定时器设定AD采集的时间,然后等待下一次行中断并启动。由于视频信号的变化很快,所以需要另外设计同步分离电路。在本方案中,使用了 LM1881视频同步分离集成块来分别获取奇场同步信号、 偶场同步信号和行同步信号, 并将此同步信号连接到单片机的中断输入端口:PH 口。MC9S12单片机端口资源配置如下: AD标准电平引脚接5V 电压; AD输入端口 PAD0,用于输入视频模拟信号; PH 口中断,用的是引脚PHO、PHI、PH2端口,其 中 PH0用来接收奇场同17第四章智能汽车硬件设计步信号,PH1用来接收偶场同步信号,PH2用来接收行同步信号。图4.9同步

42、信号分离电路如图4.9所示,只需要行同步信号和奇偶场信号输入到单片机,视频信号不经过电容隔直便可直接输入到单片机的A/D转换口。4 . 6电机驱动模块驱动单元是控制系统的重要组成部分,本次设计采用的驱动芯片是MC33886。由于MC33886驱动能力的限制,如果用一片进行驱动电机会使芯片非常热,所以我们采用两片MC33886并联的方式进行驱动,并且外加散热片,可以实现基本的加速正反转,在最大速度运行时,芯片只是微热。设计电路图如下4.10所示。18第四章智能汽车硬件设计MOTORMCIOUT?一星元TlT2T2aNnd三一友OLOLOLUN/JS.AQZ2QNDdC1NDUDNCD1D2肾短C

43、CP203I ?17图4 . 1 0驱动电路O - C MCIN9JQZE0ZE二三二UNDV4. 7抗干扰技术在电子系统设计中,应充分考虑并满足抗干扰性的要求,避免在设计完成后再去进行抗干扰的补救措施。( 1 )抑制干扰源抑制干扰源就是尽可能的减小干扰源的力, / 力,di/dt这是抗干扰设计中最优先考虑和最重要的原则。 减小干扰源的力 , / 力主要是通过在干扰源两端并联电容来实现。 减小干扰源的力/ 力则是在干扰源回路串联电感或电阻以及增加续流二极管来实现。19第二届全国大学生智能汽车竞赛技术报告本设计中所采取的措施有:电机两端增加续流二极管,消除断开线圈时产生的反电动势干扰;同时给电机

44、加滤波电路;7.2V电源两端并联两个电感,起到滤波的作用,其中一个大电容,大小为IOOORF, 一个小电容,大小为O.OIRF( 常用的103) 。布线时避免90。 折线,减少高频噪声发射。( 2)切断干扰传播路径干扰的传播路径可分为传导干扰和辐射干扰两类,所谓传导干扰是指通过导线传播到敏感器件的干扰。高频干扰噪声和有用信号的频带不同,可以通过在导线上增加滤波器的方法切断高频干扰噪声的传播,有时也可加隔离光耦来解决。电源噪声的危害最大,要特别注意。所谓辐射干扰是指通过空间辐射传播到敏感器件的干扰。一般的解决方法是增加干扰源与敏感器件的距离,用地线把它们隔离和在敏感器件上加蔽罩。本设计中所采取的

45、措施有:充分考虑电源对单片机的影响,给单片机电源加滤波电路,同时对单片机的5V 电源单独供电;单片机的I/O 口与外部器件( 控制电机、传感器、开关等)之应加光隔隔离;电路板合理分区( 如强、弱信号,模拟、数字信号分开) 。( 3)提高敏感器件的抗干扰性提高敏感器件的抗干扰性是指从敏感器件这边考虑尽量减少对干扰噪声的拾取,以及从不正常状态尽快恢复的方法。本设计中所采取的措施有:布线时; 电源线和地线尽量粗;尽量降低单片机的晶振和选用低速数字电路;IC 器件尽量直接焊在电路板上。经过长时间的运行和改进,系统稳定性已经基本达到了我们的要求。第五章智能汽车软件设计在控制算法中,主要用到了以下三方面的

46、内容:摄像头循线控制算法,记忆解决道路S型控制算法和PID速度控制算法。 其中循线控制算法用来控制舵机的转向,记忆控制算法主要用来解决S型,PID控制算法主要用来控制智能车的快速加速、减速和速度的平稳。下图即为主程序算法流程图。图5 .1软件流程图5 .1路径识别与自适应阈值计算所谓路径识别,简单的理解就是把图像中反映路径的部分提取出来。这是一个21第二届全国大学生智能汽车竞赛技术报告图像分割的过程。 图像分割是计算机进行图像处理与分析中的一个重要环节, 是一种基本的计算机视觉技术。在图像分割中,把要提取的部分称为“ 物 体 ( Object) ”,把其余的部分称为“ 背 景 ( Backgr

47、ound) ”。分割图像的基本依据和条件有以下4 个方面:1)分割的图像区域应具有同质性,如灰度级别相近、纹理相似等;2)区域内部平整,不存在很小的小空洞;3)相近区域之间对选定的某种同质判据而言,应存在显著的差异性;4)每个分割区域边界应具有齐整性和空间位置的平整性。现在的大多数图像分割方法只是部分满足上述判据。 如果加强分割区域的同性质约束,分割区域很容易产生大量小空洞和不规整边缘;若强调不同区域间性质差异的显著性,则极易造成非同质区域的合并和有意义的边界丢失。不同的图像分割方法总是为了满足某种需要在各种约束条件之间找到适当的平衡点。图像分割的基本方法可以分为两大类: 基于边缘检测的图像分

48、割和基于区域的图像分割。边缘是指图像局部亮度变化最显著的地方, 因此边缘检测的主要依据是图像的一 阶导数和二阶导数。但是导数的计算对噪声敏感,所以在进行边缘检测前需要对图像滤波。大多数的滤波算法在滤除噪产的同时,也降低了边缘的强度。此外,几乎所有的滤波算法都避免不了卷积运算,对了智能乍系统来说,这种运第的计算娟;是 S12单片机系统所无法承受的。阈值分割法是一种基于区域的分割技术, 它对物体与背景有较强对比的景物的分割特别有用。它计算简单,而且总能用封闭且连通的边界定义不交叠的区域。阈值分割法的关键在于阈值的确定。如果阈值是不随时间和空间而变的,称为静态阈值;如果阈值随时间或空间而变化,称为而

49、动态阈值。基于静态阈值的分割方法算法简单,计算量小,但是适应性差。基于动态阈值的分割方法其复杂程度取决于动态阈值的计算方法。针对本智能车系统, 普通的双峰法就能适介绝大部分情况,因为智能车的运行环境是比赛赛道,背景和前景区分明显,且背景简约。但是实验环境并不理想,由22第五章智能汽车软件设计于受到光线斜射的影响,有时背景和前景的对比十分不明显。结合实际需要,提出了一种新的计算阈值的方法,这种方法的思想与迭代法有些相似。首先我们假定,智能车系统运行时,开始时采集的第一幅图像是良好的。这个“ 良好” 含义是:第一行也就是最近处的一行, 完整的包含了导航线,并且使用“ 双峰法”能 正 确 提 电 其

50、次,我们对每一行都定义 个阈值Tr,每一行都用该行的阈值 Tr进行分割。在此基础上按照以下规则进行阈值传递:a) 如果第r 行分割出来的黑色区域( 线段)是连续的,那么计算目标区域和背景区域的平均灰度值,并取其中值,做为当前行和下一行的Tr。b) 如果第r 行分割出来的黑色区域是空集或者不连续,则保持当前行和下一行的阈值不变。图5.2 一行的阈位计算流程图这种算法的特点是运算量小, 但是能跟踪环境光线的逐渐变化。由于环境光线不管在时间上还是空间上都是逐渐变化的,所以这种分割算法产生严重错误的概率极小,小 于 l/10000o这个数据的来源是,我们让智能车在实验赛道上运行,累计时间超过30分钟,

51、没有一次智能车因为阈值分割错误而停车。图 5.2是智能车因错误而停车时的即时照片,在上面儿行中,赛道黑线与背景间的差别已十分微弱,但23第二届全国大学生智能汽车竞赛技术报告图5.3显示,这种情况下阈值分割的结果仍然是正确的,包含了识别赛道的足够信息,导致智能车停止的是其它的程序错误。图5.3的最右边一行显示的是阈值,图5.4则集中显示了阈值从近处到远处的变化。5. 2 抗干扰处理抗干扰处理包括以下方面的内容:1)消除信号产生和传输的过程中造成的噪声;2)消除赛道不理想或光线不均匀形成的干扰;3)消除赛道中的交叉线、断续线;4)识别起跑线。24第五章智能汽车软件设计信号产生和传输的过程中造成的噪

52、声具有普遍性, 但是只有当其非常严重时才对路径的识别造成影响。所以采取以下滤波算法:当某点的灰度值与其左边和右边点的灰度值的差同时大于某个正阈值或同时小于某个负阈值时, 认为该点是干扰点,取其左右两边灰度值的平均值作为该点的灰度值。对于赛道不理想或光线不均匀形成的干扰, 其一般特点是散布于赛道黑线的两边,所以采用以下算法处理:步 骤 1 从最近的第一行开始,寻找这样一个行:该行只有一段连续黑色线段,且线段的左右边均不是图像的左右边。标记该行为Start行。步 骤 2 在下一行中寻找这样一段连续黑色线段,满足这样的条件:其左边缘不在上一行黑线右边缘的右边, 且其右边缘不在上一行黑线左边缘的左边。

53、步 骤 3 如果存在步骤2 中的黑色线段,认为该段黑线是赛道黑线,其余黑点( 线段)均认为是干扰,跳步骤2。否则,标记该行为End行,并计算该行与Start行之差,如果大于3 , 则结束搜索,如果小于等于3 , 则返回步骤lo这种算法的实质是搜索连续的黑线。因为赛道是连续的, 而干扰却大部分是离散分布的。对于赛道中的交叉线,可以统计一行中黑点的个数,因为正常的黑线只有2.5cm ,在图像中不超过6 个点。所以把6 作为一个阈值T N ,如果一行黑点的个数超 过 T N 个点,就可以认为是交叉干扰。实际上,我们做了更复杂的处理,就是根据当前赛道的倾斜程度来调节T N ,因为当赛道倾斜时其宽度将发

54、生变化。并且,我们不只是识别出交叉干扰,而 且 “ 砍掉”它的左右两支,保留一条连续的赛道黑线。比赛中将设置限速段,限速段的一种可能的标记法就是把赛道黑线做成断续的,断续宽度2 c m ,间隔2 c m ,所以并不是所有不连续的黑点都是干扰。这给参赛选手带来了很大的挑战。我们采取的应对算法是,在遇到断续的行时,按当前已识别出的黑线的走向趋势延伸黑线到该行,如果在3 行内发现了可以连接的黑线,则认为延伸成功,否则结束搜索。25第二届全国大学生智能汽车竞赛技术报告起跑线是在赛道黑线的左右两边,对称存在两条长度各为10cm ,相 距 6cm,且与赛道黑线垂直的黑色线段。正确的识别起跑线是应用更高级控

55、制算法如记忆算法的基础。我们使用如下算法识别起跑线:在已识别出赛道黑线的行,保证该行不是交叉行( 前面已经识别出) , 然后确定其左右两边各一个矩形区域, 统计两个区域中黑点的个数,如果均大于某一阈值,则判断该行出现了起跑线。经过以上处理,我们得到了如下信息:首先是两个标记Start和 E n d ,这两个标记标记了成功识别出的赛道的最近一行和最远一行; 其次是在Start和 End之间的每一行, 记录了其赛道的左边缘位置和右边缘位置,并且通过坐标变换算法,计算出每行赛道中心线的实际位置。最后留下了一些其它标志,比如每行是否是交叉、起跑线或者断续线。这些标志在我们调试的过程中都用某种方式以图像

56、的形式反映出来。整个处理过程如图5.6。图5 .6路径识别过程26第五章智能汽车软件设计1 :原始图片2 :阈值分割3 :消除干扰4 :提取中心线并进行坐标变换图5 . 7赛道抗干扰处理5. 3算法实现5 .3 .1 偏航距离的计算由于已经获得了赛道中心线的位置, 所以计算偏航距离的问题是选取何处的中心线的距离为当前的偏航距离。控制算法的执行周期为40m s,如果赛车的速度为2m /s,则在两次控制算法的执行中间,赛车要前进8 cm ,赛车所处的环境将发生比较大的改变,所以赛车的控制只能算是半实时控制,这是所有使用摄像头作为主要寻线传感器的参赛队都避免不了的问题。因为算法的滞后性,赛车需要将“

57、 当前位置”进行适当前移。前移量应该跟赛车当前速度成正比,但实际中我们发现,适当27第二届全国大学生智能汽车竞赛技术报告增加一些前移距离是有好处的,因为可以在入分处提前转涔,使得赛车沿弯道内侧行驶,缩短了过弯距离。5 .3 .2 偏航角度的计算计算偏航角度的实质是直线拟合问题,因为赛道中心线所在的直线确定了, 而直线的斜率与偏航角度一一对应。直线拟合最有效的方法是最小二乘法,但是直接应用存在一个问题,即如何确定进行直线拟合的区间?在整个成功识别出赛道的区间内进行直线拟合显然是欠缺考虑的,因为在弯道的情况下,这种方法拟合出的是一条弦线,而不是当前该弯道处的切线。摄像头视野越大,弯道曲率越大,弦线

58、偏离切线的程度也就越大。 为了能够在直道和弯道上都能正确的拟合出正确的直线,我们采用了直线检测的方法,即首先根据残差的大小确定直线的范围,然后在这一范围内进行直线拟合。5 .3 .3 曲率的计算如果说斜率的计算需要某种技巧的话, 计算曲率则更是一种技巧的应用。 首届时很多参赛队针对各自的实际需要,提出了自己的方法。其中最普遍的是根据斜率的导数来计算曲率。但是斜率的计算本身就很不准确,特别是某个点的斜率,对斜率求导就更不准确,所以使用这种方法只能得出一个大致的结果。本文作者提出了另外一种方法,首先对获得的路径进行滤波,使得路径尽可能平滑,然后取其两个端点和中间点,计算这3 个点组成的三角形的外接

59、圆的半径,半径的倒数就是这段路径的曲率。经过多次实验,这种方法的误差一般不大于20% ,对智能车的控制来说已经足够了。图 5.8是实验赛道的照片,让赛车从起跑线开始,在赛道上行驶一圈,记录下每个时刻的曲率,如图5.9。28第五章智能汽车软件设计图 5.9计算出的赛道曲率从 图 5.9可以看出,计算出的曲率能较为正确的反映实际赛道的弯曲情况。但是这种方法得出的曲率不是摄像头所看到的当前位置的曲率,而是摄像头所看到的29第二届全国大学生智能汽车竞赛技术报告路径的整体曲率,因为这种算法仅仅与路径中三个点的位置有关。然而实验中却发现,这种特点反而给赛车带来了一个好处:即摄像头在小S 型弯道时舵机几乎不

60、跟随路径的摆动而摆动,而是直线冲过。这是因为较小的S 型路径其弯曲部分能完整的显现在摄像头的视野中,而算法中对路径进行了滤波,滤除了中间部分的弯曲,使得路径变直了,赛车因此就直线走过。5 .4 速度PID算法根据偏差的比例(Proportional)积 分 ( Integral)、微 分 (Derivative)的线性组合进行反馈控制( 简称PID控制) ,数 字 PID控制算法是电机微机控制中常用的一种基本控制算法。在连续系统中,模拟 PID调节器是一种线性调节器,控制系统原理框图如图5.10。r(t)微 分d / d t*图5 . 1 0 P I D控制系统原理框图控制规律为:“ ( f

61、) = Kpe(t)+. e(t)dt + TD 等 ( 5 . 1 )式中:储 :比例增益,K ,的倒数称为比例带;积分时间常数;琅 :微分时间常数;”(f):控制量;e(f):偏差,等于给定量与反馈量的差。在计算机控制系统中, 数字PID控制算法通常又分为位置式PID和增量式PIDo30第二届全国大学生智能汽车竞赛技术报告本次设计中,我们采用增量式PID。增量型算法与位置型算法相比,具有以下优点:增量型算法不需要做累加,增量的确定仅与最近几次偏差采样值有关,计算精度对控制量的计算影响较小,而位置型算法要用到过去偏差的累加值,容易产生大的累加误差;增量型算法得出的是控制量的增量,而位置型算法

62、的输出是控制量的全量输出,误动作影响大;采用增量型算法,易于实现手动到自动的无冲击切换。在实际应用中,采样的反馈值y(k)即为脉冲累加器中的PACN32中的脉冲数,预设门限值A在参数整定时根据实际情况调节,输出“(Z)并不能直接用来控制电机,需要将其转换为控制PW M占空比,然后用增大或减小PW M 占空比的方法来实现对电机的加减速的控制。换句话说,在求偏差量时,实际上用的是每20ms电机转过的齿轮数和实际期望电机转过的齿轮数,通过二者的差值,再乘以相应的系数, 即KP、K|、KD的协调控制, 计算出相应的PW M 占空比, 实际上用的是PWMDTY的值口叫本设计中综合考虑各种因素,最后选用的

63、采样周期为2 0 m s,即每20ms对电机进行一次PID调节。由于在程序中,对图像的采集使用的是PH 口的中断程序,因此, PID采样周期的选择实际上是受限制与图像采集, 因为每行的扫描周期为64郎,有效扫描时间为52gs,采用的是隔行扫描的方式, 即每隔6 行采集一行图像的信息,如果在每行之间加入PID 调节的话,那么处理PID 子程序的时间必须控制在64*5=320联 之内,另外图像采集只是采集了奇场中的行数,在偶场中没有采集,因此PID 子程序的执行是不均匀的,并没有达到预期的效果,同时还可能会影响到视频采集,因此,经过分析,最终决定将P ID 的采样周期定为2 0 m s,即当进行一

64、次场采集进行一次PID调节。而且经过最终的检验,这样能够满足对速度控制的需要。31心得与体会第六章总结与展望对于我们而言,准确的寻线并不是最终目的,在不冲出赛道的情况下,尽可能缩短赛车单圈行驶时间才是我们所追求的。从这个意义上说,路径识别和寻线算法只是我们为了保证完成比赛而采取的辅助手段。但是除了在这种辅助手段上花费功夫,我们很难在别的地方有突破性的进展。概括起来,提高车速的方法大概有以下几类:1)在赛车的机械结构上作优化。主要包括主销后倾角、主销内倾角、前轮外倾角、前轮前束、重心的位置、地盘离地间隙、后轮轮距以及后悬挂纵向减震弹簧的预紧力等。2)舵机的机械调整。这一内容包括对舵机输出角度的机

65、械放大、舵机反装等,其中心目的是提高舵机的反应速度。3)增强驱动电机的加减速性能。驱动电机的加减速性能首先与驱动芯片的性能密切相关。很多队伍提出了多片MC33886并联使用的方法,也有的队干脆自己设计驱动芯片,这要求在相关方面具有比较强的实力。其次是软件方面,如果使用PID算法控制电机,则 PID参数对加、减速性能的影响也是很大的。但无论如何,优化参数是不可或缺的一步。4)在舵机控制算法上优化,使之过弯道走内弯、S 型曲线直接冲过,其中心目的就是使赛车少走弯道,缩短行驶距离。我们在实验中曾发现,如果不进行控制算法的优化,单纯增加赛车的直线速度并不总是能缩短单圈的时间,因为速度快到一定程度后,赛

66、车在过弯时将发生侧滑,赛车走过的距离增加了,抵消了速度增加带来的优势。5)记忆算法。如果能够事先知道赛道的形状,我们甚至可以不用寻线传感器而就能完成比赛。基于既定环境的控制显然要比环境未知的控制来的简单,效果要好。但是比赛赛道在比赛前是不对外公开的,于是就有了这么一种可能:赛车行驶第一圈时把赛道情况记录下来,第二圈就相当于是在既定环境中进行控制了。让赛车把赛道情况记录下来并不难,难的是如何确保记录准确性,以及如何根据记录选择控制策略。因为比赛的实质是一种寻优,这种寻优包括对路径的寻优和对速度的32第二届全国大学生智能汽车竞赛技术报告寻 优 ,但不是二者简单的相加,二者之间存在着一定的约束关系。

67、由于实际的对象非常复杂,而算法不可能太复杂,所 谓 的 “ 最 优 ”几乎是难以实现的,我们只能退而求其次,只 要 求 达 到 “ 更 优 ”就可以了。但该文作者也承认,由于赛车初圈记忆的准确性难以保证,第二圈基于记忆的控制策略是存在定风险的。特别是赛车在比赛场地上很难对自己进行全面的定位,更难以对整个赛道进行整体的把握,所以路径寻优十分困难。相比之下,速度的寻优容易一些,只要知道前方弯道的大体位置就可以进行针对性的加速和减速。实 现 记 忆 的 难 点 在 于 理 清 “ 过 去 ” 、“ 现 在 ” 、“ 将 来 ”三种信息的关系,赛车使用记忆算法后,第二圈的速度明显提高,但是过弯时的情况

68、仍然对舵机控制算法有很大的依赖性。所以改善控制算法是最根本的。但是由于时间有限,系统中尚存在许多问题有待改进:1)抗干扰处理。赛车在赛道上会遇到各种情况,如交叉线、断续线,以及还有实验赛道上的干扰点,以及由环境光线不均匀造成的干扰。如何确保在任何情况下都能识别出赛道,或者判断出赛车在场上的位置,需要做进一步的努力。2)参数计算的准确性。虽然实现了斜率和曲率的计算, 但是其精度仍然不够理 想 ,特别是在能够识别的路径比较段的情况下,计算出的数据与实际有很大的偏差。笔者曾设想了 一种基于最小二乘法捏合圆的方法,但是发现计算及其复杂,简化了条件后得出的结果又不够理想。这个方面值得继续探索。3)控制算

69、法的改进。本系统采用了双闭环加前馈的控制方法, 这在控制算法中是比较复杂的,实际应用也验证了效果的良好,但是仍然存在不尽如人意的地方。经过六个多月的精心准备和不懈努力, 我们的智能车系统各方面性能均达到了我们最初的设计目标,并在东北赛区的比赛中得到了认证。在未来的十几天的时间里 ,我们会继续不断完善系统,希望在马上就要到来的决赛中发挥出自己的水平,赢得更好的成绩。33参考文献参考文献 1 邵贝贝,单片机嵌入式应用的在线开发方法,北京:清华大学出版社,20042 卓晴,黄开胜,邵贝贝,学做智能车挑 战 “ 飞思卡尔”杯,北京:北京航空航天大学出版社,2007 3 黄萍莉,岳军,图像传感器CCD技

70、术,信息记录材料,2005.(1). 4 金宝智,图像传感器CCD与 CMOS的对比,现代电子技术,2005.55 朱维乐, 电视信号数字解码器中同步提取、 色度副载波恢复及色度解调部分的设计与Verilog实现,电子科技大学,2004 6 俞斯乐,侯正信,冯启明,李文元. 电视原理. 北京:国防工业出版社,2001 7 卓晴,王班,王磊. 基于面阵CCD的赛道参赛检测方法. 清华大学,2006 8 樊敏, CMOS集成锁相式频率合成器设计, 西安电子科技大学,2007 9 史毅俊, 卫星通信基带解调中的关键技术研究和实现, 上海交通大学,200710柏杨, 基于锁相环技术的可编程晶体振荡器,

71、 电子科技大学,20061 lGuan-Chyun Hsieh; Hung, J.C.;Phase-locked loop techniques. Industrial Electronics, IEEETransactions on Volume 43, Issue 6, Dec. 1996 Page(s):609 -61512刘慧银,程建平,Motorola微控制器MC68HC08原理及其嵌入式应用,清华大学出版社,200113葛亚明, 刘涛, 王宗义, 视频同步分离芯片LM1881及其应用, 应用科技, 第 3 1 卷第9 期, 200414安鹏,吗伟,使用S12单片机控制舵机,清华大学

72、工程物理系,200715连秀林,自主移动机器人视觉导航技术研究,北京交通大学硕士论文,200616程宏煌,戴卫恒等, 图像分割方法综述,电信快报,2000 (10): 39-4117Bomans M, Hohne K H, Tiede U, Rierne M. 3-D segmentation of MR images of the head for3-Ddisplay. IEEE Trans. On Medical Imaging. 1990, Vol 9, 177-18318应骏,叶秀清,顾伟康, 个基于知识的边沿提取算法,中国图象图形报,1999, 4A (3):23924219Berg

73、holm F. Edge focgsing. IEEE Trans. Pattern Analysis and Machine Intelligence. 19879(9),726-74120Brown M A, Blackwell K T, Khalak H G Multi-Scale Edge Detection and Feature Binding: AnIntegrated Approach. Pattern recognition. 1998, 31(10), 1479-149021Michacl H.F, Wilkinson. Optimizing Edge Detectors

74、fbr Robpst Automatic Threshold Selection:Coping with Edge Curvature and Noise. Graphical Models and Image Processing. 1998, 60,385-40122靳宏磊, 朱蔚萍, 李立源等, 二维灰度直方图的最佳分割方法, 模式识别与人工智能,1999,34第二届全国大学生智能汽车竞赛技术报告12 (3): 329-33323Mardia K V, Hainsworth T J. A spatial thresholding method for image segmentation

75、. IEEE Trans.Pattern Analysis and Machine Intelligence. 1988, 10, 919-92724刘立萍, 吴立德,图像分割中阈值选取方法比较研究, 模式识别与人工智能,1997, 10 (3):271-27725Philippe Schmid. Segmentation of Digitized Dennatoscopic Image by Two-Dimensional ColorClustering. IEEE Trans. On Medical Imaging. 1999, 18(2), 164-17126Lin J-S, Cheng

76、 K-S, Mao C-W. A Fuzzy Hopfield Neural Network fbr Medical ImageSegmentation. IEEE Trans. Neural Science. 1996,43(4), 2389-23982刀曹莉华,图像边缘提取中的一种动态阈值获取法,小型微型计算机系统,199728卓晴,智能汽车自动控制器方案设计,清华大学自动化系,200629张巍,陈威,关新,基于面阵CCD的图像处理研究,北京航空航天大学,200630邱建,刘文权,郭小勤,基于CCD图像的模型小车系统转向控制研究,深圳大学,200631黄开胜,陈宋,汽车理论与智能模型车机械

77、结构调整方法,清华大学汽车安全与节能国家重点实验室,200635附录A :程序源代码#include /* common defines and macros */#include /* derivative information */#include #pragma L1NKJNFO DERIVATIVE nmc9sl2dbl28bn#include nmain_asm.hn /* interface to the assembly module */#define SG _ 30 直道速度上限/define POWERADJUST 900#define BrakeDen 10 减速加速度

78、预测#define SpeedLose 3 速度恢复#define DEBUG_EN#define ABNORMAL_S AMPLE#define SpeedCtllinit 500#define ROUND- - 3#define BLACKMAX 15#define WHITEMAX 200#define FRAMELEFT I#define FRAMERIGHT 46#define FRAME_TOP 38#define FRAME_BOTTOM 1/define VL1 30#define VL2 72#define BLACK_ADJUST 47#define DC12VjTEADY

79、 1#define ODDJNTERRUPT 2#define EVEN_INTERRUPT 3/define ROWJNTERRUPT 4#define FEILD_START 5#define ROWSTART 6#define ATDJNTERRUPT 7#define ROW_FINISH 8#define FRAMEFINISH 9#define DC12GIVEN 145#define PWM23MAX 1150#define Drow 0#define STEERMID 791define STEERMAX 88#define STEERMIN -88#define ROADJJ

80、NKNOWN 0 /U#define ROADWELL 1 /W#define ROAD 二 LEFT 2 /L#define ROADRIGHT 3 /R#define ROAD 二O UT 4 /O/define ROADCROSS 5 /C#define STARTING_LINE 6 /S#define DOTTEDLINE 7 /D#define ROAD_POLLUTED 8 /P/define ROADBREAK 9 /B#define STRIGHT 136#defineLEFT_TURN2/defineRIGHTTURN3#defineSPEED-LIMIT4/defineS

81、PRINT5#defineINCOMPLETE1#defineCOMPLETED2#defineOVERFLOW3#defineSTRIGHT_FLAG1#defineLEFTTURNFLAG2/defineRIGHT_TURN_FLAG3#defincSTARTINGLINEFLAG4#defineUPHILL_FLAG -8/defineDOWNHILLFLAG16#defineBRAKE_FLAG32#defineACC_FLAG64#defineSystemRecordLenth 20#defincRoadMarkLcnth50#defineStateRccordLenth 400/d

82、efineMessageLenth 23#defineTumListLenth 7/defineFRAMEBIT0#defineFRAME 二 BIT1 21#defineFRAMEBIT32#defineFRAME 二 BI 匚43/defineFRAME 二B l 匚5 4#defineFRAMEBI 匚 65/defineSPEED6#defineSPEEDBI 匚2 7#defineROAD_BIT_18#defincROADBIT29#defineDIRECTION_BIT_110#defineDIRECTIONBIT211#defineDIRECTIONBI 匚 312#defin

83、eDR1FTBITJ13#defineDRIFT二BIT二214/defineDRIFTBIT315#defineSLOPCBITII16#defincSLOPEBIT217#defineSLOPE 二B IT1318#defineCURVWTUREBITl19#defineCURVATUREBIT220/defineCURVATUREB1T321#defineACTION_BIT1I22#defineWHITESYMBOL,r#defineWHITESYMBOL_2S/defineBLACKSYMBOL( t#defineGROUND_SYMBOL* *#defineSTOP_T1ME150

84、0uchar VideoData40 48;uchar Threshold 40;uchar BlackLeft40;uchar BlackRight40;37uchar BlackCounter40;uchar BlackSectionCounter40;uchar RoadCondition40;uchar BiValueFailed=O;uchar Row;uchar FrameFinish;uchar VideoEnable;uchar OddValid;uchar Even Valid;uchar AdCounter;uchar MdcServiceNumber;uchar DCOK

85、;uchar ERRORVALUE;uchar ADtemp8;uchar DcbugCmd;uchar ValidRoad;uchar IsStarting;uchar DottedLincFlag;uchar WellRowStart;uchar p We II RowStart;uchar WellRowEnd;uchar Pre Voltage;uchar ArcJointPos;uchar LastArcJoint;uchar LastRoadStyle;uchar RoadMarkCounter;uchar NextMark;uchar LastRectifyMark;uchar

86、RoundCounter;uchar McmoryState;uchar RoadOutFlag;uchar StartingLincPos;uchar CrossFlag;uchar CrossPos;uchar BlackWidthEstimate;uchar PACN32ClearFlag;uchar BrakeFlag;uchar AccFlag;uchar AccEn;uchar BrakeEn;uchar CompeteFlag;uchar MessageMessageLenth;uchar MessageTemp MessageLenth;uchar WavcRoadFlag;u

87、char SensitiveFlag;uchar DriverMaxFlag;uchar AdvanceAccEn;uchar MemoryControlEn;uchar RaceTimerEn;uchar EnhanceSteer;uchar QuickStart;uchar CS90;uchar CS180;38uchar NoRoadSpeed;uchar ResetFlag;uchar StepFlag;uchar ImageShowMode;uchar CaptureFlag;uchar PulseStepFlag;uchar Z_axis2;uchar Y_axis2;uchar

88、X_axis2;uchar MessageSendEn;uchar UphillFlag;uchar DownhillFlag;intPolluteSum;intBlackDrift40;intDriftGiven;intNearSlope;intNearSlopeCachc4;intBottomDrift;intDriftCache4;intFarSlope;intFarSlopeCache4;intOverallSlopc;intOverallSlopeCache4;intDC error;intDC12Ctl_I=0;intSpeedCtlj=200;intCurvature;intCu

89、rvatureCache4;intDiffCurvature;intSpeedCache4;intStccrlncremcnt;intSteerlncrementCache4;intReal Steer;intPreRoadPosition;intKpos;intDa;intDb;intSpeedGiven;intSpeedAdjust;intPreSpeed;intTargetSpeed;intPulse Adjust;intMcssageSendCountcr;intTimerFagmentl 0;intStrightCounter;intValidRoadCounter;intTumCo

90、unter;intTurnListTurnListLenth;intAheadTurn;intAheadCounter;intSynchronousError;intStopCounter;39unsigned int SteerHoldFlag;unsigned int SystemEventCounter;unsigned int StateRecordCounter;unsigned int vRow;unsigned int VROW40;unsigned int FrameCounter;unsigned int OddCounter;unsigned int EvenCounter

91、;unsigned int TimcrOverflow;unsigned int LastPulseCounter;unsigned int StrightFrameCounter;unsigned int TurnFrameCounter;unsigned int PRE;unsigned int LST;unsigned int SRC;unsigned int EventPointer;unsigned int SpecdZcroCounter;unsigned int StallCounter;unsigned int PACN32temp;unsigned int Round 1 T

92、ime;unsigned int Round2Time;unsigned int Tl;unsigned int T2;unsigned int T3;unsigned int T4;long PreCurvatureNum, PreCurvatureDen;long Position;struct sysrcduchar EventStyle;unsigned int rcdTCNT;unsigned int rcdTimerOverflow;struct roadmark uchar MarkStyle;int CurveCounter;int Discribe;unsigned int

93、PulseCounter;unsigned int Adjust;struct sruuchar FU;uchar WRS;uchar WRE;uchar SPD;uchar TSP;char STR;char DFT;char SLP;char CVT;);struct sysred SystemRecordfSystemRecordLenth;struct roadmark RoadMarkRoadMarkLenth;struct sru SRUStateRecordLenth;40初始化全局变量*yvoid veriable_init(void) int ij;unsigned int

94、pVROW40=0,12,25,36,48,59,70,80,90,99,109,117,126,134,142,149,156,163,170,176,182,188,194,199,204,209,214,219,223,227,231,235,239,243,246,250,253,256,259,262#if( iefABNORMAL_SAMPLEfbr(i=0;i40;i-H-) VROWi=pVROWi;)#elsefbr(i=0;i40;i+)VROWi=i*6+Drow;#endifBiValueFailed=O;Row=0;vRow=0;FrameFinish=0;Video

95、Enable=0;OddValid=0;EvenValid=0;AdCounter=0;PolluteSum=0;MdcServiceNumber=O;DCOK=0;ERROR_VALUE=0;SystemEventCounter=0;DC12Ctl_I=0;FrameCounter=0;OddCounter=0;EvenCounter=0;LastPulseCounter=O;SpccdCtl_I=SpeedCtl_I_init;SpeedGiven=10;Speed Adj ust=O;TargetSpeed=SpeedGiven;DriftGiven=0;LastRoadStyle=ST

96、RIGHT;StateRecordCounter=0;RoadMarkCounter=0;RoundCounter=0;IsStarting=O;StrightFrameCounter=0;TurnF rameCounter=0;MemoryState=0;RoadOutFlag=0;PACN32ClearFlag=0;SteerIncrement=O;41RealSteer=O;Position=0;StrightCounter=0;NextMark=O;Kpos=140;PRE=O;LST=O;SRC=O;BlackWidthEstimate=5;SpeedZeroCounter=0;St

97、allCounter=0;LastRectifyMark=O;AccFlag=O;BrakeFlag=O;Pulse Adj ust=O;AccEn=O;BrakcEn=O;SteerHoldFlag=0;ArcJointPos=0;MessageSendCounter= 100;BottomDrift=0;NearS lope=0;FarSlope=0;OverallSlope=0;Curvature=0;DifICurvature=O;ValidRoadCounter=0;TurnCounter=0;AheadTurn=0;StartingLincPos=0;CrossPos=0;Vali

98、dRoad=0;EventPointer=0;WaveRoadFlag=0;SensitiveFlag=O;AheadCounter=0;SynchronousError=0;AdvanceAccEn= 1;StopCounter=0;MemoryControlEn=0;RaceTimerEn=l;EnhanceSteer= 1;QuickStart=O;CS90=20;CS 180=20;NoRoadSpeed= 16;ResetFlag=0;StepFlag=0;ImageShowMode= 1;CaptureFlag=0;PulseStepFlag=O;MessageSendEn=O;T

99、l=0;42T2=0;T3=0;T4=0;UphillFlag=O;DownhillFlag=0;PreSpeed=O;forG=0;j4;j+)NearSlopeCache|j=0;FarSlopeCachcj=0;OverallSlopeCachej=0;CurvatureCachej=O;SpeedCachej=O;DriftCachej=O;SteerIncrementCachej=O;fbr(j=0;j40;j+)BlackLcftj=O;BlackRightj=O;BlackDriftj=O;BlackCounterj=0;RoadConditionj=0;for(j=0;j St

100、ateRecordLcn th ;j+) SRUj.FU=O;SRUj.WRS=O;SRUj.WRE=O;SRUj.SPD=O;SRUj.TSP=O;SRUj.STR=O;SRUj.DFT=O;SRUj.SLP=O;SRUj.CVT=O;fbr(j=O;jMessageLenth;j+) Messagej=J;)forO=0;j2;j+)Z_axisj=O;Ylaxisj=O;X_axisj=O;void delay(int time) /time=1000 是对应周期 1 秒( 大约)int i,j;for (i=0;i=250;i+)fbr(j=O;j=time;j-H) )void ma

101、kerecord(uchar style) 记录事件System RccordE ventPointer.rcdTCNT=TCNT;SystemRecordEventPointer.rcdTimerOverflow=TimerOverflow;SystemRecordEventPointer.EventStyle=style;if(SystemEventCounterSystemRecordLenth)43SystemEventCounter-H-;EventPointer=(EventPointer+1 )%SystemRecordLenth;void store(uchar flag)if

102、(flagx)ans-=p;)p=(uchar)(p/2);)retum(ans);)int m_abs(int x)if(xx2)retum(xl);elsereturn(x2);int min(int xl,int x2)ix2)retum(x2);else(return(xl);初始化PWM模块void PWM init(void)通道01后轮电机;通道23舵机IPWMCTL =0x70;置)PWMCAE =0x00;PWMPOL =0xFF;PWMCLK =0x30;通道的时钟/con45=l ,con23= 1 .conO 1 = 1;输出三路 16 位的 PWM(67 路闲输出左对

103、齐正极性输出/B为2,3通道的时钟,A为0、1通道的时钟,SA为4,544PWMPRCLK=OxOO;PWMSCLB =24;PWMSCLA =24;/MC33886后轮电机时钟源 A=BusClock,时钟源 B=BusClock/SB=B/2/24=500KHzPWMPER01=1200;PWMDTY01=0;PWMPER23=1200;PWMDTY23=0;舵机PWMPER45=5000;PWMDTY45=STEER_M1D;PWME = OxFF;/PWMO 1=A/1200=20KHz/PWM01初始不输出( 电机没有转速)/PWM23=A/1200=20Hz/PWM23初始不输出(

104、 舵机没有偏转)/P WM45=SA/5000=500000/5000= 1 OOHz舵机无偏转通道使能)/*初始化时钟void CLK_init(void)SYNR=2;REFDV=1;while(!(CRGFLG & 0x08)/ / 锁相环48M等待锁相环稳定/PLL=2*0SC*(SYNR+ 1)/(REFDV+1)CLKSEL=CLKSEL_PLLSEL_MASK; 设置锁相环为内部时钟ATD部分void ATD_init(void) /ATD 初始化ATD0CTL2=ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ASCIE_MASK;

105、允许A TD It常工柞, ATD中断打开采用快速清除标志位方式delay(l 00); 等待 ATD 稳定ATD0CTL3 = ATD0CTL3_S8C_MASK; 转换序列的长度为8,No FIFO, Freeze模式下继续转换ATD0CTL4 = ATD0CTL4 SRES8 MASK; /8 位精度, PRS=0, divider=2,AD 时钟 12M/ATDClock=BusClock*0.5/PRS+l;ATD0DIEN = 0x00; / / 禁止数字输入void interrupt ATDO ISR(void) /ATD 中断处理/makerecord(ATDINTERRUP

106、T);ADtemp0=ATD0DR0H;ADtcmpl=ATD0DRlH;ADtemp2=ATD0DR2H;ADtemp3=ATD0DR3H;ADtemp4=ATD0DR4H;ADtemp5=ATD0DR5H;ADtemp6=ATD0DR6H;ADtemp7=ATD0DR7H;if(AdCounter6) VideoDataRowAdCounter*8=ADtemp0; / / 保存结果VideoDataRow AdCounter*8+1 =ADtemp 1 ;VideoDataRow AdCounter*8+2=ADtemp2;VideoDataRowAdCounter*8+3=ADtemp

107、3;45VideoDataRowAdCounter*8+4=ADtemp4;VideoDataRow AdCounter*8+5=ADtemp5;VideoDataRowAdCounter*8+6=ADtemp6;VideoDataRow AdCounter*8+7=ADtemp7;AdCounter+;if(AdCounter=6) / / 如果一行完成/makerecord(ROWFINISH);Row-H-;ATD0CTL5=0x00;if(Row=40)/ / 行计数器加一停止扫描如果一帧完成/makerecord(FRAME_F!NISH);FrameFinish=l;TIE=OxO

108、3;置场完成标志关闭行同步信号中断elseATD0DR0H=ATD0DR0H;1 计时器、定时器、脉冲累加器部分void ECT_init(void)TIOS=OxOO;/ / 计时器、定时器、脉冲累加器初始化/ / 所有通道用于输入TCTL4=TCTL4_EDG0A_MASK|TCTL4_EDG 1 B_MASK|TCTL4_EDG2A_MASK;HO、2上并沿有效1下降沿有效TCTL3=TCTL3_EDG6A_MASK|TCTL3_EDG5A_MASK;TIE=0x00;TSCR2=TSCR2_TOI_MASK; 6、5上升沿有效/ / 暂时不使能任何通道计时器溢出中断使能,正常复位,计

109、时 时 钟 =BusClockPACTL=PACTL_PAEN_MASK|PACTL_PAOVI_MASK;PACN32=0;TimerOverflow=0;/PA使能,中断打开TSCR1=TSCR1_TEN_MASK;自由计时器打开void interrupt ECTOSR(void)TFLG2=TFLG2;TimcrOvcrflow+;自由计数器溢出中断处理/ / 清中断标志void interrupt PAO_ISR(void)PAFLG=PAFLG_PAOVF_MASK;/ / 脉冲累加器溢出中断处理清中断标志void interrupt MDCJSR(void)MCFLG|=MCFL

110、G_MCZF_MASK;MCCTL=0x00;ifi(MdcServiceNumbcr= 1)/ / 模下计数器中断处理清中断标志关闭计数器如果奇场定时时间到46/makerecord(FEILDSTART);TFLG 1=TFLG 1_C2F_M ASK;TIE=0x07;vRow=0;Row=0;else ifiMdcServiceNumber=2) ATD0CTL5=ATD0CTL5_SCANAdCounter=0;/makerecord(ROW_START);MdcServiceNumbcr=O;void interrupt ECTOJSR(void) makerecord(ODDJN

111、TERRUPT);TFLG 1=TFLG1_COF_MASK;OddValid=l;OddCounter-w-;if(VideoEnable)FrameFinish=O;/ / 记录此事件清中断标志位开启行同步信号中断修改以改变第一个采样行的位置清行计数器/ / 如果行定时时间到MASK; 以扫描方式开启AD/ / 置AD序列计数器初值 清服务标志奇场同步中断记录此事件/ / 清中断标志位MCCTL=MCCTL_MCZI_MASK|MCCTL_MCEN_MASK;MCCNT=31560; 定时 22+1.5 行MdcServiceNumber= 1; 置服务标志Row=0;)void inte

112、rrupt ECTl_ISR(void) / / 偶场同步中断makerccord(EVENJNTERRUPT);TFLG1=TFLG1_C 1FMASK; 清中断标志位EvenValid=l;OddValid=0;EvenCounter+;void interrupt ECT2_ISR(void) 行同步中断/makerecord(ROW INTERRUPT);TFLG 1 =TFLG 1 _C2F_MASK; / / 清中断标志位if(! FrameFinish)&VideoEnable) if(vRowVROWRow) MCCTL=MCCTL_MCZI_MASK|MCCTL_MCEN_M

113、ASK;MCCNT=124; 定If 6.25usMdcServiceNumber=2; 置服务标志vRow+;void interrupt COP_ISR(void)PORTB B1T1=O; 指示灯/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *47应用程序*/CountThreshold入口数据:行 数 i ;出u 数据:行平与(灰度

114、;功能:计算第i 行的灰度极值m axi, max2; mini, min2;*/uchar CountThreshold(uchar i)/ / 找出最大和最小的两个数,计算 i 行的阈值unsigned int max 1 =BLACKMAX,max2=BLACKMAX,min 1 =WHITEMAX,min2=WHITEMAX;uchar j;fbr(j=FRAME_LEFT;j=FRAME_RIGHT;j-H-)if(VideoDataiUWHITEMAX)continue;if(VideoDataijmax 1)max2=max 1;max 1 =VideoDataij;else i

115、f(VidcoDataijmax2)max2=VideoDataij;else if(VideoDataijmin 1)min2=minl;min 1 =VideoDatai j;else if(VideoDataijmin2)min2=VideoDataij;retum(uchar)(max2+min2)/2);/* *GetBlacKDots入口数据:出口数据:功能:void GetBlacKDots(uchar i) /5.11 日更新,增加滤波环节uchar j; 5.14日更新,把滤波作用限制在前20行,uchar lastBlackWidth; 因为再往后黑线会变窄,强制滤波会把黑

116、线滤掉48uchar lastBlackLeft;uchar PreBlackWidth;uchar PreBlackLeft;uchar PreBlackRight;uchar BlackSeclionFlag=0;int BlackSum=O,WhiteSum=O;lastBlackWidth=O;lastBlackLeft=O;PreBlackWidth=O;BlackCountcri=0;BlackSectionCounteri=0;for(j=0;j48;j-H-) /rf!j 20 行滤波 统计黑点个数和平均位置,找到最宽连续黑点if(j=0)if(VideoDatai0WH!TE

117、MAX)(VideoDatai 0=VideoDatai 1 ;PolkitcSum-H-;else if(j47)if(iVideoDataij+l+VideoDataij-l+60)VideoDataij=(uchar)(VideoDataij+l+VideoDataij-l)/2);clseif(2*VideoDataij+60VideoDataij+l+VideoDataij-l)VideoDataij-(uchar)(VideoDataij+l+VideoDataij-l)/2);Elseif(VideoDataijWHITEMAX)VidcoDataij=(uchar)(Vidco

118、Dataij-M4-VidcoDataij-l)/2);PolluteSum+;Elseif(VideoDatai47WHITEMAX)(VideoDatai47=VideoDatai46;PolluteSum-H-;49if(VideoDataijPreBlackWidth) /(PreBlackWidth=lastBlackWidth;PreBlackLeft=lastBlackLeft;ii(BlackSectionFlag=0)BlackSectionCounteri-H-;BlackScctionFlag=l;Else 二值化白点WhiteSum+=VideoDataij; 双峰,白

119、点灰度峰lastBlackWidth=O; 宽度清零lastBlackLeft=j+l; /BlackSectionFlag=0;PrcBlackRight=PrcBlackLcft+PrcBlack Width-1;BlackLefti=PreBlackLeft;BlackRighti=PreBlackRight;/ * * * * * * * * * * * * * * * * * * * 初步判断 * * * * * * * * * * * * * * * * * * * * * * * * * /if(BlackSectionCounteri=0)(RoadConditioni=ROA

120、D_OUT;BlackLefti=47;BlackRighti=O;else if(BlackSectionCounteri=l)if(BlackCounteri= 1)(RoadConditioni=ROAD_BREAK;else if(BlackCounteriBlackWidthEstimate)(RoadConditioni=ROAD_CROSS;)elseif(PreBlackLeft=FRAME_RIGHT)整体出线受干扰的行交叉线或严重干扰50 右边沿出线RoadConditioni=ROAD_RIGHT;BlackRighti=FRAME_RIGHT;ElseRoadCondi

121、tioni=ROAD_WELL; 完好的行BlackDrifti=(BlackLefti+BlackRighti-BLACK_ADJUST)*(120+(VL2-VLl)*i*3/VLl)/120;Thresholdi=(uchar)(BlackSum/BlackCounteri+WhiteSum/(48-BlackCounteri)/2); 阈值计算else(RoadConditioni=ROAD_POLLUTED; 受干扰的行if(i=WellRowStart4-2) if(BlackLefti-l=BlackLefti-2)if(BlackLeftiBlackLefti-1 +1)Bla

122、ckLefti=BlackLefti-1 +1;if(BlackLeftiBlackRighti-1 +1)BlackRighti=BlackRighti-1 +1;if(BlackRighti=FRAME_BOTTOM;i-)/ / 寻找左边缘break;elsebreak;if(VidcoDataij-l =Thrcsholdi)BlackLefti=j;break;if(VideoDataiBlackRighti+l=Thresholdi) BlackRightij;break;BlackLefti+l+; 恢复上一行被扩展的边缘BlackRighti+l-;if(BlackLefti=

123、BlackRighti)|(BlackRighti-BlackLefti+lBlackWidthEstimate)左右边沿错位或间距过大, 尝试跳过跳跃失败, 结束搜索WcllRowStart=i+l;RoadConditionWellRowStart=ROAD_BREAK;break;if(BlackLeftiv=FRAME_LEFT)|(BlackRighti=FRAME_RIGHT)/搜索到边框, 停止搜索WellRowStart=i;BlackDrifti=(BlackLefti+BlackRighti-BLACK_ADJUST)*( 120+(VL2-VL1 )*i*3/VL 1)/

124、120;if(BlackLefti=FRAME_LEFT)RoadConditionWellRowStart=ROAD_LEFT;elseRoadConditionWcllRowStart=ROAD_RIGHT;52break;BlackDrifti=(BlackLefti4-BlackRighti-BLACK_ADJUST)*( 12O+(VL2-VL1 )*i*3/VL 1)/120;BlackLefti-; 扩展边缘,为下次搜索作准备BlackRighti-H-;if(iFRAME_TOP)il=FRAMETOP;else if(i 1FRAMERlGHT)jl=FRAME_RIGHT;

125、else if(jlFRAMETOP)i2=FRAME_TOP;else if(i2FRAME_RIGHT)j2=FRAME_R!GHT;else if(j2FRAME_LEFT)j2=FRAME_LEFT;ans=il;il=i2;i2=ans;ans=j2;j2=jl;jl=ans;ans=0;fdr(i=il;i=i2;i+)for(j=j2;jv=jl;j+)if(VideoDataijThresholdi&(jBlackRighti)ans+;retum(ans);void BlackDriftFilterl(void)uchar i;53if(WellRowStart+2WellR

126、owEnd) fbr(i=We 1 1 RowStart ;i=We HRowEnd; i+)BlackDrifti*=20;fbr(i=WellRowStart+l;iWellRowStart;i )BlackDrifti=(BlackDrifti-l+BlackDrifti+l)/2;for(i=WellRowStart;i=WellRowEnd;i+)BlackDrifti/=20;void BlackDri RFiller2(void)uchar i,j;if(WellRowStart38)WellRowEnd=3 8;if( WellRowStart+2WellRowEnd) 如果路

127、径有效扩展精度/ / 向前滤波向后滤波恢复精度/ / 滤波,新的算法/6.29日更新容错处理如果路径有效fbr(i=WellRowStart;i=l;j-)fbr(i=WellRowStart+j; i=Well RowStart+j ;i ) 向后滤波BlackDrifti=(BlackDrifti-j+BlackDrifti+BlackDrifti+j)/3;BlackDrifti-j=BlackDrifti-(BlackDrifti+j-BlackDrifti-j)/2;BlackDrifti+j=2*BlackDrifti-BlackDrifti-j;fbr(i=WellRowStar

128、t;i2)retum(l);elseretum(O);else ififlag=RIGHT_TURN) 54if(CountBlacks(FRAME_BOTTOM,FRAME_RIGHT,6,40)2)return( 1);elseretum(O);void CountCurvature(uchar i 1 ,uchar i2)uchar mid;int dx 1 ,dx2,dx3,dy 1 ,dy2,dy3;if(ili2) /il i2 ,则交换mid=i 1;il=i2;i2=mid;)if(il+6l 0000) PrcCurvatureNum=PreCurvaturcNum*90/(

129、PreCurvaturcDen/100);Curvaturc=(int)PrcCurvatureNum;else(PreCurvatureNum=PreCurvatureNuin*9000/PreCurvatureDen;Curvature=(i nt)PrcC urvatureN um;)if(Curvature99)Curvature=99;CurvatureCache3=CurvatureCache2;CurvatureCache2=CurvatureCachc 1 ;CurvatureCache 1 =CurvatureCacheO;if(i2-il=6)CurvatureCache0

130、=(Curvature*5+CurvatureCache 1 *5)/10;else if(i2-il=10)CurvatureCache0=(Curvature*6+CurvatureCache 1 *4)/10;else if(i2-il=14)55CurvatureCache0=(Curvature*7+CurvatureCache 1 *3)/10;else if(i2-il99)CurvatureCache0=99;else if(CurvatureCache0-99)CurvatureCache0=-99;DiffCurvature=(2*CurvatureCache0-Curva

131、tureCachel-CurvatureCache2)/3;void GetValidRoad(void)uchar i;WellRowStart=FRAME_BOTTOM;WellRowEnd=FRAME_BOTTOM;fbr(i=FRAME_BOTTOM;i=WcllRowStart+2)break;elsei=WellRowEnd+1;WcllRowStart=FRAME_BOTTOM;WellRowEnd=FRAMEjBOTTOM;i f( SpccdG i ven!=0) SRUPRE.WRS=WcllRowStart;SRUPRE.WRE=WellRowEnd;SRUPRE.DFT

132、=(char)BlackDriftWellRowStart;SRUPRE.SLP=(char)NearSlope;SRUPRE.CVT=(char)Curvature;/ / 计算有效路径/ / 找到完好的第一行沿边沿向上寻找如果找到的路径长度大于等于3行, 跳出否则继续寻找如果不停车存数据uchar GetStartingLine(void) 识别起跑线char i;char ia;ia=(char)(NearSlopeCache0/30);fbr(i=pWellRowStart+2;i+22)return(O);iftBlackSectionCounteri= 1)continue;if(

133、RoadConditioni=ROAD_CROSS|RoadConditioni+l=ROAD_CROSS|RoadConditioni+2=ROAD_CROSS|RoadConditioni4-3=ROAD_CROSS)return(O);ifi(CountBlacks(i,BlackLefti-2,i+2,BlackLefti-5)=3)56if(CountBlacks(i-ia,BlackRighti-ia+5,i-ia+2,BlackRighti-ia+2)=3)StartingLinePos=i;return(l);return(O);)void CountTargetSpeed(v

134、oid)if(RoadMarkNextMark.MarkStyle=LEFT_TURN|RoadMarkNextMark.MarkStyle=RIGHT_TURN)TargetSpeed=CS 180;ififm_abs(RoadMarkNextMark+l.Discribc-RoadMarkNextMark.Discribe)RoadMarkNextMark+l.PulseCountcr+88)如果弯道后的直道足够长if(NextMark=0|(RoadMarkNextMark.PulseCounterRoadMarkNextMark-l.PulseCounter+388) / / 如果是以

135、直道入弯AccEn=l;/SensitiveFlag=l;TargetSpeed=CS90;else if(RoadMarkNextMark.MarkStyle=SPRINT)TargetSpeed=28;RoadMarkNextMark.PulseCounter+=1000;AccEn=l;DriftGiven=0;elseMeinoryState=INCOMPLETE;void RoundControl(void) 圈数控制SRUPRE.FU STARTINGLINE FLAG;StartingLinePos=0;if(ValidRoad&! CrossFlag) 如果路径有效并且五交叉线

136、ifi(NcarSlopcCachc0300|RoundCounter=0) / / 如果斜率不超过范围if(GetStartingLine()=O) if(lsStarting0)RoundCounter-H-;PACN32ClcarFlag=1;StrightCounter=0;AheadCounter=0;PreRoadPosition=NearSlope/2;如果识别出起跑线/ / 如果已经连续1次以上看到起跑线圈数加一/ / 置路程脉冲累加计数器清空标志直道帧数重新计数57Position=(long)NearSlope*Kpos;ifiRoundCounter=l) RoadMar

137、kCounter=0;Round 1 Time=FrameCounter;)else ifi(RoundCountei=2) 如果是第一- 圈/ / 路标个数计数器置零如果是第二圈iRRoadMarkCounterRoadMarkLcnth) 如果路标记忆未满MemoryState=COMPLETED; / / 标记记忆完成RoadMarkRoadMarkCounter.MarkStyle=SPRINT; 最后的路标是冲刺标志RoadMarkRoadMarkCounter.Discribe=PreRoadPosition;RoadMarkRoadMarkCounter.PulseCounter

138、=PACN32;NcxtMark=O;RoadMarkCounterH-;if(MemoryControlEn)CountTargetSpeed();)else否则MemoryState=OVERFLOW;Round 1 Time=FrameCounter-Round 1 Time;Round2Time=FrameCounter; else if(RoundCounter=ROUND)Round2Time=FrameCounter-Round2Time;if(MemoryControlEn|RaceTimerEn)StopCounter=l;停车倒计时标记记忆溢出如果达到设定圈数IsStart

139、ing=O;else否则SRUPRE.FU |=STARTINGLINE_FLAG;store(STARTINGLINE_FLAG);/FunctionDebug(3);ifiIsStarting25)IsStarting-H-;清起跑线计数器/ / 起跑线计数器限幅void CreatMark(uchar flag) if(RoadMarkCounter=WellRowStart+2&ValidRoad) 如果当前路径有效if(RoadConditionWellRowEnd=ROAD_WELL|RoadConditionWcllRowEnd=ROAD_BREAK) 如果路径完好LastRoa

140、dStyle=STRIGHT;)else if(RoadConditionWellRowEnd=ROAD_LEFT) LastRoadStyle=LEFT_TURN;else iRRoadConditionWellRowEnd=ROAD_RTGHT)LastRoadStyle-RIGHT_TURN;/ / 标记上次路径为完好如果路径为左出边界标记上次路径为左转/ / 如果路径为右出边界标记匕 次路径为右转else if(ValidRoad) 否则,如果当前路径有效if(LastRoadStyle=STRIGHT) / / 如果上次路径为直线if(RoadConditionWellRowEnd=

141、ROAD_WELL|RoadConditionWcllRowEnd=ROAD_BREAK) 跳转规则:直线,直线if(CurvatureCache015&DiffCurvature8)|(CurvatureCache0-15&DiffCurvature 1)AheadCounter+;)AheadTurn+;)elseAheadTurn=O;else if(RoadConditionWellRowEnd=ROAD_LEFT) 跳转规则 1 :直线左转LastRoadStyle=LEFT_TURN;if(RoundCounter= 1)CreatMark(LEFTTURN);else if(Ro

142、adConditionWellRowEnd=ROAD_RIGHT) 跳转规则 1:直线 右转LastRoadStyle=RlGHT_TURN;ifi(RoundCounter=l)CreatMark(RIGHT_TURN);else if(LastRoadStyle=LEFT_TURN) 如果上次路径为左转if(RoadConditionWellRowEnd=ROAD_WELL) 跳转规则:左转直线LastRoadStyle=STRIGHT;59iftRoundCounter= 1)CreatMark(STRlGHT);)else if(RoadConditionWellRowEnd=ROAD

143、_BREAK)if(m_abs(NearSlope)v=l5&BottomDrift20&m_abs(Curvature)v20)/跳转规则:左转,直线LastRoadStyle=STRIGHT;ifiRoundCounter= 1)CreatMark(STRIGHT);else ifIRoadConditionWcllRowEnd=ROAD_RIGHT) 跳转规则:左转, 右转LastRoadStyle=RIGHT_TURN;else if(LastRoadStyle=RIGHT_TURN) 如果上次路径为右转if(RoadConditionWellRowEnd=ROAD_WELL) 跳转规

144、则:右转,直线LastRoadStyle=STRIGHT;if(RoundCounter= 1)CreatMark(STRIGHT);)else ifi(RoadConditionWcllRowEnd=ROAD_BREAK)if(m_abs(NearSlope)=15&BottomDrift20&m_abs(Curvature) 直线LastRoadStyle=STRlGHT;ifiRoundCounter= 1)CreatMark(STRIGHT);else if(RoadConditionWellRowEnd=ROAD_LEFT)LastRoadStyle=LEFT_TURN;ifiLas

145、tRoadStyle=STRIGHT)store(STRIGHT_FLAG);else if(LastRoadStyle=LEFT_TURN)store(LEFT_TURN_FLAG);else ifi(LastRoadStyle=RIGHT_TURN)store(RIGHT_TURN_FLAG);RoadOutFlag=0;else(RoadOutFlag+;Vai i dRoadCounter=0;if(AccFlag)AccFlag=O;SpeedCtl_I=SpeedCacheO *12+SpeedCtl_I_init;)#ifdefDEBUG_ENif(RoadOutFlag50)

146、if(!StepFlag)|CaptureFlag)FunctionDcbug(8);/ / 跳转规则:右转。左转如果当前路径无效置出线标志60#endif)void SpeedControl(void) if(LastRoadStyle=STRIGHT) SpeedAdjust=O;TurnCounter=0;i StrightCounter=0)AheadCounter=0;StrightCounter-H-;SpcedAdjust=O;TargetSpeed=SpeedGiven;ififBrakeFlag) SpeedCtl_I=SpeedCacheO*l l+SpeedCtl_I_i

147、nit;BrakeFlag=O;else(TargetSpeed=min(NoRoadSpeed+(99-(m_abs(CurvatureCache0)/3),SpeedGiven);iflfAdvanceAccEn) 提前加速if(m_abs(CurvatureCache0)TargetSpeed+3&BrakeEn)BrakeFlag=2;if(StopCounterl 8)RealSteer+=18;else if(RealSteer-SteerIncrement18)RealSteer-=18;elseRealSteer=SteerIncrement;Position+=(long)R

148、ealSteer*PreSpeed;PreRoadPosition=(int)(Position/Kpos)+NearSlope/2;void Round2Control(void) ifi(RoundCounter=2&MemoryState=COMPLETED&SpeedGiven0&MemoryControlEn)ififSRUPRE.FU%4!=STRIGHT_FLAG) 如果当前状态是弯道if(SRULST.FU%4=STRIGHT_FLAG) 如果上次状态是直道if(m_abs(int)PACN32+PulseAdjust-(int)RoadMarkNextMark.PulseCo

149、unter)T 1+10) /FunctionDebug(99);SynchronousError+-i-;if(OddValid & i=0)if(OddValid)ERROR_VALUE=1;elseERROR_VALUE=2;SynchronousError+;/FunctionDebug( 100);)i fifTimcrO verflo w0) ERROR_VALUE=TimerOverflow-Tl;SynchronousError-H-;/FunctionDebug(98);if(! StepFlag)&SynchronousError5) FunctionDcbug( 101)

150、;#endifTl=TimerO verflow;T2=TCNT;#ifdefDEBUG_ENif(!StepFlag) |CaptureFlag)#endifSpeed_PID();VibrationDetect();if(0ddValid)PolluteSum=0;while(Row=0) iflFrameCounter=0)Threshold0=CountThreshold(0);fbr(i=0;i=Row)GetBlacKLDots(uchar)i);置视频采集允许标志清中断标志开启场同步中断/ / 等待奇场或偶场同步信号/ / 严重错误,丢失场同步脉冲 ! ! 计算时间溢出严重错误,

151、场同步脉冲间隔太小! !速度PID调节加速度检测奇场处理/ / 等待第0行采集完成如果是第一帧计算第0行的阈值等待第i行采集完成对i行初步处理64while(!F rameFinish)FrameCounter+;OddValid=0;else if(EvcnValid)if(FrameFinish)#ifdefDEBUG_ENifi(Poll uteS um= 100)FunctionDebug(l);if(MessageSendEn)SendMessage();#endif等待一场采集完成场计数器加一/ / 清奇场标志偶场处理如果奇场采集完成/ / 发送实时消息TimerFagment0=

152、(int)(long)(TimcrOverflow-T1 )*65535+TCNT-T2)/240);GetValidRoad(); 计算有效路径TimerFagmentl=(int)(long)(TimerOverflow-Tl)*65535+TCNT-T2)/240);#ifdefDEBUG_ENMakeMessage(); 生成实时消息#endifTimcrFagment2=(int)(long)(TimcrOvernow-Tl )*65535+TCNT-T2)/240);RoundControl(); 圈数控制TimerFagment3=(int)(long)(TimcrOverflo

153、w-Tl)*65535+TCNT-T2)/240);StateShiftControl(); 状态转移控制TimerFagment4=(int)(long)(TimerOverflow-Tl)*65535+TCNT-T2)/240);SpeedControl(); 速度控制TimerFagment5=(int)(long)(TimcrOverflow-Tl)*65535+TCNT-T2)/240);DirectionControl(); 舵机控制TimcrFagmcnt6=(int)(long)(TimcrOvcrnow-Tl)*65535+TCNT-T2)/240);Real SteerEs

154、timate(); 实际方向估计TimerFagment7=(int)(long)(TimerOverflow-Tl)*65535+TCNT-T2)/240);Round2Control(); 记忆控制TimerFagment8=(int)(long)(TimerOverflow-Tl)*65535+TCNT-T2)/240);#ifdefDEBUG_ENif(! StepFlag)|CaptureFlag)ErrorDetect(); / / 错误和停车检测#endifHillDetect(); 坡道检测#ifHefDEBUG_ENUpdateMessageQ; 更新实时消息if(StepF

155、lag)ififCaptureFlag) if(SCHSRl_RDRF)ifi(SCIlDRL=,+)if(SpeedGiven0)SpeedGiven ;else iRSCIl D R L=S|SC I 1 D R L =,s) MessageSendEn=l;elsedelay(lOO);65while(SCIl SR1_RDRF) 忽略连续收到的其它字符T3=SCI1DRL;delay(lOO);)CaptureFlag=O;Sci lTransString(nnRace Brake*);StcpDcbugO;elseStepDebug();elseifi(SCI1SRl_RDRF)wh

156、ile(SCHSRr_RDRF) 忽略连续收到的其它字符T3=SCI1DRL;delay(lOO);FunctionDebug(l 0);)#endifif(! StopCounter) if(SRC0) StopCounter-H-;if(StopCounter 10)SpeedGiven=O;if(SpeedCacheO=O)FunctionDcbug(O);停车检测if(PTJ_PTJ7=0&(! QuickStart) PWMDTY23=0;PWMDTY01=0;FunctionDebug( 10);手动停车#endif66for(;) /* wait forever */* plelase make sure that you never leave this function */67

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号