飞思卡尔杯全国大学生智能车大赛摄像头组图像处理程序
基于摄像头的自主循迹小车系统设计
基于摄像头的自主循迹小车系统设计
摘要
“飞思卡尔杯”全国大学生智能汽车邀请赛属教育部主办的全国五大竞赛之一,其专业知识涉及控制、模式识别、传感技术、汽车电子、电气、计算机、机械等诸多学科。根据大赛的技术要求,设计制作了智能车控制系统。在整个智能车控制系统中,如何准确地识别道路及实时地对智能车的速度和方向进行控制是整个控制系统的关键。
本文首先对智能车的硬件进行设计,达到了低重心、大前瞻、高稳定性的目标。其次对系统的软件部分进行设计,利用动态阈值法分割处理采集到的图像,得到赛道信息,从而得到智能车的偏航角和偏航距离。综合偏航角和偏航距离两个控制量对舵机进行控制,实现了入弯走内道,S弯直线冲过的目标,大大提高了智能车的弯道运行速度。用光电编码盘检测智能车的运行速度,再根据赛道信息给定智能车的运行速度,运用增量式PID算法调节驱动电机转速,实现了电机的快速响应。
整个系统涉及车模机械结构调整、传感器电路设计及信号处理、控制算法和策略优化等多个方面。经过大量测试,最终确定了现有的系统结构和各项控制参数。
关键字:智能车;图像传感器;阈值分割;路径识别;
Abstract
Freescale Cup National Undergraduate Smart Car Competition is sponsored by the National Ministry of Education, one of the five contests, their professional knowledge related to control, pattern recognition, sensor technology, automotive electronics, electrical, computer, machinery and many other disciplines. According to the technical requirements of the contest, we design the intelligent vehicle control system. In the entire control system of the smart car, how to accurately identify the road and real-time control the speed and direction of the Smart Car is the key to the whole control system.
飞思卡尔智能车大赛技术报告
第九届“飞思卡尔”杯全国大学生智能车竞赛光电组技术报告
学校:中北大学
伍名称:ARES
赛队员:贺彦兴
王志强
雷鸿
队教师:闫晓燕甄国涌
关于技术报告和研究论文使用授权的说明书本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日期:2014-09-15日
摘要
本文介绍了第九届“飞思卡尔杯全国大学生智能车大赛光电组中北大学参赛队伍整个系统核心采用飞思卡尔单片机MC9S12XS128MAA ,利用TSL1401线性CCD 对赛道的行扫描采集信息来引导智能小车的前进方向。机械系统设计包括前轮定位、方向转角调整,重心设计器件布局设计等。硬件系统设计包括线性CCD传感器安装调整,电机驱动电路,电源管理等模块的设计。软件上以经典的PID算法为主,辅以小规Bang-Bang
算法来控制智能车的转向和速度。在智能车系统设计开发过程中使用Altium Designer设计制作pcb电路板,CodeWarriorIDE作为软件开发平台,Nokia5110屏用来显示各实时参数信息并利用蓝牙通信模块和串口模块辅
助调试。关键字:智能车摄像头控制器算法。
目录
1绪论 (1)
1.1 竞赛背景 (1)
1.2国内外智能车辆发展状况 (1)
1.3 智能车大赛简介 (2)
1.4 第九届比赛规则简介 (2)
第八届飞思卡尔智能车竞赛摄像头组浙工大银江逐梦队技术报告
第八届"飞思卡尔"杯全国大学生
智能汽车竞赛
技术报告
学校:浙江工业大学
队伍名称:浙工大银江逐梦队
参赛队员:孟泽民
章志诚
徐晋鸿
带队教师:陈朋、朱威
关于技术报告和研究论文使用授权的说明
本人完全了解第八届"飞思卡尔"杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:孟泽民
章志诚
徐晋鸿
带队教师签名:陈朋
朱威
日期:2013.8.15
摘要
本文设计的智能车系统以MK60N512ZVLQ10微控制器为核心控制单元,通过Ov7620数字摄像头检测赛道信息,使用K60的DMA模块采集图像,采用动态阈值算法对图像进行二值化,提取黑色引导线,用于赛道识别;通过编码器检测模型车的实时速度,使用PID 控制算法调节驱动电机的转速和转向舵机的角度,实现了对模型车运动速度和运动方向的闭环控制。为了提高模型车的速度并让其更稳定,我们使用自主编写的Labview上位机、SD卡模块、无线模块等调试工具,进行了大量硬件与软件测试。实验结果表明,该系统设计方案可行。
关键词:MK60N512VMD100,Ov7620,DMA,PID,Labview,SD卡
Abstract
In this paper we will design a smart car system based on MK60N512ZVLQ10 as the micro-controller unit. We use a Ov7620 digital image camera to obtain lane image information. The MCU gets the image by its DMA module. Then convert the original image into the binary image by using dynamic threshold algorithm in order to extract black guide line for track identification. An inferred sensor is used to measure the car`s moving speed. We use PID control method to adjust the rotate speed of driving electromotor and direction of steering electromotor,to achieve the closed-loop control for the speed and direction. To increase the speed of the car and make it more reliable,a great number of the hardware and software tests are carried on and the advantages and disadvantages of the different schemes are compared by using the Labview simulation platform designed by ourselves,the SD card module and the wireless module. The results indicate that our design scheme of the smart car system is feasible.
飞思卡尔智能车摄像头组freescale程序代码
extern int left,w,top,h;
extern HDC m_hdc;
CBrush brush3(RGB(0,255,0));
CBrush brush4(RGB(255,0,0));
CBrush brush5(RGB(255,255,0));
#else
#include
#include "math.h"
// #include "LQfun.h"
#endif
#ifdef ccd
#define MAX_VIDEO_LINE 39
#define MAX_VIDEO_POINT 187
#else
//#define MAX_VIDEO_LINE 26
// #define MAX_VIDEO_POINT 301
#define MAX_VIDEO_LINE 78
#define MAX_VIDEO_POINT 57
#endif
extern unsigned char g_VideoImageDate[MAX_VIDEO_LINE][MAX_VIDEO_POINT];
#define INT8U unsigned char
#define INT8S signed char
#define INT16U unsigned int
#define INT16S int
#define INT32S int
#define NO_DATA_180 254
//#define INT32U unsigned int
unsigned char LIMIT=((MAX_VIDEO_POINT)/2);
unsigned char MIDDLE[MAX_VIDEO_LINE];
第八届最新飞思卡尔智能车比赛细则12
第八届全国大学生“飞思卡尔”杯
智能汽车竞赛
竞速比赛规则
与赛场纪律
参赛的选手须使用竞赛秘书处统一指定的竞赛车模套件,采用飞思卡尔半导体公司的8位、16位、32位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分(省)赛区的场地比赛,在获得决赛资格后,参加全国决赛区的场地比赛。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间来决定,参加全国总决赛的队伍同时必须提交车模技术报告。大赛根据道路检测方案不同分为电磁、光电平衡与摄像头三个赛题组。使用四轮车模通过感应由赛道中心电线产生的交变磁场进行路经检测的属于电磁组;使用四轮车模通过采集赛道图像(一维、二维)或者连续扫描赛道反射点的方式进行进行路经检测的属于摄像头组;使用指定两轮车模保持车体直立行走的车模属于平衡组。
竞赛秘书处制定如下比赛规则适用于各分(省)赛区比赛以及全国总决赛,在实际可操作性基础上力求公正与公平。
一、器材限制规定
1.
电机RN-260
各赛题组车模运行规则:
(a) 电磁组:四轮车模正常运行。
车模使用A型车模。车模运行方向为:转向轮在前,动力轮在后,如图1所示:
动力轮转向轮
图 1电四轮车模运行模式
(b) 摄像头组:车模反方向运行。
车模使用B 型车模。车模运行方向为:动力轮在前,转向轮在后,如图2所示: 动力轮转向轮车模运行方向
图 2摄车模运行模式
(3) 光电平衡组:车模直立行走。
使用D 型车模。车模运行时只允许动力轮着地,车模直立行走。车模运
全国大学生飞思卡尔杯
第二届全国大学生“飞思卡尔”杯
智能汽车竞赛
技术报告
学校:东北大学
队伍名称:猎豹
参赛队员:秦召兵、师恩义、王力
带队教师:张云洲
关于技术报告和研究论文使用授权的说明
本人完全了解第二届全国大学生“飞思卡尔”杯智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日期:
目录
第一章引言 (1)
第二章智能汽车整体设计 (3)
2.1 导航方案的选取 (3)
2.2 系统资源需求与分配 (4)
2.3 机械结构设计 (5)
2.3.1 车模结构特点 (5)
2.3.1 电路板 (5)
2.4 开发流程 (6)
2.4.1 编译环境 (6)
2.4.2 下载调试 (6)
第三章视频信号采集 (7)
3.1 采集分析 (7)
3.2 采集时序 (7)
3.3 中断分析 (9)
第四章智能汽车硬件设计 (12)
4.1 电源模块 (12)
4.1.1 5V供电电源 (13)
4.1.2 6V供电电源 (13)
4.1.3 12V升压电路 (13)
4.2 时钟模块 (15)
4.3 串口模块 (15)
4.4 测速模块 (16)
4.5 循线模块 (17)
4.6 电机驱动模块 (18)
4.7 抗干扰技术 (19)
第五章智能汽车软件设计 (21)
5.1 路径识别与自适应阈值计算 (21)
5.2 抗干扰处理 (24)
5.3 算法实现 (27)
飞思卡尔杯全国大学生智能汽车邀请赛北理风行者车队技术报告
,如图
3.4。主销后倾的作用是在车轮偏转后会产生一回正力矩, 矫正车轮的偏转。后倾角
越大,车速越高,车轮偏转后自动回正能力越强。但回正力过大,将会引起前轮
回正过猛,加速前轮摆振,并导致转向沉重。通常后倾角值应设定在
10--30。
模型车通过增减黄色垫片的数量来改变主销后倾角:每侧有 4 片垫片,前 2 后 2,对应的后倾角为 00;前 1 后 3,后倾角为 20--30;前 0 后 4,后倾角为 40--60。
以智能汽车为研究背景的科技创意性制作,是一种具有探索性的工程实践活 动,其本质也是人类创造有用人工物的一种训练性实践,其过程属性是综合,而结 果属性很可能是创造。通过竞赛,参赛的同学们培养了对已学过的基础与专业理论 知识与实验的综合运用的能力;带着背景对象中的各种新问题,学习控制、模式识 别、传感技术、电子、电气、计算机、机械等多个学科新知识,包括来自不同学科 背景大学生的相互学习,逐渐学会了在学科交叉、集成基础上的综合运用;若是以 实用为目的,还必须考虑考虑可靠性、寿命、外观工业设计、集成科学与非科学, 在具体约束条件下融合形成整体的综合运用。这样的训练是很有意义的。
第一章 引 言 1
1.1 研究背景介绍 1
1.2 系统方案介绍 2 1.3 章节安排 2 第二章 技术方案概要说明 4
2.1 智能车系统分析 4 2.2 智能车系统硬件结构设计 4 2.3 智能车系统软件结构设计 5 第三章 机械系统设计说明 6
飞思卡尔杯大学生智能汽车创意赛车模的制作
价值工程
0引言近年来,智能车辆和智能交通已成为汽车和智能控制领域的热点研究课题之一。本文是在第六届飞思卡尔全国大学生智能汽车创意赛背景下创作的,具体介绍了一种基于CCD 摄像头的智能车在复杂道路条件下的运行情况。
飞思卡尔CCD (Charge-coupled Device ,中文全称:电荷耦合元件,称为CCD 图像传感器)循迹智能车,是限定16位微控制器MC9S12XS128作为唯一控制处理器,硬件方面主要由电源管理,电机驱动,舵机转向控制,路径检测,车速管理等模块构成,在软件方面是使用CodeWarrior 3.1实现控制。根据CCD 摄像头在黑色跑道,和两端白色边线的反射率的反差所检测到的信号,再将信号传输到处理器中。通过比例控制实时修正舵机的PWM 占空比,使智能小车能够按照只按照中间黑色跑道行驶。
1系统设计
1.1系统硬件设计方案系统硬件设计是整个智能车设计最基础同样也是最重要的部分,硬件各模块会影响到车模行驶稳定性和
转向灵活性。
正确的硬件设计方向与思路为软件系统的发挥提供了强大的保障,硬件设计框图如表1所示。
1.2系统软件设计方案软件程序高效稳定运行是车模快速平
稳完成各个功能的基础。智能车系统主要包括以下模块:飞思卡尔MCU 模块、电源模块、转向舵机模块、CCD 视频采集模块、电机驱动控制模块、转速反馈(编码器)模块以及超声波模块。CCD 摄像头采集赛道图像信号后,以PAL 制式信号输出到信号处理模块进行片外AD 转换并同时进行视频同步信号分离,分离出场同步信号,行同步信号,奇偶场信号。经AD 转换后的数据和同步信号同时输入
飞思卡尔杯全国大学生智能汽车竞赛技术报告_摄像头组
第十届"飞思卡尔"杯全国大学生智能汽车竞赛技术报告
第十届“飞思卡尔”杯全国大学生
智能汽车竞赛
技术报告
学校:电子科技大学
摘要
本文设计的智能车系统以MK60DN512ZVLQ10微控制器为核心控制单元,通过CMOS摄像头检测赛道信息,使用模拟比较器对图像进行硬件二值化,提取黑色引导线,用于赛道识别;通过编码器检测模型车的实时速度,使用PID控制算法调节驱动电机的转速和转向舵机的角度,实现了对模型车运动速度和运动方向的闭环控制。
关键字:MK60DN512ZVLQ10,CMOS,PID
Abstract
In this paper we will design a smart car system based on MK60DN512ZVLQ10as the micro-controller unit. We use a CMOS image sensor to obtain lane image information. Then convert the original image into the binary image by the analog comparator circuit in order to extract black guide line for track identification. An inferred sensor is used to measure the car`s moving speed. We use PID control method to adjust the rotate speed of driving electromotor and direction of steering electromotor, to achieve the closed-loop control for the speed and direction.
第七届全国大学生飞思卡尔杯智能汽车竞赛
第七届全国大学生“飞思卡尔”杯智能汽车竞赛
竞速比赛规则与赛场纪律
参赛选手须使用竞赛秘书处统一指定的竞赛车模套件,采用飞思卡尔半导体公司的8位、16位、32位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分(省)赛区的场地比赛,在获得决赛资格后,参加全国决赛区的场地比赛。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间来决定,参加全国总决赛的队伍同时必须提交车膜技术报告。大赛根据车模检测路径方案不同分为电磁、光电与摄像头三个赛题组。车模通过感应由赛道中心电线产生的交变磁场进行路经检测的属于电磁组;车模通过采集赛道图像(一维、二维)或者连续扫描赛道反射点的方式进行进行路经检测的属于摄像头组;车模通过采集赛道上少数孤立点反射亮度进行路经检测的属于光电组。
竞赛秘书处制定如下比赛规则适用于各分(省)赛区预赛以及全国总决赛,在实际可操作性基础上力求公正与公平。
一、器材限制规定
1. 须采用统一指定的车模。本届比赛指定采用三种车模,分别用于三个赛题组:
编
号
车模外观和规格赛题组供应厂商A
型
车
模
车模:G768
电机:RS380-ST/3545,摄像头
组
东莞市博
思电子数
码科技有
限公司
舵机:FUTABA3010 B
型
车
模
车模型号
电机:540,伺服器:S-D6光电组
北京科宇
通博科技
有限公司
C
型
车
模
车模型号:N286
电机:RN260-CN 38-18130
伺服器:FUTABA3010电磁组
飞思卡尔智能车摄像头组技术报告之欧阳引擎创编
第七届“飞思卡尔”杯全国大学生
欧阳引擎(2021.01.01)
智能汽车竞赛
技术报告
(校徽)
学校:*********
队伍名称:******
参赛队员:******
******
******
带队老师:******
关于技术报告和研究论文使用授权的说明
本人完全了解第七届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日期:
摘要
本文以第七届全国大学生智能车竞赛为背景,介绍了智能赛车控制系统的软硬件结构和开发流程。该比赛采用组委会规定的标准车模,以Freescale 半导体公司生产的16 位单片机MC9S12X128为核心控制器,在CodeWarrior IDE开发环境中进行软件开发,要求赛车在未知道路上完成快速寻线。整个系统涉及车模机械结构调整、传感器电路设计及信号处理、控制算法和策略优化等多个方面。为了提高智能赛车的行驶速度和可靠性,对比了不同方案(如摄像头与光电管检测方案)的优缺点,并结合Labview 仿真平台进行了大量底层和上层测试,最终确定了现有的系统结构和各项控制参数。它采用摄像头对赛道进行检测,通过边缘提取获得黑线位置,用PID 方式对舵机进行反馈控制。通过速度传感器获取当前速度,采用增量式数字PID控制实现速度闭环,根据预判信息和记忆信息对速度进行合理分配。同时采用拨码开关和LCD显示屏实现人机交互系统。测试结果表明,在该控制系统下,自寻迹机器人小车具有良好的位置跟踪和快速切换速度性能。
第五届飞思卡尔杯全国大学生智能汽车竞赛技术报告
第五届全国大学生智能汽车邀请赛技术报告
第五届飞思卡尔杯全国大学生智能
汽车竞赛技术报告
第一章引言
“飞思卡尔杯”智能车大赛起源于韩国,是韩国汉阳大学汽车控制实验室在飞思卡尔半导体公司资助下举办的以HCSl2单片机为核心的大学生课外科技竞赛。组委会提供一个标准的汽车模型、直流电机和可充电式电池,参赛队伍要制作一个能够自主识别路径的智能车,在专门设计的跑道上自动识别道路行驶,谁最快跑完全程而没有冲出跑道并且技术报告评分较高,谁就是获胜者。其设计内容涵盖了控制、模式识别、传感技术、汽车电子、电气、计算机、机械、能源等多个学科的知识,对学生的知识融合和实践动手能力的培养,具有良好的推动作用。
智能小车系统由HCS12微控制器、电源管理单元、路径识别电路、车速检测模块、舵机控制单元和直流驱动电机控制单元组成。本系统以飞思卡尔公司的16位微处理器MC9S12XS128为控制核心,并采用CodeWarrior软件编程和BDM作为调试工具。运用激光发射强大光线,使用采集光敏传感器AD值进行道路信息采集,并采用PWM技术来控制舵机的转向和电机转速。舵机控制主要采用PWM信号开环控制,而速度控制方面,由数据表来设定速度,PID控制来调整速度。通过将总线频率超频到40M来更快更准确地进行控制。各个部分经过MCU的协调处理,能够以较快的速度在指定的轨迹上行驶,在进弯道之前能够提前减速并改变角度,达到平滑过弯和减小路程的效果。
在前几个月的努力中,我们自主设计机械结构和控制电路,构思独特算法,并一次次地对单片机具体参数进行调试。可以说,这辆在跑道上奔驰的小车凝聚着我们的汗水和智慧。
飞思卡尔智能车摄像头组入门指南
飞思卡尔智能车摄像头组入门指南
摄像头
摄像头的组成主要分为三部分:镜头、含传感器的处理芯片、外围电路板。
镜头主要就是一个凸透镜,透镜焦距越小越广角,同时桶形失真越严重;焦距越大,视角越窄,透镜越接近理想的“薄透镜”则可忽略桶形失真。
处理芯片将传感器上的电压信号按照已定义的协议输出。
外围电路主要提供电源、稳压、时钟等功能。
摄像头按照信号类型可分为模拟摄像头、数字摄像头两种。由于单片机普通IO口只能读取数字信号,故对于模拟摄像头要设计模数转换(ATD)。数字摄像头数据可以直接进单片机。用模拟摄像头的缺点是要自己设计模数转换电路,同步信号分离电路。优点是可以自行加入硬件二值化电路,即对某一个像素点只用1、0来表示黑、白。
摄像头按照传感器,可分为CCD、CMOS。CCD成像质量好,贵。CMOS 成像质量略差,便宜。
摄像头的选取
从尽快实现,缩短开发时间的方面考虑,应购买数字摄像头。典型的型号是OV7620(该型号是指处理芯片的型号)。OV7620是CMOS数字摄像头,采用PAL制式,默认隔行扫描,默认YUV颜色空间输出(详见后文)。
长远考虑,应选取CCD模拟摄像头。一来可以避免高速状态下的运动模糊,二来可以自行设计硬件二值化电路,FIFO电路等,大大降低CPU 运算压力。
摄像头信号协议介绍
每秒超过24帧的连续图片即可形成动态的视频。考虑到我国采用50Hz交流电,为了实现方便,摄像头被设计为每秒25帧,每帧耗时两个周期。还是为了实现方便,每一帧图片被分为两半,每半帧耗时一个周期。半帧的划分方式为:奇数行和偶数行各组成半帧。即通常的电视机,每20ms奇数行的信息刷新一次,接下来20ms偶数行刷新一次,再20ms奇数行刷新一次……。欧美采用60Hz交流电,摄像头每16.6ms刷新一次,被称为PAL制式。
第二届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告
10.4设计中存在的问题……………………………………………26.
10.5以后寄语…………………………………………………………27
第一章 引 言
1.1 竞赛背景介绍
受教育部高等教育司托付,高等学校自动化专业教学指导分委员负责主办全国大学生智能车竞赛。该项竞赛已列入教育部主办的全国五大竞赛之一。2007年8月日,在上海交通大学举行第二届全国大学生智能车竞赛。本届的竞赛,第一是在全国五大赛区进行预选赛,之后将有只赛车到上海进行总决赛。在竞赛中,“参赛选手须使用大赛组委会统一提供的竞赛车模,采纳飞思卡尔16操纵器MC9S12DG128作为核心操纵单元,自主构思控传感器信号采集处理、操纵算法及执行、动力电机驱动、转向舵机操纵等,完成智能车工程制作及调试,于指定日期与地点参加场地竞赛。参赛队伍之名次(成绩)由赛车现场成功完成赛道竞赛时刻为主,技术方案及制作工程质量评分为辅来决定”,“须采纳统一提供的车模,须采纳限定的飞思卡尔16位微操纵器 MC9S12DG128 作为唯独操纵处理器,车模改装完毕后,尺寸不能超过:250mm 宽和400mm长,高度无限制”,“跑道宽度不小于600mm,跑道表面为白色,中心有连续黑线作为引导线,黑线宽25mm”,同时跑道有坡道。
8.3车载数据采集系统设计及实现…………………………………22
第五届飞思卡尔杯智能汽车竞赛决赛广东技术师范学院-飞虎队技术报告
第五届“飞思卡尔”杯全国大学生
智能汽车竞赛
技术报告
学校:广东技术师范学院
队伍名称:飞虎队
参赛队员:黎翔庚陈永基连焕雄
带队教师:杨永李玉忠
关于技术报告和研究论文使用授权的说明
本人完全了解第五届“飞思卡尔”杯全国大学生智能汽车竞赛关于保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日期:
摘要
本文主要介绍了飞虎队队员在准备第五届Freescale智能汽车大赛过程中的工作成果。本智能车系统设计以MC9S12XS128处理器为核心,通过CMOS摄像头采集赛道数据,用以检测智能车的运动位置和运动方向,采用光电编码器检测速度,PID控制算法调节电机的速度和舵机的方向,完成对智能车的基本控制。
智能车系统涉及车模机械结构调整、传感器电路设计及信号处理、控制算法和策略优化等多个方面。在调试软件的辅助下,进行大量的数据采集和实验,最终确定各项控制参数。
关键字:智能车,MC9S12XS128,CMOS摄像头,PID
目录
摘要............................................................................................................................................... I II 第一章引言 (6)
飞思卡尔智能车(摄像头)核心程序
飞思卡尔智能车(摄像头)核心程序
1舵机PD法过弯策略
/***************************舵机PID函数*********************************/
void Angle_PID(int CENTER)
{
//2.8
float angle_kp=7.38,angle_kd=17.2;//系数PD控制
if(lost_time==0 ||left_lost_time==0 ||right_lost_time==0 ) //判断如果黑线都丢失了,则不更新数据
{
angle_error=CENTER-CENTER_INIT;
// if(left_lost_time>20 && right_lost_time==0)
// angle_error=CENTER_INIT-CENTER+abs(angle_error)/8.5;
// else if(left_lost_time==0 && right_lost_time>20)
//angle_error=CENTER_INIT-CENTER-abs(angle_error)/8.5;
angle=(int)(angle_init+angle_kp*angle_error+angle_kd*(angle_error-angle_last _error));
if(angle<=angle_init-250) //防止系数过大导致舵机打死
{
angle=angle_init-250; //6%-9% ,,2000
}
if(angle>=angle_init+250)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "Includes.h"
#define LINEWITH 8 //摄像头垂直照射黑线时,和线宽度,用于判断是交叉线还是终点线
#define MINLINEWITH 4 //处理摄像头的黑线的最小线宽,如果线宽小于这个最小值的话,认为看不见了
#define ALLWHITE 200 //本条线上全白时赋值
#define NOISE 1 //噪点系数,某一个点旁NOISE个点不全与这个点值相同,则认为这个点为噪点
#define BODER 100 //边界,采用两点预判使得边界百分比,如果超过的话按平均值判断
#define UN 24 //判别线宽异常的系数,在判断图片性质使用到,黑点占三倍线宽的百分比
#define FINWITH 9 //终点线白线宽度
#define MINWITH 5 //终点线白线最小宽度
#define SENSE 6 //脚下可判别图片性质区域占整幅图行数的十分之几
#define PREVIEW 15 //以前一帧脚下线做预判时,向左和向右搜索的范围,用来防止丢线
/************************************************************************/
/***********************裁代码时的宏定义*********************************/
/************************************************************************/
#define SNS_R 30 //敏感行计数,代替原来的 ROW_VALUE * SENSE / 10
#define BDR_V 80 //边界值,代替COLUMN_VALUE * BODER / 100
#define UN_V 8 //非正常界限,代替UN * LINEWITH * 4 / 100
#define JLW_V 16 //在判别终点线时线宽值,代替LINEWITH * 4 / 2
#define THRESHOLD 45
#define BLACK 0
#define WHITE 1
unsigned int Line_Center[ROW_VALUE];
unsigned char FinishLine = 0;
unsigned char LastPoint;
unsigned char LossLine = 1;
//------------------------------//
//----------二值化程序----------//
//------------------------------//
void Image_binaryzation(void)
{
unsigned char *p_Image;
unsigned char *q_Image;
q_Image=&uca_Buffer1[0][0];
for(p_Image=&uca_Buffer[0][0];p_Image<=&uca_Buffer[ROW_VALUE-1][COLUMN_VALUE-1];p_Image++)
{if(*p_Image
*(q_Image++)=WHITE;
}
}
//------------------------------//
//----------黑线的提取----------//
//------------------------------//
void black_extract() //黑线提取程序
{
/*********************************************************************************************************************/
//一、变量声明
uchar i = 0; //标记相应处理行,与ROW_VALUE配合使用
uchar j = 0; //标记当前处理的行的相应点,与COLUMN_VALUE配合使用
uchar k = 0;
char xx = 0; //标记j的起始值
char yy = 0; //标记j的结束值
uchar same = 0; //噪声判断的标志,通过&&或者||来确定其值
uint l = 0; //找到黑线的标志位
uchar n1 = 0; //辅助计数
uint Sum = 0; //个黑点下脚标的累加和
uint Sum1 = 0; //辅助求和
uint Sum2 = 0; //
uint Sum3 = 0; //
uchar flag = 0; //重叠标志位
uchar IsFin = 0; //本条线终点线标志位
uchar u =0; //辅助判别图片性质,计数边界
uchar discover = 0; //发现白点标志,在判断终点线时用到
unsigned int temp = 0; //备用,临时存储空间
int temp1 = 0; //备用,临时存储空间
int temp2 = 0;
uint Aver = ALLWHITE; //初始化时,没有对任何信息做计算,认为什么黑色点都没看见
uchar AllwhiteCounter = 0;
FinishLine = 0;
LastPoint = 0; //路的尽头默认为最远处
/********************************************************************************************************************/
//二、处理部分
//先处理从底下数的第一行信息和第二行信息
//这两行的处理至关重要,是剩余行处理的基础
//如果这两行处理不好,其余行的处理计算里那个就会增大,
//而其如果影响了图片最下几行的制的正确性的话,可能会有难以控制的结果
/***************************************************************************************************************/
//二、1.1 第一行处理部分
//在第一行上从左向右判断,找到黑点,第一行不判断图片性质,只判断脚下点位置,其余行作参考建议,如果出错,设计思想中
//会增加其余行计算量,因该不会导致小车转向失灵 ( 待议!!!!!)
/////////////////////////////////////////////////////////////////////////
xx = (int) Line_Center[ROW_VALUE - 1] - PREVIEW ; //设定第一行的搜索范围
if (xx < 0) //在前一帧的第一行的左右PREVIEW
xx = 0; //范围搜索
yy = Line_Center[ROW_VALUE - 1] + PREVIEW; //但不能超过数组的边界
if (yy > COLUMN_VALUE) //
yy = COLUMN_VALUE; //
//////////////////////////////////////////////////////////////////////////
for (j = xx; j < yy; j++)
{
if ((l != 0)&&(uca_Buffer1[ROW_VALUE - 1][j] == 1)) //在黑点区域如果出现白点,判断是否到了边缘
{ //或者这个白点仅仅是个噪声而已,判断其右的点来确定
same = 1; //
same = same && uca_Buffer1[ROW_VALUE - 1][j + 1]; //削减代码后的降噪1处
if (same == 1) //
{ //如果的确到了黑线的边缘,即白线上
Sum = Sum + j - 1; //把上一个不是白点的下脚标加在Sum
break; //上,之后跳出循环,节约资源,也防止
} //将来会误判
} //
/****************************************
*************************/
if ((l != 0)&&(j == (yy - 1))) //这里很关键
Sum = Sum + j; //如果循环检测即将结束还没找到结束点,即将检测的最后一点为结束点
/*****************************************************************/
if ((l == 0)&&(uca_Buffer1[ROW_VALUE - 1][j] == 0)) //
{ //这一块是判断黑点的起始位置的
same = 0; //寻找值为1的点
same = same || uca_Buffer1[ROW_VALUE - 1][j + 1]; //削减代码后的降噪2处
if (same == 0) //
{ //如果是黑线起点
Sum = j; //记下起始位置
l = 1; //L为找到黑线的标志位
} //
}
}
if (l != 0)
Aver = Sum >> 1;
else
{
Aver = ALLWHITE; //补丁,如果全白给Aver赋全白
//如果第一行的值为全白,则不进行Line_Center存储,
LossLine = 1; //将丢线标志位置一,提示控制程序按上一次不丢线
return; //的情况转弯
//直接返回,函数不修改路线值
}
//累加和与计数都清零
Sum = 0; //
l = 0; //
Line_Center[ROW_VALUE - 1] = Aver; //
Aver = ALLWHITE;
//二、1.2 第二行处理部分
//在第二行上从右向左判断,找到黑点,第二行不判断图片性质,只判断脚下点位置,其余行作参考建议,如果出错,设计思想中
//会增加其余行计算量,因该不会导致小车转向失灵 ( 待议!!!!!)
//////////////////////////////////////////////////////////////////////////////////////////////
if (Line_Center[ROW_VALUE - 2] != ALLWHITE) //如果上次倒数第二行不是白的
{ //就按上一帧的倒数第二行判断
xx = COLUMN_VALUE - (int)Line_Center[ROW_VALUE - 2] - PREVIEW;
if (xx < 1)
xx =1;
yy = COLUMN_VALUE - Line_Center[ROW_VALUE - 2] + PREVIEW - 1;
if (yy > COLUMN_VALUE)
yy = COLUMN_VALUE;
}
else //否则按上一帧的最后一行判断
{
xx = COLUMN_VALUE - (int)Line_Center[ROW_VALUE - 1] - PREVIEW;
if (xx < 1)
xx =1;
yy = COLUMN_VALUE - Line_Center[ROW_VALUE - 1] + PREVIEW - 1;
if (yy > COLUMN_VALUE)
yy = COLUMN_VALUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////
for (j = xx; j <= yy; j++)
{
if ((l != 0)&&(uca_Buffer1[ROW_VALUE
- 2][COLUMN_VALUE - j] == 1)) //在黑点区域如果出现白点,判断是否到了边缘
{ //或者这个白点仅仅是个噪声而已,判断其右的点来确定
same = 1; //
same = same && uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j - 1]; //削减代码后的降噪3处
if (same == 1)
{
Sum = Sum + COLUMN_VALUE - j;
break;
}
}
/*************************************************************************/
if((l != 0)&&(j == (yy - 1)))
Sum = Sum + COLUMN_VALUE - j;
/*************************************************************************/
//判断起始点
/***********************************************************************************************************/
if ((l == 0)&&(uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j] == 0)) //j为零时相当于判断了四个点,其他的是判断了三个点
{ //这一块是判断黑点的起始位置的
same = 0; //寻找值为1的点 //
same = same || uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j - 1]; //削减代码后的降噪4
if (same == 0) //
{ //
Sum = COLUMN_VALUE - j; //
l = 1; //
} //
} // //
/*************************************************************************************************************/
}
if(l != 0)
Aver = Sum >> 1;
else Aver = ALLWHITE; //补丁,如果全白给Aver赋全白
//累加和与计数都清零
Sum = 0; //
l = 0; //
Line_Center[ROW_VALUE - 2] = Aver; //
Aver = ALLWHITE; //
/*****************************************************************************************************************/
//二、2 其他行处理部分
//包括预判断,行处理,推按性质处理
for (i = 2; i < ROW_VALUE; i++)
{
/*************************************************************************************************************/
//二、2.1 预判断
if ((Line_Center[ROW_VALUE - i] == ALLWHITE) || (Line_Center[ROW_VALUE - i + 1] == ALLWHITE)) //以前的两行中有全白的
temp = ((Line_Center[ROW_VALUE - i] == ALLWHITE) ? Line_Center[ROW_VALUE - i + 1] : Line_Center[ROW_VALUE - i]);
//区行中不为全白的行最为预判
//这两行不可能同时为全白,否则就
//被视为路的尽头而结束程序,或认为丢线
else
{
temp2 = (int) Line_Center[ROW_VALUE - i] + (int) Line_Center[ROW_VALUE - i] - (int) Line_Center[ROW_VALUE - i + 1];
if ((temp2 >= BDR_V) || (temp2 < (COLUMN_VALUE - BDR_V))) //原值为(COLUMN_VALUE * BODER / 100)
temp = (Line_Center[ROW_VALUE - i] + Line_Center[ROW_VALUE - i + 1]) >> 1; //
else temp = temp2;
}
/**************************************************************************************************************/
//二、2.2.1
//向左寻找
Sum2 = 0;
for (j = 0; j < LINEWITH; j++)
{ //
if ((n1 != 0)&&(uca_Buffer1[ROW_VALUE - i -1][temp - j] == 1)) //
{ //
same = 1;
if ((temp - j - 1) >= 0)
same = same && uca_Buffer1[ROW_VALUE - i -1][temp - j - 1]; //削减代码后的降噪5处
if (same == 1)
{
Sum1 = Sum1 + temp - j + 1;
break;
}
}
/*********************************************************/
if ((n1 != 0)&&(j == (LINEWITH - 1)))
Sum1 = Sum1 + temp - j;
/*********************************************************/
if ((n1 == 0)&&(uca_Buffer1[ROW_VALUE - i -1][temp - j] == 0))
{
same = 0;
same = same || uca_Buffer1[ROW_VALUE - i -1][temp - j - 1];//削减代码后的降噪6处
if (same == 0) //
{ //
Sum1 = temp - j;
Sum2 = Sum1;
if (j == 0)
flag = 1;
n1 = 1;
j = 0; // 如果在左侧找到黑点,就从此向左标定线宽
} //
} //
} //
Sum = Sum1; //
l = n1; //
Sum1 = 0; //
n1 = 0; //
/**************************************************************************************************************/
//二、2.2.2
//向右寻找
Sum3 = 0;
for (j = 0; j < LINEWITH; j++) //
{
if ((n1 != 0)&&(uca_Buffer1[ROW_VALUE - i -1][temp + j] == 1)) //
{ //
same = 1;
if ((temp + j + 1)
if (same == 1)
{
Sum1 = Sum1 + temp + j - 1;
break;
}
}
/*********************************************************/
if ((n1 != 0)&
&(j == (LINEWITH - 1)))
Sum1 = Sum1 + temp + j;
/*********************************************************/ //
if ((n1 == 0)&&(uca_Buffer1[ROW_VALUE - i -1][temp + j] == 0)) //
{ //
same = 0; //
same = same || uca_Buffer1[ROW_VALUE - i -1][temp + j + 1];//削减代码后的降噪8处
if (same == 0) //
{ //
Sum1 = temp + j;
Sum3 = Sum1;
n1 = 1;
if (j != 0) //判断重叠
flag = 0; //
j = 0; // 如果在右侧找到黑点,就从此向右标定线宽
} //
} //
} //
if ((l && n1) == 1)
Sum = Sum + Sum1 - Sum2 - Sum3;
else
Sum = Sum + Sum1;
l = l || n1;
if (l != 0) //
Aver = Sum >> 1;
else
{
Aver = ALLWHITE; //补丁,如果全白给Aver赋全白
AllwhiteCounter++; // 如果出现全白,全白计数相加
if (AllwhiteCounter == 2) //如果出现两行全白则进一步判断
{ // 如果两行全白连续,
if ((Line_Center[ROW_VALUE - i] == ALLWHITE)&&(Line_Center[ROW_VALUE - i + 1] != ALLWHITE))
{ //且这两行的前一行不为白,则认为
LastPoint = ROW_VALUE - i + 1; //路的尽头是但前行的前两行
for ( ; i < ROW_VALUE - 1; i++) //给剩余行赋全白,留下最后一行
{
Line_Center[ROW_VALUE - i - 1] = ALLWHITE;
} //退出for循环时,i为 ROW_VALUE - 1
}
else //如果不满足要求,计数回一个值
AllwhiteCounter = 1;
}
}
Line_Center[ROW_VALUE - i - 1] = Aver;
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
if (i == (ROW_VALUE - 1)) //LastPoint强化程序,防止最后一行白而前一行黑
{ //
if ((LastPoint == 0)&&(Line_Center[0] == ALLWHITE)) //如果所有行的位置都判定完后
for (k = 1; k < ROW_VALUE; k++) //发现Lastpoint仍为零
,检测从上
{ //往下数部位全白的行,把那一行返给LastPoint
if (Line_Center[k] != ALLWHITE) //
LastPoint = k; //
} //
} //
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
Sum = 0;
l = 0;
Sum1 = 0;
n1 = 0;
flag = 0;
/**********************************************************************************************************/
//
//二、3 判断图片性质
if (i < SNS_R) //原来值为(ROW_VALUE * SENSE / 10)
{
temp = Line_Center[ROW_VALUE - i - 1];
u = JLW_V;
for (j = 0; j < u; j++) //向右
{
if (uca_Buffer1[ROW_VALUE - i -1][temp + j] == 0)
n1++;
}
for (j = 1; j < u; j++) //向左
{
if (uca_Buffer1[ROW_VALUE - i -1][temp - j] == 0)
n1++;
}
if (n1 >= UN_V) //如果有异常情况 // 原值为UN * LINEWITH * 4 / 100
{
/*********************************************************************************************************/
//向右找白色间隔,并判断间隔是否合格
n1 = 0;
discover = 0;
for (j = 0; j < FINWITH + 5; j++)
{
if ((discover == 1)&&(uca_Buffer1[ROW_VALUE - i -1][temp1 + j] == 0))
{
same = 0; //
same = same || uca_Buffer1[ROW_VALUE - i -1][temp1 + j + 1];//削减代码后的降噪9处
if (same == 0)
{
n1 = j;
break;
}
}
if ((discover == 1)&&(j == (FINWITH + 4)))
n1 = FINWITH + 5;
if ((discover == 0)&&(uca_Buffer1[ROW_VALUE - i -1][temp + j] == 1))
{
same = 1; //
same = same && uca_Buffer1[ROW_VALUE - i -1][temp + j + 1]; //削减代码后的降噪10处
if (same == 1) //!!!关键!!!
{ //
discover = 1; //
temp1 = temp + j; //
j = 0; //
}
}
}
if ((n1 >= MINWITH)&&(n1 <= FINWITH))
{
k = temp1 + n1 / 2;
if ((uca_Buffer1[ROW_VALUE - i][k] == 1)&&(uca_Buffer1[ROW_VALUE - i - 2][k] == 1))
IsFin = 1; //初步判断是终点线
else
IsFin = 0;
}
k = 0;
/*******************************************************************************************************/
//向左找白色间
隔,并判断间隔是否合格
n1 = 0;
discover = 0;
for (j = 0; j < FINWITH + 5; j++)
{
if ((discover == 1)&&(uca_Buffer1[ROW_VALUE - i -1][temp1 - j] == 0))
{
same = 0; //
same = same || uca_Buffer1[ROW_VALUE- i -1][temp1 - j - 1];//削减代码后的降噪11处
if (same == 0)
{
n1 = j;
break;
}
}
if ((discover == 1)&&(j == (FINWITH + 5)))
n1 = FINWITH + 5;
if ((discover == 0)&&(uca_Buffer1[ROW_VALUE - i -1][temp - j] == 1))
{
same = 1; //
same = same && uca_Buffer1[ROW_VALUE - i -1][temp - j - 1]; //削减代码前的降噪12处
if (same == 1) //
{ //
n1 = temp - j; //
discover = 1; //
temp1 = temp - j; //
j = 0; //
}
}
}
if ((n1 >= MINWITH)&&(n1 <= FINWITH))
{
k = temp1 - n1 / 2;
if ((uca_Buffer1[ROW_VALUE - i][k] == 1)&&(uca_Buffer1[ROW_VALUE - i - 2][k] == 1))
IsFin = IsFin && 1; // 最终判断是否为终点线
else
IsFin = 0;
}
else IsFin = 0;
/**************************************************************************************************/
//图片性质写入
if (uca_Buffer1[ROW_VALUE - i -1][temp] != 1)
FinishLine = FinishLine || IsFin;
IsFin = 0;
}
}
n1 = 0; //n清零
}
//黑线的中值滤波程序!
// if(PT1AD0_PT1AD00 == 1)
// {
// for(i=1;i
// temp=get_mid(Line_Center[i-1],Line_Center[i],Line_Center[i+1]);
// Line_Center[i]=temp;
// }
// }
}
//-----------------------------------------//
//--------脚下两条线初始化程序-------------//
//-----------------------------------------//
void InitFirLine() //小车启动的时,前两行的初始化,用于第一帧的前两行预判断
{
uchar j = 0; //标记当前处理的行的相应点,与COLUMN_VALUE配合使用
uchar k = 0; //标记当前处理的噪点情况,与NOISE配合使用
uchar same = 0; //噪声判断的标志,通过&&或者||来确定其值
uint l = 0; //计数当前找到了多少个有效的黑点
uchar n1 = 0; //辅助计数
uint Sum = 0; //个黑点下脚标的累加和
uint Aver = ALLWHITE; //初始化时,没有对任何信息做计算,认为什么黑色点都没看见
LossLine = 0; //丢线初始化默认为没丢线
//////////从左到右检测第一行
///////////////
for (j = 0; j < COLUMN_VALUE; j++)
{
/**********************
************************************************************************************/
if ((l != 0)&&(uca_Buffer1[ROW_VALUE - 1][j] == 0)) //找到黑点区域后正常对各点的下脚标进行累加并计数
{ //
Sum = Sum + j; //
l++; //
} //
/**********************************************************************************************************/
if ((l != 0)&&(uca_Buffer1[ROW_VALUE - 1][j] == 1)) //在黑点区域如果出现白点,判断是否到了边缘
{ //或者这个白点仅仅是个噪声而已,判断其右的点来确定
same = 1; //
for(k = 0; k < NOISE; k++) //
{ //
same = same && uca_Buffer1[ROW_VALUE - 1][j + k + 1]; //
} //
if (same == 0) //如果是噪声,把它按黑点累加并计数
{ //
Sum = Sum + j; //
l++; //
} //
else //如果不是噪声,的确到了边缘
{ //求出平均下脚标,并把下脚标值赋给处理结果
//
break; //跳出FOR循环,节约资源
} //
}
/***********************************************************************************************************/
if ((l == 0)&&(uca_Buffer1[ROW_VALUE - 1][j] == 0)) //
{ //这一块是判断黑点的起始位置的
same = 0; //寻找值为1的点
for (k = 0; k < NOISE; k++) //
{ //
same = same || uca_Buffer1[ROW_VALUE - 1][j + k + 1]; //
} //
if (same == 0) //
{ //
Sum = Sum + j; //
l++; //
} //
} // //
/*************************************************************************************************************/
}
if (l != 0)
Aver = Sum / l;
else Aver = ALLWHITE; //补丁,如果全白给Aver赋全白
//累加和与计数都清零
Sum = 0; //
l = 0; //
Line_Center[ROW_VALUE - 1] = Aver; //
Aver = ALLWHITE;
//////////从右往左检测第二行
///////////////
for (j = 1; j <
= COLUMN_VALUE; j++)
{
/**********************************************************************************************************/
if ((l != 0)&&(uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j] == 0)) //找到黑点区域后正常对各点的下脚标进行累加并计数
{ //
Sum = Sum + COLUMN_VALUE - j; //
l++; //
} //
/**********************************************************************************************************/
if ((l != 0)&&(uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j] == 1)) //在黑点区域如果出现白点,判断是否到了边缘
{ //或者这个白点仅仅是个噪声而已,判断其右的点来确定
same = 1; //
for(k = 0; k < NOISE; k++) //
{ //
same = same && uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j - k - 1]; //
} //
if (same == 0) //如果是噪声,把它按黑点累加并计数
{ //
Sum = Sum + COLUMN_VALUE - j; //
l++; //
} //
else //如果不是噪声,的确到了边缘
{ //求出平均下脚标,并把下脚标值赋给处理结果
break; //跳出FOR循环,节约资源
} //
}
//
//判断起始点
/***********************************************************************************************************/
if ((l == 0)&&(uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j] == 0)) //j为零时相当于判断了四个点,其他的是判断了三个点
{ //这一块是判断黑点的起始位置的
same = 0; //寻找值为1的点
for (k = 0; k < NOISE; k++) //
{ //
same = same || uca_Buffer1[ROW_VALUE - 2][COLUMN_VALUE - j - k - 1]; //
} //
if (same == 0) //
{ //
Sum = Sum + COLUMN_VALUE - j; //
l++; //
} //
} // //
/*************************************************************************************************************/
}
if(l != 0)
Aver = Sum / l;
else Aver = ALLWHITE; //补丁,如果全白给Aver赋全白
//累加
和与计数都清零
Sum = 0; //
l = 0; //
Line_Center[ROW_VALUE - 2] = Aver; //
Aver = ALLWHITE; //
/****************************************************************************************************************/
if ((Line_Center[ROW_VALUE - 1] != ALLWHITE)&&(Line_Center[ROW_VALUE - 2] != ALLWHITE))
LossLine = 0; //如果脚下两条线均部位全白则找到线,即没有丢失线
else LossLine = 1; //否则认为丢失,控制程序在车启动时可以循环使用此程序,
//即等待LossLine得知变为0时再启动。
}