智能汽车竞赛
技 术 报 告
学 校:哈尔滨工业大学 队伍名称:紫丁香一队 参赛队员:吴臣桓 李方 朱自发
带队教师:李岩松
王雷
I
第一章 引言
II
摘 要
本文详细介绍了哈工大智能车队光电组为第十一届全国智能车大赛而准备的智能车系统方案。本文介绍的是基于恩智浦单片机芯片的智能循迹小车,采用恩智浦公司的MK60DN512ZVLL10芯片作为控制器,用来处理传感器的数据以及对整个循迹过程的进行控制,以线性CCD作为循迹的传感器,对线性CCD采集到的赛道的高低电平来识别赛道已达到循迹的目的,并且利用了红外对管来识别停车线;为了能够使小车以设定速度行驶,我们使用编码器来测量小车速度进行速度闭环;对方向的控制是通过给舵机输入PWM波来实现的。所以整个控制分为速度控制以及方向控制。我们实现了小车的循迹、自动避障碍、自动停车等功能。
关键词:恩智浦 智能车 线性CCD K60单片机
III
第一章 引言
目录
摘 要 ................................................................................................................................................... III 第一章 引 言 .......................................................................................................................................... 1 1.1 智能车研究背景简介 ................................................................................................................... 1 1.2“恩智浦”杯智能车竞赛介绍 ..................................................................................................... 1 1.3总述 ............................................................................................................................................... 2 第二章 系统设计总方案 ..................................................................................................................... 3 2.1 系统概述 ....................................................................................................................................... 3 2.2 车模整体布局 ............................................................................................................................... 4 2.3车模机械结构设计方案 ................................................................................................................ 5 2.3.1前轮定位的调整 .................................................................................................................... 5 2.3.2 舵机安装 ............................................................................................................................... 7 2.3.3 左右不对称问题的发现与解决 ............................................................................................ 8 2.3.4 编码器的安装 ....................................................................................................................... 9 2.3.5 CCD的安装 ........................................................................................................................... 9 2.2.6 偏振镜的使用 ..................................................................................................................... 10 2.2.7 车身重心调整 ..................................................................................................................... 10 2.4 本章小结 ..................................................................................................................................... 10 第三章 系统硬件设计及实现 .............................................................................................................. 11 3.1最小系统板.................................................................................................................................. 11 3.2主控板 ......................................................................................................................................... 12 3.3电机驱动模块设计 ...................................................................................................................... 14 3.4本章小结...................................................................................................................................... 15 第四章 系统软件设计及实现 .............................................................................................................. 16 4.1 赛道信息处理与方向控制 ......................................................................................................... 17 4.1.1 CCD图像采集 ..................................................................................................................... 17 4.1.2 基本寻线处理 ..................................................................................................................... 18 4.1.3 特殊元素处理 ..................................................................................................................... 19 4.1.4 方向控制 ............................................................................................................................. 19 4.2 速度控制 ..................................................................................................................................... 20 4.3总结 ............................................................................................................................................. 21 第五章 系统开发及调试工具 .............................................................................................................. 21 5.1开发工具...................................................................................................................................... 21 5.2上位机调试.................................................................................................................................. 22 5.2.1上位机参数调节及速度提取 ............................................................................................... 23
IV
5.2.2串口助手 .............................................................................................................................. 25 5.2.3阈值标定 .............................................................................................................................. 25 5.3 无线调试蓝牙模块 ..................................................................................................................... 26 5.4 电源充放电模块 ......................................................................................................................... 28 5.4.1记忆效应 .............................................................................................................................. 28 5.4.2电池充放电设备 .................................................................................................................. 28 5.5本章小结...................................................................................................................................... 29 第六章 模型车的主要技术参数 .......................................................................................................... 30 第七章 结 论 ........................................................................................................................................ 31 7.1 参赛心得 ..................................................................................................................................... 31 7.2经验总结...................................................................................................................................... 31 参考文献 ................................................................................................................................................ 32 附录:程序源代码 ................................................................................................................................ 33
V
第一章 引 言
1.1 智能车研究背景简介
智能车是以汽车电子为背景,涵盖控制、模式识别、传感技术、电子、电气、计算机、机械等多科学的科技创意性设计,一般主要路径识别、速度采集、角度控制及车速控制等模块组成。其设计与开发涉及控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,可以分为三大部分:传感器检测部分,执行部分,CPU。本章节详细阐述了智能车的研究背景和对智能车的总体概况。
1.2“恩智浦”杯智能车竞赛介绍
全国大学生“恩智浦”杯全国大学生智能汽车竞赛竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件,鼓励创新的一项科技竞赛活动。竞赛要求在规定的汽车模型平台上,使用恩智浦半导体公司的微控制器作为核心控制模块,通过增加道路传感器、电机驱动模块以及编写相应控制程序,制作完成一个能够自主识别道路的模型汽车。智能汽车竞赛的赛道路面为45cm的白色PVC 耐磨塑胶地板,赛道两侧边沿有宽为25mm的连续黑线作为引导线边界线。参赛队伍的目标是模型汽车需要按照规则以最短时间跑完单圈赛道。
参赛选手须使用竞赛秘书处统一指定的竞赛车模套件,采用恩智浦半导体公司的8 位、16 位、32 位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算
1
第一章 引言
法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分(省)赛区的场地比赛,在获得决赛资格后,参加全国总决赛区的场地比赛。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间来决定,参加全国总决赛的队伍同时必须提交车模技术报告。
1.3总述
本文主要从机械系统、硬件系统、软件系统、调试开发系统等方面,详尽地阐述了来自哈尔滨工业大学的“紫丁香一队”的光电小车的设计方案,具体包括小车的结构设计,硬件电路的设计及控制算法的独特思路。从关注智能车俱乐部到加入其中,参加比赛,这其中包括了我们的辛勤付出,这份报告凝聚了我们智慧,是我们团队共同努力的成果。
2
第二章 系统设计总方案
本章主要介绍智能汽车系统总体方案的选定和总体设计思路。在后面的章节中将整个系统分为机械结构设计、硬件系统实现、软件系统调试及系统开发及调试工具四部分对智能汽车控制系统进行深入的介绍和分析。
2.1 系统概述
该系统以K60单片机作为系统控制处理器, 采用基于的线性CCD的图像采样模块获取赛道图像信息,以模糊PD方式对舵机转向进行反馈控制,电机转速控制采用分段模糊PID控制,通过 PWM 控制驱动电路调整电机的功率,通过相关算法分析出前方的路况,并根据路况的不同为小车选取最优路径在最短的时间内到达终点。
智能车系统主要包括以下模块:K60最小系统、转向舵机模块、电机驱动模块、编码器、图像信号处理模块、电源管理模块、上位机模块。芯片选择方面,选用了速度较快且功能强大的32位 Kinetis 60作为核心控制单元。
线性CCD
电源 管理 仿真调试 舵机 控制 K60最小系统 电机 驱动 编码器 图2.1 整体结构框图
3
第二章 系统设计总方案
因为本届智能汽车大赛光电组比赛同往年类似,采用线性CCD作为循迹传感器,CCD与传统的光电传感器相比有着信息量大,质量轻,电路简单的特点,但是由于需要镜头成像,所以会带来成像失真,静电干扰严重等问题。我们选择了性能更稳定,图像更清晰的TSL1401,一款由蓝宙生产的新型CCD。
2.2 车模整体布局
(1)为保证整车质量尽量小,整车配件都用最小、最轻的; (2)舵机直立安装,以提高舵机响应速度; (3)为降低赛车重心,主板电池低位放置; (4)采用高强度轻质量的碳素杆做摄像头支架;
(5)摄像头架在电机前方,减少赛车前方盲区,同时保证重心稍微离中心靠后位置。
制作完成后小车整体布局:
图2.2 小车整体布局
4
第十一届全国大学生邀请赛技术报告
2.3车模机械结构设计方案
在整个调试过程中我们发现,车辆在高速情况对整车机械性能要求很高,为了能够使车在高速情况下更稳定流畅地运行,我们在前期装配时,对整车进行了系统的分析和严密的调教。我们尽量在规则允许的范围内改造车模,提高车模整体精度,使整车及机械性能进一步提升。而前轮的束角和主销倾角对车的高速运行下的稳定性影响是最大的。舵机的灵敏程度同样对高速运行的车辆起着至关重要的作用。因此,在整车的机械结构我们进行了多方面的改进。 2.3.1前轮定位的调整
车辆在高速过弯时,转向舵机的负载会因为车轮转向角度增大而增大。为了尽可能降低转向舵机负载对前轮的安装角度;对前轮定位进行了调整,使车辆直线行驶更稳定,转向更轻便,转向后能自动回正,减少轮胎和转向系零件的磨损。前轮是转向轮,它的安装位置由主销内倾、主销后倾、前轮外倾和前轮前束等 4个参数决定,反映了转向轮、主销和前轴等三者在车架上的位置关系。
在调车调到一段时间后,我们发现车子由于机械损耗会出现转向沉重、发抖、跑偏、不正、难归位或者轮胎单边磨损、偏磨等不正常磨损现象;这时,就需要对前轮进行重新定位。前轮定位的做的好才能保障汽车直线行驶的稳定性,转向轻便和减少轮胎的磨损。对赛车的前轮转向模块进行测试实验,联合转向舵机的获取标定数据,并结合相应的转向理论进行调整。
在实际调试中,我们发现适当增大内倾角的确可以增大转弯时车轮和地面的接触面积,从而增大车了地面的摩擦程度,使车转向更灵活,减小因摩擦不够而引起的转向不足的情况。由此可见,对前轮定位是必要的。
⑴Toe In(主销内倾)
主销内倾是指主销装在前轴略向内倾斜的角度,它的作用是使前轮自动回正。角度越大前轮的自动回正作用就越强烈,但转向时也越费力,轮胎磨损增
5
第二章 系统设计总方案
大;反之,角度越小前轮自动回正的作用就越弱。
图2.3.1 主销内倾示意图
⑵Caster(后倾角)
Caster(后倾角)是指转向杯的旋转轴向车子后方倾斜的角度。正值的Caster旋转轴顶部倾向后方。它使车辆转弯时产生的离心力所形成的力矩方向与车轮偏转方向相反,迫使车轮偏转后自动恢复到原来的中间位置上。由此,主销后倾角越大,车速越高,前轮稳定性也愈好。可以通过改变悬挂上前后黄色小垫片的数量(原车前后各有两个黄色小垫片,主销处于垂直状态),当模型车需过坡道,或在比较颠簸的路面行驶时,主销宜有一定后倾角,但后倾角不能过大,否则会产生过大的回正力矩,导致模型车在出弯进入直道时发生左右摆动。
图2.3.2 主销后倾示意图
⑶ Camber(内倾角)
Camber(内倾角)就是轮子的上端倾向或者倾离车身的角度。负值的Camber
6
第十一届全国大学生邀请赛技术报告
角度指车轮上端向内倾,正值的Camber指车轮上端向外倾。Camber的主要作用是控制轮胎在直路和弯路的接触地面的面积。前轮前束的作用是保证汽车的行驶性能,减少轮胎的磨损。前轮在滚动时,其惯性力会自然将轮胎向内偏斜,如果前束适当,轮胎滚动时的偏斜方向就会抵消,轮胎内外侧磨损的现象会减少。
图2.3.3 前束示意图
经过我们反复的调整和尝试,我们发现适度的主销内倾再加上适度负值的Camber角度效果是最好的,小车转弯灵活性是最好的,但是内倾角度不宜太大,内倾角度过大会使得小车过弯时受到的摩擦力过大,灵活性降低。 2.3.2 舵机安装
舵机摆杆是将舵机的旋转运动转换成横摆运动的一种机构。在智能车比赛里,通过它将舵机转矩传递到连接轮子上面的横拉杆,实现轮子的左右转动,从而实现转向。转向在智能车比赛中是至关重要,而摆杆的设计直接关系到智能车转向灵敏度。
舵机转矩=舵机摆杆作用力*摆杆长度
通过公式可以得出:拉杆作用力越大,反应越灵敏,转向速度越快!转矩一定时,摆杆越长,作用力就越小,所以摆杆又不能太长。经过实验,我们选择舵机摆杆的长度在30mm比较合适。同时最终的转向机构还应该尽量满足符合
7
第二章 系统设计总方案
阿克曼转向理论,依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大大约2~4度,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,这样可以使车辆在过弯时转向轮处于纯滚动状态,减少过弯时的阻力,减小轮胎的磨损。
理想效果如图:
图2.3.4(1)阿克曼转向原理示意图 2.3.4(2) 舵机安装最终效果图 2.3.3 左右不对称问题的发现与解决
在调试的过程中,我们的小车遇到了一个比较严重的问题,就是在很长一段时间内,我们的车处于左右不对称的情况。也就是说,在左转弯,右转弯的时候,总是一个切弯,一个不切弯,这个问题困扰了我们相当长的时间。后来我们搭建了直径一米二的圆环赛道,通过它来调节对称性。在精确的调节舵机连杆的距离、左右轮胎等机械方面的影响因素后,再通过软件来弥补,最后很好的解决了这个问题。
8
第十一届全国大学生邀请赛技术报告
2.3.4 编码器的安装
编码器是智能小车速度反馈元件,其安装位置应该充分考虑测速的准确性和稳定性,因此我们使用的是龙邱迷你编码器,512线的。这款编码器体积小,质量小,稳定性高,很适合作为今年C车模的测速工具。而且传动齿轮相比与其他编码器而言,更加流畅,耐磨。在我们实验多次之后,发现此款编码器乃最佳选择。
图2.3.5 编码器安装最终效果图
2.3.5 CCD的安装
为了确保CCD能稳定循迹而不晃动,摄像头底座的牢固性是关键。我们的方案是通过机械加工铝棒做摄像头支架的底座,然后将铝制的底座底部打三个孔,用螺丝固定在车模底板中心位置(如图2.3.7)。CCD安装的位置与车模的前瞻量以及视野宽度也有直接关系,CCD的安装位置低了,反光影响严重,抖动影响严重;安装的高了,整车系统会因重心抬高而易翻车。所以CCD安装的位置应同时考虑到机械性能的需要和图像的要求。三个CCD传感器重量相对车架来说具有不可忽略的影响,从车模的性能上考虑,车模的重心越低越好。
9
第二章 系统设计总方案
图2.3.6(1)CCD底座 图2.2.6(2)CCD安装 2.2.6 偏振镜的使用
赛道的反光会引起许多不利变化,如起跑线的误识别,赛道丢失。根据反射光均为偏振光的原理,为减少赛道反光对赛道信息的判断,我们使用了偏振镜,偏振镜可以滤掉大部分反射光,使赛道信息提取更加准确。虽然使用偏振镜会使摄像头接收到光强度会减少一半。 2.2.7 车身重心调整
重心的高低是影响智能车性能的重要因素之一,较低的重心能够极大地提升整车的稳定性,同时较低的重心也是提升车模速度关键。我们在降低车模底盘的同时也尽量将CCD、主控电路板、电池以及电机驱动的时候尽可能的低。
2.4 本章小结
本章主要介绍了整车结构和车模的几个重要架构,包括后轮,舵机,避震,CCD和编码器的安装。详细的介绍了我们在做小车机械部分的一些经验和想法。但还是有很多需要注意的细节和相应的改进。同时要综合考虑到车模的整个布局和重心等的调节。机械安装是个需要通盘考虑的问题,机械安装的布局、质量将影响到道路信息的探测效果以及车子的行驶路径。安装时需考虑安装的可靠性、轻便性、各部分配重等问题。
10
第三章 系统硬件设计及实现
3.1最小系统板
Kinetis 60是Kinetis (ARM ARM@ Cortex TM -M4 )系列单片机 )系列单片机,简称 K系列。Kinetis 系列是基于 ARM @ Cortex TM -M4 具有超强可拓展性的低功耗、混合信号微控制器 ,每个系列提供了不同的性能、存储器和外设特性。Kinetis 微控制器系列融合了最新的低功耗革技术。具有高性能、精度的混合信号力,宽广互连性,人机接口和安全外设,是做控制用的微处理器的绝佳选择。
图3.1 K60原理图
11
第五章 系统开发及调试工具
实物图如图3.2 K60所示。
图3.2 K60实物图
3.2主控板
主控板主要由5V电源模块、3.3V电源模块、蜂鸣器模块及各个传感器插孔构成,我们利用MP2359将电压又7.2V转换成5V,主要为编码器、CCD、蜂鸣器及灯塔模块供电;再利用TPS73633将电压又5V转换成3.3V,为陀螺仪与加速度计模块、OLED、蓝牙、光电管、按键及拨码开关供电。其压降原理图分别如下图3.3、3.4所示:。
12
第十一届全国大学生邀请赛技术报告
图3.3 5伏压降电路图
图3.4 3.3伏压降电路图
蜂鸣器原理图3.5所示。
13
第五章 系统开发及调试工具
图3.5 蜂鸣器电路图
主控板实物图3.6所示。
图3.6 主控板
3.3电机驱动模块设计
我们经常规定的独立的两块电机驱动结合到了一起,这样有效的节约了空
间,保证了车体结构的集中性,电路图如图3.7所示。
14
第十一届全国大学生邀请赛技术报告
图3.7 电机驱动原理图
并且利用了34063芯片来获得12V电压,为MOS管的稳定饱和提供高压。此电机驱动是同类电机驱动中性能最优异的电路,器件选择冗余量大,应付这个堵转电流3A的小电机,绰绰有余。 下图是电机驱动的实物图:
图3.8 电机驱动实物
3.4本章小结
小车上的每一部分都是我们精心设计选择的,每一部分都是经过多次性能比较,最终确定下来的,这一步步走来,小车从最初的简陋,到如今的结构紧凑,重心低,速度较快,我们每个人都投入了很多的精力,力求精益求精。看到如今的车,真心感觉当初的每一份付出都是值得。
15
第四章 系统软件设计及实现
软件主程序流程图:
启动 系统初始化 采集 CCD图像 否 下一个场信号 否 是图像处理 舵机控制 PID速度 调节 对管判断 是 停车 结束 16
第十一届全国大学生邀请赛技术报告
本系统以Kinetis 60微控制器为核心控制单元,通过线性CCD检测赛道信息,可以直接输出数字信号,提取灰度图像后对其进行软件二值化,提取黑色引导线,用于赛道识别。并根据不同的赛道类型结合四轮车的控制特点使用模糊PID控制算法控制舵机打角;通过光电编码器检测模型车的实时速度,使用模糊PID控制算法获得电机理想速度,并利用PID控制算法调节驱动电机的转速,实现了对模型车运动速度和运动方向的闭环控制。
而在调试过程中,使用LabVIEW仿真平台、无线模块、SD卡模块、串口等调试工具,进行了大量硬件与软件测试。实验结果表明,该系统设计方案确实可行。
4.1 赛道信息处理与方向控制
4.1.1 CCD图像采集
TSL1401线性CCD传感器包含128个线性排列的光电二极管。每个光电二极管都有各自的积分电路,以下我们将此电路统称为像素。每个像素所采集的图像灰度值与它所感知的光强和积分时间成正比。
如图4.1所示。使用者需要在SI持续高电平20ns后产生第1个CLK信号,并在每个CLK信号的下降沿时采集AO引脚的输出的电压值。在采集了128个像素后,还必须生成第129个CLK以结束本次采集。在第129个CLK之后到下一个SI信号之间的时间就是下次采集的曝光时间(这里说的曝光时间是忽略了第19到129个CLK之间的时间)
图4.1 CCD采集
首先定下控制周期得到固定的曝光时间,同时将曝光时间限制在一个合理
17
第五章 系统开发及调试工具
的范围内以使采集的灰度值更加合理且黑白分明。利用单片机的周期定时器来控制SI信号的间隔,即曝光时间,并在中断函数内进行AO的数据采集。 4.1.2 基本寻线处理
在研究CCD采集回来的图像发现图像有明显跳变部分,所以基本寻线处理便是找图像的跳变沿。在找到赛道两边跳变沿时,赛道中心为两跳变沿的均值,此时并计算赛道宽度,为右跳变沿与左跳变沿的差值;若只找到左跳变沿,
此时赛道中心为左跳变沿加赛道宽度的一半;若只找到右跳变沿,此时赛道中心为右跳变沿减去赛道宽度的一半;若没找到跳变沿,赛道中心沿用上一场中心。 代码如下:
for(i=R_Start;i>=10;i--)
{
if((Pixel[i]-Pixel[i-5]>Jumping_Delta)&&
(ab(Pixel[i]-Pixel[i+1])<40)&&(ab(Pixel[i]-Pixel[i+2])<40)&&(ab(Pixel[i]-Pixel[i+3])<40)&&(ab(Pixel[i]-Pixel[i+4])<40)&&
(ab(Pixel[i]-Pixel[i+5])<40))
{ L_Pos[0] = i;
Find_L[0] = 1;//该数组中的元素置1表示找到了边线 break; } else {
Find_L[0] = 0; } }
18
第十一届全国大学生邀请赛技术报告
for(i=L_Start;i<=117;i++) {
if((Pixel[i]-Pixel[i+5]>Jumping_Delta)&& (ab(Pixel[i]-Pixel[i-1])<40)&&(ab(Pixel[i]-Pixel[i-2])<40)&&(ab(Pixel[i]-Pixel[i-3])<40)&&(ab(Pixel[i]-Pixel[i-4])<40)&&
(ab(Pixel[i]-Pixel[i-5])<40)) {
R_Pos[0] = i; Find_R[0] = 1; break; } else {
Find_R[0] = 0; } } 4.1.3 特殊元素处理
障碍处理:障碍是一片黑色区域,在图像中显示为有一赛道边线突然跳到中间位置,但比上一场中线小或大;若检测到此标志便确定为障碍,通过编码器计数,使车在一定距离内绕过障碍障碍。之后回归正常行驶位置。
坡道处理:我们通过红外测距仪来检测坡道,检测到坡道后利用前瞻最近的CCD所采集的图像信息来控制舵机打角。 4.1.4 方向控制
方向控制采用控制原理中的模糊PD控制:方向控制输出为方向控制的P乘
19
第五章 系统开发及调试工具
以赛道中心与64的差值加方向控制的D乘以车的转向角速度。
4.2 速度控制
图4.2
PID控制策略其结构简单,稳定性好,可靠性高,并且易于实现。其缺点在于控制器的参数整定相当繁琐,需要很强的工程经验。相对于其他的控制方式,在成熟性和可操作性上都有着很大的优势。所以最后我们选择了PID的控制方式。
在小车跑动中,因为不需要考虑小车之前走过的路线,所以,我们舍弃了I控制,将小车舵机的PID控制简化成PD控制。本方案中通过双电机的差速控制采用位置式的PD控制,速度闭环控制采用了增量式PID控制。在本方案中,使用试凑法来确定控制器的比例、积分和微分参数。
试凑法是通过闭环试验,观察系统响应曲线,根据各控制参数对系统响应的大致影响,反复试凑参数,以达到满意的响应,最后确定PID控制参数。试凑不是盲目的,而是在控制理论指导下进行的。在控制理论中已获得如下定性知识:
比例调节(P)作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。
积分调节(I)作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用
20
第十一届全国大学生邀请赛技术报告
的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。
微分调节(D)作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。
4.3总结
本章详细介绍了智能汽车的控制软件的设计和思路。平衡控制部分主要介绍了平衡的原理和方法。赛道信息处理部分重点介绍了CCD传感器的原理,寻线原理,特殊元素的处理和方向控制原理。速度控制部分主要介绍了PID控制理论及其在速度闭环控制的应用。
第五章 系统开发及调试工具
5.1开发工具
LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。
LabVIEW由于具有可视化非常好G语言,这样为我们在处理图形用户界面上带来了很大便利,对于不熟悉WindowsAPI,又具有简单的C语言知识的人来说,
21
第五章 系统开发及调试工具
LabVIEW是个很好的开发工具。并且随着LabVIEW的不断改进,程序执行效率得到很大提高。与通用C以及Matlab的接口使得LabVIEW更具生命力。更重要的是,LabVIEW在数据采集以及仪器控制方面,提供了大量的接口,使得用LabVIEW编写数据采集程序极其简单,高效。
5.2上位机调试
为了便于程序参数调节,减少下载次数。并且利用上位机观察赛道的灰度以及车辆的速度等状态值,利用LabVIEW作为上位机开发平台,并通过串口配合蓝牙的通信,实现上位机对下位机的控制调试。
我们根据光电组组的特性,将几个常用功能编写入一个上位机里,实现车辆控制,车辆的速度提取,常用串口功能,以及灰度检测标定,赛道边缘中线的显示等功能。主界面如下:
图5.1 主界面
界面整洁简单,并且利用LabView的SubPanel技术,可以将采集子程序放入到单独的子文件中,并在使用的时候插入到前面板的SubPanel中,很大程度上,怎加了程序的可重用性和可扩展性。程序为了尽可能的节省空间,在右边以及
22
第十一届全国大学生邀请赛技术报告
上端实现了隐藏面板:
图5.2 隐藏面板显示
5.2.1上位机参数调节及速度提取
为了保护单片机,以及节省向单片机下入程序的时间,提高调试的快捷高效性,利用上位机动态调节下位机的参数,即在下位机初始化时,将参数发送给下位机,在下位机运行时,动态采集车辆的速度以及偏差值:
23
第五章 系统开发及调试工具
图5.3 参数调整初始化
上位机向下位机发送32个数据,包括速度动态PID值。这大大方便了调试车辆过程中的数据修改。并且由于程序采用大量图形图表,使得调试过程增加了许多的直观性。下图为某参数下的实验值:
图5.4 上位机实际运行效果
24
第十一届全国大学生邀请赛技术报告
5.2.2串口助手
程序考虑到调试的时候,可能很频繁的切换的其他的串口助手中,但是由于LabVIEW有时会独占串口,需要关闭LabVIEW才能切换的串口并正常工作。这就为调试带来了不便。所以,上位机集成了串口调试模块,实现了在不关闭前面板的前提下,仍能利用串口助手调试车辆:
图5.5 串口调试
5.2.3阈值标定
由于光电组组经常要改变阈值来实现对不同光线的适应能力,所以上位机中加入了提取下位机采集的灰度值,并将这个灰度值以固定的阈值二值化,直观地显示赛道的灰度分布,二值化好坏情况:
25
第五章 系统开发及调试工具
图5.6 阈值标定初始化
利用该功能可以实现采集赛道的灰度值,并导出到Excel,并且利用阈值测试功能可以实现阈值的标定。
5.3 无线调试蓝牙模块
为了方便调试,小车在赛道上运行时的各个数据都需要在电脑上显示和保存。为实现这一目的,我们充分利用K60单片机上的资源,利用外接蓝牙,使MCU与PC之间保持信息通信;并利用电脑上的存储空间较大的特点。在电脑上将记录小车运行时的各个参数。
MCU编程时,在程序中设立节点,在节点处设立发送函数,将小车运行的各个参数传输到蓝牙模块,实现下位机功能。蓝牙模块将收到的数字信息,以无线电波方式,传输给电脑蓝牙适配器,蓝牙适配器将无线信号转换成数字信号,传给电脑LabVIEW VISA模块。
我们小组利用了NI(国家仪器公司)的LabVIEW虚拟仪表编写了上位机,通过LabVIEW自带的VISA模块在电脑上与蓝牙模块进行信息通信,并利用LabVIEW
26
第十一届全国大学生邀请赛技术报告
强度图将CCD采集的数据在电脑上实时显示,将小车其他参数通过曲线、指示灯的方式同样直观的显示在电脑上。我们通过LabVIEW自带文件保存功能将蓝牙通信传输的信息直接保存在电脑上,实现在MCU脱机以后,小车所运行信息参数的回放。
图5.7 无线蓝牙模块原理图
图5.8 无线蓝牙实物图
27
第五章 系统开发及调试工具
5.4 电源充放电模块
我们使用的电源是官方提供的镍镉电池,经过多次使用后,我们发现电池电压下降到7.4V左右我们的小车就不能正常工作了。且随着使用次数的增多,电池的性能越来越差,最后经过分析发现,由于每次电池使用完后,不经放电就直接进行充电,这使得电池存储容量变小,性能变差,对电池伤害特别大。
经过我们查阅相关资料,知道原来镍镉电池是有记忆效应的,这样一来在我们对小车进行调试时,往往会因为电池性能差异,而影响我们参数的确定。因此,很有必要对电池进行规范合理的充放电,以提高系统的稳定性。为此我们专门制作了一个充放电模块 5.4.1记忆效应
记忆效应是电池因为使用而使电池内容物产生结晶的一种效应。一般只会发生在镍镉电池,镍氢电池较少,锂电池则无此现象。发生的原因是由于电池重复的部分充电与放电不完全所致。会使电池暂时性的容量减小,导致使用时间缩短。
镍镉电池使用过程中,如果电量没有全部放完就开始充电,下次再放电时,就不能放出全部电量。比如,镍镉电池只放出80%的电量后就开始充电,充足电后,该电池也只能放出80%的电量。电池好像记忆了用户日常的充、放电幅度和模式,日久就很难改变这种模式,不能再做大幅度充电或放电。 5.4.2电池充放电设备
电池充放电模块可以将电量较低但未达到充电要求的电池进行放电。放电时,相应的“DIS”指示灯点亮并闪烁;当电压下降到6V时就停止放电,并用单片机控制进行充电。充电时,指示灯“CHR”点亮并闪烁;若出现非法操作,如只插入了电池放电,而没有插入充电器,则指示灯“ERR”会闪烁报错。
28
第十一届全国大学生邀请赛技术报告
电池充放电设备实物图如下所示:
图5.10 电池充放电设备主视图
图5.11 电池充放电设备俯视图 图5.12 电池充放电设备展开图
图5.13 电池放电状态 图5.14 电池充电状态
5.5本章小结
本章我们主要对我们的调试工具以及辅助设备进行了详细的阐述,这些工具与设备,如催化剂一样帮助我们不断的前行,使得我们又一个很好的调试环境。在它们的帮助下,我们得以顺利的进行下去。这其中,不仅包含了我们的努力,更是我们汗水与智慧的结晶。
29
第六章 模型车的主要技术参数
赛车基本参数 长 宽 高 车重 功耗 1880g 空载 带载 电容总容量 传感器 721uF 编码器 线性CCD 光电管 红外测 距模块 除了车模原有的驱动电机、舵机之外伺服电机个数 赛道信息监测 视野范围 精度 频率 50-120mm 5mm 200Hz 0个 2个 3个 2个 1个 8w >10w 300mm 200mm 300mm 30
第七章 结 论
7.1 参赛心得
起初报名参加 “恩智浦”杯全国大学生智能汽车竞赛只是因为好奇,而在这将近一年的过程中,我们每一个人都从最初的盲目参与,渐渐演变成了如今真正的兴趣与热爱。这一过程是我们正是学习成长的过程,我们在学长学姐的指导下,自己学着画电路图、搭车、调试程序,从硬件到软件,从校内赛到全国赛。虽然曾多次遇到困难,但在团队力量的支撑下我们从未想过放弃,一直坚持了今天,我们在这一点一滴中逐渐走向成熟,收获了宝贵的财富。
在我们实验室——305,我们度过了无数个通宵,我们将所有的汗水和瞌睡都凝聚于小车之中,它见证了我们努力、我们的成长、我们的友情,给与了我们许多美好的回忆,值得我们真心的呵护。这一路走来虽然辛苦,但这些磨练却令我们的大学生活变得更加充实,让我们的意志更加坚定,我想305将会是我们每个人一生都难以忘怀的地方。
7.2经验总结
在细节上应投入足够的精力。在硬件方面,由于我们在投板前检查的不够仔细,导致板子多次都存在或大或小、或多多少的问题,虽然说并未最后影响使用,但在焊接时会浪费很多时间,也会在使用过程中存在隐患;而在软件方面一样如此,可能只因为一个括号的漏失就会导致调试过程频频受阻。所以,在做每一件事情上,我们都应该做到精益求精。
最后也是最重要的一点便是坚持。在整个过程中,这一点是十分重要的,从一开始报名的一百多人,到如今的十几人,虽然有一些是被迫退出,但好多人都是自己选择的放弃,特别是有些实力很强的队伍,真心为他们的推出感到惋惜。正如那句话所说“梅花香自苦寒来”嘛,所以坚持才会胜利。
31
参考文献
[1] 卓晴,黄开胜,邵贝贝.学做智能车.北京:北京航空航天大学出版社.2007. [2] 蔡述庭.“飞思卡尔”杯智能汽车竞赛设计与实践.北京:北京航空航天大学出版社. 2012.
[3] 王淑娟,蔡惟铮,齐明.模拟电子技术基础.北京:高等教育出版社.2009. [4] 席爱民.模糊控制技术.西安电子科技大学出版社.2008. [5] 诸静.模糊控制原理与应用.北京:机械工业出版社.2001. [6] 谭浩强著.C程序设计.北京:清华大学出版社,2003.
[7] 杨春玲,王淑娟.数字电子技术基础.北京:高等教育出版社,2000.
[8] 徐向民.Altium Designer快速入门(第2版).北京:北京航空航天大学出版社,2011. [9] 江思敏,胡烨.Altium Designer原理图与PCB设计教程.机械工业出版社,2009. [10] 田玉平.自动控制原理.科学出版社,2013.
[11] 白志刚.自动调节系统解析与PID整定.化学工业出版社,2012.
[12] 张阳,吴晔,滕勤.MC9S12XS单片机原理及嵌入式系统开发.电子工业出版社,2011. [13] 刘珂屹,舒伯特,徐国强.北京科技大学摄像头一队技术报告.2012. [14] 李栋,金福彪,蒋亚楠.常熟理工学院“闪电六队”技术报告.2012.
[15] 肖乃瑶,沈骏,张学涌.杭电摄像头一队技术报告.2012.
[16] 朱政合.飞思卡尔智能赛车及调试平台开发研究.大连理工大学.硕士学位论文,2010
32
第十一届全国大学生邀请赛技术报告
附录:程序源代码
一、主程序:
/**---------------HIT_Smarhtcar--------------- ------------------日紫丁香一队--------------- ----------------------2016-----------------**/ //30 62 23.2 0.44 //32 74 23 0.46 //32 64 23.4 0.44 /*速度档*/ /*
25 43 0 17.5 0.36
26 32 2.8 42 0 14.7 0.27 xiuzheng3 27
28 (14.7,0.27)(15.7 0.29) 闭环给32慢很多 29 42 0 22.8 0.45
42 0.02 17.0 0.27 (wujifenxianfu) 30 20 0.36
31 43 (19 0.34)18.2 0.35 */
#include \"common.h\" #include \"include.h\" #include \"MK60_FTM.h\" #include \"Direction.h\" #include \"Other.h\" #include \"Speed.h\" int Po_Yu=2000;
float Speed_High=12.5; float speed_bai=9.5;
int sum=0,average=0,Pix_MAX=0,Pix_MIN=250; uint8 l_s_flag=0; uint8 Switch_s=0;
extern uint8 Yupan_bai;
extern uint8 Lost_CenterR_SHIZI[128]; extern uint8 Lost_CenterL_SHIZI[128]; uint8 num_bai=0; uint8 l_num_bai=0; int out_put=0;
//float P=3; //舵机的PWM参数 //float D=17.2;
33
//float P2=3.6; //丢右的情况的舵机PWM参数p //float D2=9; //参数d
float P=3; //舵机的PWM参数 float D=9;
float P2=3.6; //丢右的情况的舵机PWM参数p float D2=9; //参数d int QUICK=0;
uint8 Baise_delay_flag=0; int Baise_delay=0; uint8 array_change=0;
int K1_speed_quick=1200; int I_QUICK=500; int D_QUICK=500;
uint8 R_Flag[3],L_Flag[3];
uint8 g_width_A[7]={64,64,64,64,64}; uint8 R_Pos_A[5]={64,64,64,64,64}; uint8 L_Pos_A[5]={64,64,64,64,64}; uint8 CENTER[4]={64,64,64}; uint8 side_l_B; uint8 side_r_B;
uint8 Find_L_B=0; uint8 Find_R_B=0;
uint8 center1=64; uint8 Flag_left_B; uint8 Flag_right_B; uint8 center_start=64; uint8 Yuzhi_CCD=50;
uint8 side_l[2]={44,44}; uint8 side_r[2]={84,84}; uint8
l_side_left=0,l_side_right=0,l_Find_L_Flag=1,l_Find_R_Flag=1,l_suoding_r_flag=0,l_suoding_l_flag=0,Three_side=0;
uint8 side_left=36,side_right=92,k,last_cen,shizi; int8 distance=0,ddistance=0,pre_distance=0; int8 center=64;
int QUICK1=0,QUICK2=0,QUICK3=0,QUICK4=0; int I_SLOW,SLOW;
34
第十一届全国大学生邀请赛技术报告
float Fu_j1,Fu_j2;//Fu_j1为正斜率隶属度,Fu_j2为负斜率隶属度 float Fu_i1,Fu_i2;//Fu1为正斜率,Fu2为负斜率 float speed_k=0,speed=0;
float speed_error=0,d_error=0,pre_error=0,dd_error=0,pre_pre_error=0; float
speed_error_l=0,d_error_l=0,pre_error_l=0,dd_error_l=0,pre_pre_error_l=0;
float speed_l=0,speed_l_k=0; int R_QUICK=0,L_QUICK=0; float
speed_error_r=0,d_error_r=0,pre_error_r=0,dd_error_r=0,pre_pre_error_r=0;
float speed_r=0,speed_r_k=0; float A=0;
float N1=0,N2=0;
uint8 Flag_Lanse=0; //检测CCD是否全为蓝色 uint8 Flag_Baise=0; //十字路口全为白色的情况
uint8 Flag_Duoji=1; //判断舵 机方向的标志变量,0为左,1为中,2为右
uint8 Flag_shizi=0; //0为非十字,1为十字 int L_QUICK;
int Return_angle=1450,angle_error; //记录打角 int angle=1450;
int Cen=1455; //舵机中间的占峰比 ,还需要左右的占峰比 #define Fengming PTD3_OUT uint8 Pixel_A[128]={0}; uint8 Pixel_B[128]={0}; int Right_Encoder; int Left_Encoder; int Encoder;
uint8 Find_L_Flag=1; uint8 Find_R_Flag=1; uint8 CCD_Yuzhi=50; uint8 Yuzhi_lan=160; uint8 Yuzhi_bai=220; uint8 l_center=64;
/////////起步变量 int QibuDelay=0;
uint8 Jiance_flag_4=0; uint8 Jiance_flag_5=0;
35
////////////坡道检测变量 uint8 podaocount=0; int PodaoDelay=0;
uint16 Podao_Flag_1=0; uint8 Podao_Flag = 0; uint8 Podao_Flagcount=0; uint8 Jiance_flag=1; int JianceDelay=0; int podao[4]={0};
////////////停车黑带变量 uint8 heidai_r[4]={0,0,0,0}; uint8 heidai_l[4]={0,0,0,0}; uint8 count_l=0; uint8 count_r=0; uint8 stop_flag=0; uint8 Jiance_flag_1=1; uint8 Jiance_flag_2=1; int StopDelay=0; int StopDelay_2=0;
////////////障碍变量 int BarrierDelay=0; int pianjiao=0;
uint8 Barrier_R=0,Barrier_L=0; uint8 Jiance_flag_3=1;
uint8 num=0; //const uint8 PNum=5; //uint8 NN2=0; //const uint8 NNum1=6; //const uint8 NNum2=4; //uint8 ischange=0; //uint32 Mid_gray_value=100; char printbuff[20]; int MidGray=100;
void pit_hander(); void Collect_Image();
void Calculate_Center(uint8 Pix[]); void Xieru_shizi(uint8 Pix[]);
36
显示图像页数 图像总页数
参数调整页按键次数 可调整参数数量 可调整参数数量 是否更改数据 第十一届全国大学生邀请赛技术报告
void Speed_contral(); void Angle(); void qibu();
void Podaodeal_1(); void zhangaijiance(); void zhangaideal(); void little_S(); void Sto_jiance(); void Sto(); void Po_CCD();
void CCD_Debug(uint8 Pix[]);
void main(void) {
gpio_init (PTE19, GPO,0); //16 gpio_init (PTE16, GPO,0); //16 gpio_init (PTD3, GPI,0); gpio_init (PTD4, GPO,0); gpio_init (PTD0, GPO,0); gpio_init (PTD5, GPO,0);
gpio_init (PTC1, GPO,1); //舵机PWM PTE21 gpio_init (PTC2, GPO,1); //左电机 gpio_init (PTC3, GPO,1);
gpio_init (PTC4, GPO,1);//右电机 gpio_init (PTE25, GPO,1); gpio_init (PTE21, GPO,1); gpio_init (PTE20, GPO,0); gpio_init (PTE18, GPO,0);
// gpio_init (PTA12, GPO,1); gpio_init (PTA13, GPO,0);
gpio_init (PTB0, GPO,0); gpio_init (PTB2, GPO,0); gpio_init (PTB3, GPO,0);
gpio_init (PTE4, GPO,1); gpio_init (PTE2, GPO,1);
gpio_init (PTC0, GPO,0); gpio_init (PTB16, GPO,1);
gpio_init (PTB9, GPI,1);
37
gpio_init (PTB11, GPI,1); gpio_init (PTB17, GPI,1); gpio_init (PTA16, GPO,0);
key_init(KEY_MAX); //按键的初始化
FTM_QUAD_Init(FTM1);
lptmr_pulse_init(LPT0_ALT2,30000,LPT_Rising);//LPTMR计数
adc_init (ADC1_SE4a );//CCD采集 adc_init (ADC1_SE5a );
adc_init (ADC0_SE8 );//陀螺仪采集 adc_init (ADC0_SE12 ); adc_init (ADC0_SE13 );
uart_init (UART4, 115200);
Collect_Image(); CCD_Debug(Pixel_A);
if(Switch_A==1&&Switch_B==0)//只有最上面的打开 {
Switch_s=0; }
if(Switch_A==0&&Switch_B==1)//只有最下面的打开 {
Switch_s=1; }
if(Switch_A==1&&Switch_B==1) {
Switch_s=2; }
DisableInterrupts; pit_init_ms(PIT0,10); enable_irq(PIT0_IRQn);
set_vector_handler (PIT0_VECTORn, PIT0_IRQHandler); //PIT中断断若不能用,注意这里
38
中第十一届全国大学生邀请赛技术报告
FTM_PWM_init(FTM2, FTM_CH1,100,1450); BELL = 1; DELAY_MS(500); BELL = 0;
FTM_PWM_init(FTM0, FTM_CH0,20000,3000); FTM_PWM_init(FTM0, FTM_CH1,20000,0); FTM_PWM_init(FTM0, FTM_CH2,20000,3000); FTM_PWM_init(FTM0, FTM_CH3,20000,0); DELAY_MS(200); OLED_init(); // BELL = 1;
// BELL = 0;
EnableInterrupts; // Flash_Read();
while(1) {
ImageUpSend(Pixel_B);
if(out_put==1) {
// uart_putchar (UART4,0xff); // uart_putchar (UART4,0xff); uart_putchar (UART4,center);
// uart_putchar (UART4,(int)(stop_flag*20)); // uart_putchar (UART4,0); // uart_putchar (UART4,0); // uart_putchar (UART4,0); // uart_putchar (UART4,0); // uart_putchar (UART4,0); // uart_putchar (UART4,0); // uart_putchar (UART4,0xff); out_put=0; OLED_clear(); }
// Sto_jiance(); if(speed<1) {
KeyScan(); KeyChange(); } }
39
}
void PIT0_IRQHandler() {
PIT_Flag_Clear(PIT0); Collect_Image(); LPTMR0_CNR = 1;
Right_Encoder=lptmr_pulse_get(); //获取左右编码器的计数值 Left_Encoder=abs(FTM_QUAD_get(FTM1)); Encoder=(Right_Encoder+Left_Encoder)/2;
lptmr_pulse_clean(); //脉冲计数清零 FTM_QUAD_clean(FTM1); out_put=1;
// Danamic_PD();
Podao_Flag_1=adc_once(ADC0_SE5b, ADC_12bit); // qibu();
Calculate_B(Pixel_B); Calculate_Center(Pixel_A);
// Xieru_shizi(Pixel_A); //斜入十字 // Angle();
uart_putchar (UART4,(int)center); zhangaideal(); Podaodeal_1();
if(angle>1610){angle=1610;} if(angle<1290){angle=1290;}
FTM_PWM_Duty(FTM2, FTM_CH1,angle);
speed=(Right_Encoder+Left_Encoder)*0.02; Speed_contral(); Sto(); QUICK3=0; QUICK4=0; QUICK1=4000; QUICK2=4000;
FTM_PWM_Duty(FTM0, FTM_CH0, QUICK1);// you FTM_PWM_Duty(FTM0, FTM_CH1, QUICK3); FTM_PWM_Duty(FTM0, FTM_CH2, QUICK2); FTM_PWM_Duty(FTM0, FTM_CH3, QUICK4);
// Danamic_PD();
// PID(); //方向控制 // Speed_contral(); //速度控制
40
第十一届全国大学生邀请赛技术报告
}
二、传感器处理
/*十字检测*/
int TellCrossRoad(uint8 P[128]) {
uint8 l; uint8 LPos; uint8 RPos;
for(l=63;l>10;l--) {
if(((P[l-3]<120)&&(120
LPos = l; break; } }
for(l=64;l<117;l++) {
if(((P[l-3]>120)&&(120>P[l+3]))&&((P[l-5]>120)&&(120>P[l+5]))) {
RPos = l; break; } }
return (RPos-LPos); }
/*障碍检测*/
void TellBarrier(void) {
if((Find_L_A[0]==1&&Find_R_A[0]==1)&&(Find_L_B[0]==1&&Find_R_B[0]==1))
{
41
if((R_Pos_A[0]>L_Pos_A[0])&&((R_Pos_A[1]-R_Pos_A[0])>(int)(g_width_A[1]/5))&&((R_Pos_A[1]-R_Pos_A[0])<20)&&(ab(L_Pos_A[0]-L_Pos_A[1])<(int)(g_width_A[1]/4))&&(Add_DValue(Pixel_A)>200)) {
Barrier_L = 1; } else
if((R_Pos_A[0]>L_Pos_A[0])&&((-L_Pos_A[1]+L_Pos_A[0])>(int)(g_width_A[1]/5))&&((-L_Pos_A[1]+L_Pos_A[0])<20)&&(ab(R_Pos_A[0]-R_Pos_A[1])<(int)(g_width_A[1]/4))&&(Add_DValue(Pixel_A)>200)) {
Barrier_R = 1; } } }
/*计算图像像素点之间的差值之和*/ uint16 Add_DValue(uint8 P[128]) {
uint16 m = 0; uint8 n = 0;
for(n=Out_Point+5;n<(127-Out_Point-5);n++) {
m+=ab(P[n+1]-P[n]); }
return m; }
/*直角弯黑线检测*/ void TellLAngle(void) {
if(!Left&&!Right) {
LAngleCount+=1;//为了保证稳定性,车速应该不会大于3m,当车速等于3m的时候通过黑带该计数值应当为6.6,不然的话这个值会更大 }
if((L_Angle==0)&&(LAngleCount>0)&&(Left&&Right)) {
if(LAngleCount>=2) {
L_Angle = 1;//姑且设个5吧,这时候的车速大概需要4m。。反正是达不到,这样是为了防止车抖动引起突然误判直角 Distance = 0;
42
第十一届全国大学生邀请赛技术报告
ReGet = 0; L_Flag = 0; R_Flag = 0;
LAngleCount = 0; }
LAngleCount = 0;//不管怎么样这个都要清0的,不要影响其他判断
}
else if((L_Angle==1)&&(LAngleCount>0)&&(Right&&Left)) {
if(LAngleCount>=2) {
L_Angle = 0; Distance = 0; ReGet = 0; L_Flag = 0;
R_Flag = 0; LAngleCount = 0; }
LAngleCount = 0; } }
/***************检测边线********************/
void SearchLine(void) {
uint8 m;
if(CenterlineB==0) {
center1[4]=center1[3]; center1[3]=center1[2]; center1[2]=center1[1]; center1[1]=center1[0];
g_width_A[4] = g_width_A[3]; g_width_A[3] = g_width_A[2]; g_width_A[2] = g_width_A[1]; g_width_A[1] = g_width_A[0];
if((Find_L_A[0]==1)&&(Find_R_A[0]==1)) {
if((CenterlineB==0)&&(CenterlineB1>0)) g_width_A[0]
43
= 50;
if(R_Pos_A[0]>=L_Pos_A[0]) {
center1[0] = (int)((L_Pos_A[0]+R_Pos_A[0])/2); g_width_A[0] = (R_Pos_A[0]-L_Pos_A[0]);
Blackline = 0; Left_IN_Ten = 0; Right_IN_Ten = 0;
if(g_width_A[0]>70) {
XieRu_Flag+=1; if(XieRu_Flag==1) {
Static_Delta = center1[4]; g_ncenter = center1[4]; } }
else XieRu_Flag = 0; } }
else if((Find_L_A[0]==1)&&(Find_R_A[0]==0)) {
if((CenterlineB==0)&&(CenterlineB1>0)) g_width_A[0] = 50;
g_width_A[0]+=(L_Pos_A[0]-L_Pos_A[1]);
if(((int)(L_Pos_A[0]+g_width_A[0]/2))>127) center1[0]=127; else
center1[0] = (int)(L_Pos_A[0]+g_width_A[0]/2); }
else if((Find_L_A[0]==0)&&(Find_R_A[0]==1)) {
if((CenterlineB==0)&&(CenterlineB1>0)) g_width_A[0] = 50;
g_width_A[0]-=(R_Pos_A[1]-R_Pos_A[0]);
if(((int)(R_Pos_A[0]-g_width_A[0]/2))<0) center1[0]=0; else
center1[0] =
44
第十一届全国大学生邀请赛技术报告
(int)(R_Pos_A[0]-g_width_A[0]/2);
else if((Find_L_A[0]==0)&&(Find_R_A[0]==0)) {
if((CenterlineB==0)&&(CenterlineB1>0)) g_width_A[0] = 50;
center1[0] = center1[1]; }
if((Find_L_B[0]==1)&&(Find_R_B[0]==1)) {
center2 = (int)((L_Pos_B[0]+R_Pos_B[0])/2); //计算此刻CCD2看到的赛道的宽度 g_width_B[2] = g_width_B[1]; g_width_B[1] = g_width_B[0];
g_width_B[0] = (R_Pos_B[0]-L_Pos_B[0]); }
if((Find_L_A[0]==1)&&(Find_R_A[0]==1))//如果前边一个CCD的两边线都找到了 {
g_ncenter = center1[0];
}
else if((Find_L_A[0]==0)&&(Find_R_A[0]==1)) {
if((R_Pos_A[0]>102)&&(Find_L_B[0]==1)&&(Find_L_B[0]==1))//弯入十字的时候右边找到线但是却特靠近右侧,就往左边来一点儿 {
Right_IN_Ten+=1;
} else {
g_ncenter = center1[0]; } }
//仅仅检测到右边黑线
else if((Find_L_A[0]==1)&&(Find_R_A[0]==0))
45
{
if((L_Pos_A[0]<25)&&(Find_L_B[0]==1)&&(Find_L_B[0]==1))//弯入十字的时候左边找到线但是却特靠近左侧,就往右边来一点儿 {
Left_IN_Ten+=1; // if(center111<64) g_ncenter = 68;
// else if(center111>67) Static_Delta = 67; // else Static_Delta = center111; } else {
g_ncenter = center1[0]; } }
else if(((Find_L_A[0]==0)&&(Find_R_A[0]==0))) {
if((Add_DValue(Pixel_A)<=200)&&((Find_L_B[0]==1)&&(Find_R_B[0]==1))&&(L_Angle==0))
{
g_ncenter = 64; Blackline = 1;
}//如果靠前的CCD看到黑线,中线用后边的CCD的中线 else g_ncenter = center1[4]; }
TellBarrier();//判断是否为障碍 TellLAngle();//判断是否是直角黑线 }
for(m=10;m<117;m++) {
Pixel_1[m] = Pixel_A[m]; Pixel_2[m] = Pixel_B[m]; }
//if(TellSlope(g_width_A,g_width_B)&&(XieRu_Flag==0)&&(Right_IN_Ten==
46
第十一届全国大学生邀请赛技术报告
0)&&(Left_IN_Ten==0)) SlopeFlag = 1;//判断是否为坡道 if(Switch_A == 0) {
if((CenterlineA[0]>0)||(CenterlineB>0)) BELL = 1; else BELL = 0; }
else if(Switch_B == 0) {
if((Right_IN_Ten>0)||(Left_IN_Ten>0)) BELL = 1; else BELL = 0; }
else if(Switch_C == 0) {
if(L_Angle) BELL = 1; else BELL = 0; }
else if(Switch_D == 0) {
if(Barrier_L||Barrier_R) BELL = 1; else BELL = 0; } else {
if(XieRu_Flag>0) BELL = 1; else BELL = 0; } }
void Search_2() {
int16 i;
if(CenterlineB==0) {
Find_L_A[2] = Find_L_A[1]; Find_R_A[2] = Find_R_A[1]; Find_L_A[1] = Find_L_A[0]; Find_R_A[1] = Find_R_A[0]; R_Pos_A[2] = R_Pos_A[1]; L_Pos_A[2] = L_Pos_A[1];
L_Pos_A[1] = L_Pos_A[0]; R_Pos_A[1] = R_Pos_A[0];
47
L_Pos_B[1] = L_Pos_B[0]; Find_L_B[1] = Find_L_B[0];
//检测左边黑线
if((g_ncenter+15)>(127-Out_Point)) R_Start = 127-Out_Point; else R_Start = g_ncenter+15;//
if((CenterlineB==0)&&(CenterlineB1>0)) R_Start = 100;
for(i=R_Start;i>=Out_Point;i--) {
if((Pixel_A[i]-Pixel_A[i-5]>Jumping_DeltaA)&&
(ab(Pixel_A[i]-Pixel_A[i+1])<30)&&(ab(Pixel_A[i]-Pixel_A[i+2])<30)&&(ab(Pixel_A[i]-Pixel_A[i+3])<30)&&(ab(Pixel_A[i]-Pixel_A[i+4])<30)&& (ab(Pixel_A[i]-Pixel_A[i+5])<30)&&
(ab(Pixel_A[i]-Pixel_A[i+6])<30)&&(ab(Pixel_A[i]-Pixel_A[i+7])<30)&&(ab(Pixel_A[i]-Pixel_A[i+8])<30)&&(ab(Pixel_A[i]-Pixel_A[i+9])<30)&& (ab(Pixel_A[i]-Pixel_A[i+10])<30))
{ L_Pos_A[0] = i;
Find_L_A[0] = 1;//该数组中的元素置1表示找到了边线 break; } else {
Find_L_A[0] = 0; }
}
//检测右边黑线
if((g_ncenter-15) //检测左边黑线 for(i=L_Start;i<=(127-Out_Point);i++) { if((Pixel_A[i]-Pixel_A[i+5]>Jumping_DeltaA)&& 48 第十一届全国大学生邀请赛技术报告 (ab(Pixel_A[i]-Pixel_A[i-1])<30)&&(ab(Pixel_A[i]-Pixel_A[i-2])<30)&&(ab(Pixel_A[i]-Pixel_A[i-3])<30)&&(ab(Pixel_A[i]-Pixel_A[i-4])<30)&& (ab(Pixel_A[i]-Pixel_A[i-5])<30)&& (ab(Pixel_A[i]-Pixel_A[i-6])<30)&&(ab(Pixel_A[i]-Pixel_A[i-7])<30)&&(ab(Pixel_A[i]-Pixel_A[i-8])<30)&&(ab(Pixel_A[i]-Pixel_A[i-9])<30)&& (ab(Pixel_A[i]-Pixel_A[i-10])<30)) { R_Pos_A[0] = i; Find_R_A[0] = 1; break; } else { Find_R_A[0] = 0; } } if((center2+15)>(127-Out_Point)) R_Start = 127-Out_Point; else R_Start = center2+15;// for(i=R_Start;i>=Out_Point;i--) { if((Pixel_B[i]-Pixel_B[i-5]>Jumping_DeltaB)&& (ab(Pixel_B[i]-Pixel_B[i+6])<30)&&(ab(Pixel_B[i]-Pixel_B[i+7])<30)&&(ab(Pixel_B[i]-Pixel_B[i+8])<30)&&(ab(Pixel_B[i]-Pixel_B[i+9])<30)&& (ab(Pixel_B[i]-Pixel_B[i+10])<30)) { L_Pos_B[0] = i; Find_L_B[0] = 1;//该数组中的元素置1表示找到了边线 break; } else { Find_L_B[0] = 0; } } //检测右边黑线 49 if((center2-15) if((Pixel_B[i]-Pixel_B[i+5]>Jumping_DeltaB)&& (ab(Pixel_B[i]-Pixel_B[i-6])<30)&&(ab(Pixel_B[i]-Pixel_B[i-7])<30)&&(ab(Pixel_B[i]-Pixel_B[i-8])<30)&&(ab(Pixel_B[i]-Pixel_B[i-9])<30)&& (ab(Pixel_B[i]-Pixel_B[i-10])<30)) { R_Pos_B[0] = i; Find_R_B[0] = 1; break; } else { Find_R_B[0] = 0; } } } } void Search_1() { int16 i; g_ncenter_1 = g_ncenter; //在未取用速度闭环的时候计算得到灰度最大值和最小值位置以及值 if(Switch_1==1) { Maxvalue_A=Pixel_A[0]; Minvalue_A=Pixel_A[0]; Maxvalue_B=Pixel_B[0]; Minvalue_B=Pixel_B[0]; for(i=Out_Point;i<127-Out_Point;i++) { if(Pixel_A[i]>Maxvalue_A) { Maxvalue_A=Pixel_A[i]; } 50 第十一届全国大学生邀请赛技术报告 if(Pixel_B[i]>Maxvalue_B) { Maxvalue_B=Pixel_B[i]; } if(Pixel_A[i] if(Pixel_B[i] } if(XieRu_Flag==0) { TellCenterL(); } } /***************启动CCD曝光********************/ void CCD_START(void) { uint8 i; CCD_SI = 1; /* SI = 1 */ asm(\"nop\"); asm(\"nop\"); CCD_CLK = 1; /* CLK = 1 */ asm(\"nop\"); asm(\"nop\"); CCD_SI = 0; /* SI = 0 */ asm(\"nop\"); asm(\"nop\"); CCD_CLK = 0; /* CLK = 0 */ for(i=0; i<127; i++) { asm(\"nop\"); CCD_CLK = 1; /* CLK = 1 */ asm(\"nop\"); CCD_CLK = 0; /* CLK = 0 */ 51 } asm(\"nop\"); asm(\"nop\"); CCD_CLK = 1; /* CLK = 1 */ asm(\"nop\"); asm(\"nop\"); CCD_CLK = 0; /* CLK = 0 */ } /***************CCD图像采集********************/ void CCD_GET(void) { uint8 i; CCD_SI = 1; /* SI = 1 */ asm(\"nop\"); asm(\"nop\"); CCD_CLK = 1; /* CLK = 1 */ asm(\"nop\"); asm(\"nop\"); CCD_SI = 0; /* SI = 0 */ asm(\"nop\"); asm(\"nop\"); for(i = 0; i < 50; i++) { asm(\"nop\"); //200ns } Pixel_A[0] = adc_once(ADC1_SE4a, ADC_8bit);//c0 Pixel_B[0] = adc_once(ADC1_SE5a, ADC_8bit); // CCD_CLK = 0; /* CLK = 0 */ for(i=0; i<127; i++) { asm(\"nop\"); asm(\"nop\"); CCD_CLK = 1; /* CLK = 1 */ asm(\"nop\"); asm(\"nop\"); Pixel_A[i+1] = adc_once(ADC1_SE4a, ADC_8bit);// Pixel_B[i+1] = adc_once(ADC1_SE5a, ADC_8bit); // CCD_CLK = 0; /* CLK = 0 */ 52 第十一届全国大学生邀请赛技术报告 } asm(\"nop\"); asm(\"nop\"); CCD_CLK = 1; /* CLK = 1 */ asm(\"nop\"); asm(\"nop\"); CCD_CLK = 0; /* CLK = 0 */ } 53 因篇幅问题不能全部显示,请点此查看更多更全内容