简 介: 本文设计的智能车系统以NXP RT1064微控制器为核心控制单元,通过车体前方的摄像头检测赛道信息;通过齿轮编码器检测模型车的实时速度,使用PID 控制算法调节驱动左右电机的转速,PD算法控制舵机转向,实现了对车运动速度和运动方向的闭环控制。为了提高模型车的速度和稳定性,使用Matlab、 MFC 上位机、 SD 卡模块、按键模块,拨码开关模块等调试工具,进行了大量硬件与软件测试。实验结果表明,该系统设计方案确实可行。

学 校:上海大学
队伍名称:猫耳麻花
参赛队员:舒好  
王品霖 
马嘉琪 
带队教师:黄慎之 
陈万米 

引 言


  全国大学生智能汽车竞赛是以“立足培养、重在参与、鼓励探索、追求卓越”为指导思想,鼓励创新的一项科技竞赛活动。竞赛要求在规定的汽车模型平台上,使用STC, Infineon, NXP系列单片机作为核心控制模块,通过增加道路传感器、电机驱动模块以及编写相应控制程序,制作完成一个能够自主识别道路的模型汽车。参赛队员的目标是模型汽车需要按照规则以最短时间完成出库,完成两圈任务,入库等一系列任务。

  自从第五届出现磁导组开始到今年第十六届比赛,电磁小车已经在智能车的赛道上奔驰了八年,从第六届取消了前瞻长度的限制,电磁车速度开始有了质的飞跃,第七届改成直立状态行走以其独特魅力和新的技术挑战让参赛者向往不已;第八届改回四轮行进方式并采用了A车模,小车的速度再次出现大幅提升;到第十届同样是四轮行进并采用了B车模进行双车追逐;到第十一届再次改成直立行走;第十二届采用B车双车追逐的方式表现,并增加了超车的元素,使电磁车的观赏性和技术性更上一层。到如今第十六届比赛,AI智能组横空出世,摄像头也没有高度限制,映入了OpenArt mini作为AI识别的基本单元,并且有AI识别任务和三叉等新的元素引入,极大的增加了比赛的趣味性,看点十足。

  在这份报告中,我们小组通过对小车设计制作整体思路、电路、算法、调试、车辆参数的介绍,详尽地阐述了我们的思想和创意,具体表现在电路的创新设计,以及算法方面的独特想法,而对单片机PID,模糊控制等具体参数的调试也让我们付出了艰辛的劳动。这份报告凝聚着我们的心血和智慧,是我们共同努力后的成果。

  在准备比赛的过程中,我们小组成员涉猎控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科。几个月来的经历,培养了我们电路设计、软件编程、系统调试等多方面的能力,锻炼了我们知识融合、实践动手的能力,最重要的是锻炼了我们的心志。在疫情的冲击下,备赛条件匮乏,面对困难,大家团结一致不退缩,遇到问题解决问题,这些对我们今后的学习、生活以及工作都有着重要的实际意义。 

第一章 系统总体设计


  本章主要简要地介绍智能车系统总体设计思路,在后面的章节中将整个系统分为机械结构、控制模块、控制算法等三部分对智能车控制系统进行深入的介绍分析。

1.1系统总体方案的设计

  根据竞赛规则相关规定,基础四轮组智能车系统可采用竞赛指定车模中任何型号,允许使用各类电磁、红外光电、摄像头、激光、超声传感器器件进行赛道和环境检测,车模微控制器使用STC, Infineon, NXP系列单片机,在KEIL开发环境中进行软件开发。利用摄像头二值化传回的数据,通过滤波操作返回有用信息,输入到控制核心进行决策。通过编码器测速模块来检测车速,并采用RT1064的输入捕捉功能进行脉冲计数计算速度和路程;电机转速控制采用 PID 控制,通过 PWM 控制驱动电路调整电机的转速,完成智能车速度的闭环控制。此外,还增加了拨码开关作为输入输出设备,完成对Flash内的参数调整,用于智能车的角度和方位控制。

1.2系统总体方案设计图

▲ 图1.2系统总体方框图

  根据以上系统方案设计,赛车共包括六大模块:让RT1064主控模块、传感器模块、电源模块、电机驱动模块、速度检测模块、辅助调试模块。各模块的作用如下:

  1.RT1064主控模块:作为整个智能车的“大脑”,将采集电感传感器、编码器等传感器的信号,根据控制算法做出控制决策,驱动直流电机和伺服电机完成对智能车的控制。

  2.传感器模块:是智能车的“眼睛”,可以通过一定的前瞻性,提前感知前方的赛道信息,为智能车的“大脑”做出决策提供必要的依据和充足的反应时间。

  3.电源模块:为整个系统提供合适而又稳定的电源。

  4.电机驱动模块:驱动直流电机和伺服电机完成智能车的加减速控制和转向控制。

  5.速度检测模块:检测反馈智能车后轮的转速,用于速度的闭环控制。

  6.辅助调试模块:主要用于智能车系统的功能调试、赛车状态监控等方面。

第二章 智能车机械结构调整与优化


  智能车中的控制都是在一定的机械结构基础上实现的,因此在设计整个软件架构和算法之前一定要对整个车模的机械结构有一个感性的认识,然后建立相应的数学模型。从而再针对具体的设计方案来调整赛车的机械结构,并在实际的调试过程中不断的改进和提高。本章将主要介绍智能车车模的机械结构和调整方案。

2.1智能车车体机械建模

  此次比赛选用的赛车车模采用C型车模。赛车机械结构只使用竞赛提供车模的底盘部分及转向和驱动部分。控制采用前轮转向,后轮驱动方案。

  我们对机械结构的要求是:简单而高效。我们在不断的尝试后确定了以下的设计方案:

▲ 图2.1 智能车C车器件布局图

  • 轴距 203mm
  • 前轮距 153mm
  • 后轮距 155mm
  • 总长 380mm
  • 总高 310mm
  • 总重 1700g

2.2智能车前轮定位的调整

  现代汽车在正常行驶过程中,为了使汽车直线行驶稳定,转向轻便,转向后能自动回正,减少轮胎和转向系零件的磨损等,在转向轮、转向节和前轴之间须形成一定的相对安装位置,叫车轮定位,其主要的参数有:主销后倾、主销内倾、车轮外倾和前束。智能车竞赛模型车的四项参数都可以调整,但是由于模型车加工和制造精度的问题,在通用的规律中还存在着一些偶然性。

2.2.1主销后倾角

  所谓主销后倾,是将主销(即转向轴线)的上端略向后倾斜。从汽车的侧面看去,主销轴线与通过前轮中心的垂线之间形成一个夹角,即主销后倾角。主销后倾的作用是增加汽车直线行驶时的稳定性和在转向后使前轮自动回正。由于主销后倾,主销(即转向轴线)与地面的交点位于车轮接地点的前面。这时,车轮所受到的阻力的作用点总是在主销轴线之后,相当于主销拖着车轮前进。这样,就能保持行驶方向的稳定性。当车转弯时,由于车轮所受阻力作用线,不通过主销轴线,这样,车轮所受阻力在主销方向有力矩作用产生,迫使车轮自动偏转直到到车轮所受阻力作用线通过主销轴线,此时,车轮已回正,这就是转向车轮的自动回正功能。

  主销后倾角越大,方向稳定性越好,自动回正作用也越强,但转向越沉重。汽车主销后倾角一般不超过3°,由前悬架在车架上的安装位置来保证。现代轿车由于采用低压宽幅子午线轮胎,高速行驶时轮胎的变形加大,接地点后移,因此主销后倾角可以减小,甚至为负值(变成主销前倾),以避免由于回正力矩过大而造成前轮摆振。

  模型车通过增减黄色垫片的数量来改变主销后倾角的,由于竞赛所用的转向舵机力矩不大,过大的主销后倾角会使转向变得沉重,转弯反应迟滞,所以设置为0°,以便增加其转向的灵活性。
  2.2.2主销内倾角

  所谓主销内倾,是将主销(即转向轴线)的上端向内倾斜。从汽车的前面看去,主销轴线与通过前轮中心的垂线之间形成一个夹角,即主销内倾角。主销内倾的作用是使车轮转向后能及时自动回正和转向轻便。对于模型车,通过调整前桥的螺杆的长度可以改变主销内倾角的大小,由于过大的内倾角也会增大转向阻力,增加轮胎磨损,所以在调整时可以近似调整为0°-3°左右,不宜太大。

  主销内倾和主销后倾都有使汽车转向自动回正,保持直线行驶的功能。不同之处是主销内倾的回正与车速无关,主销后倾的回正与车速有关,因此高速时主销后倾的回正作用大,低速时主销内倾的回正作用大。

2.2.3车轮外倾角

  轮外倾角是指通过车轮中心的汽车横向平面与车轮平面的交线与地面垂线之间的夹角,对汽车的转向性能有直接影响,它的作用是提高前轮的转向安全性和转向操纵的轻便性。在汽车的横向平面内,轮胎呈“八”字型时称为“负外倾”,而呈现“V”字形张开时称为正外倾。如果车轮垂直地面一旦满载就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。所以事先将车轮校偏一个正外倾角度,一般这个角度约在1°左右,以减少承载轴承负荷,增加零件使用寿命,提高汽车的安全性能。

  模型车提供了专门的外倾角调整配件,近似调节其外倾角。由于竞赛中模型主要用于竞速,所以要求尽量减轻重量,其底盘和前桥上承受的载荷不大,所以外倾角调整为0°即可,并且要与前轮前束匹配。

2.2.4 前轮前束

  所谓前束是指两轮之间的后距离数值与前距离数值之差,也指前轮中心线与纵向中心线的夹角。前轮前束的作用是保证汽车的行驶性能,减少轮胎的磨损。前轮在滚动时,其惯性力自然将轮胎向内偏斜,如果前束适当,轮胎滚动时的偏斜方向就会抵消,轮胎内外侧磨损的现象会减少。像内八字那样前端小后端大的称为“前束”,反之则称为“后束”或“负前束”。在实际的汽车中,一般前束为0-2mm。

  在模型车中,前轮前束是通过调整伺服电机带动的左右横拉杆实现的。主销在垂直方向的位置确定后,改变左右横拉杆的长度即可以改变前轮前束的大小。在实际的调整过程中,我们发现较小的前束,约束0-2mm可以减小转向阻力,使模型车转向更为轻便,但实际效果不是十分明显。

  虽然模型车的主销后倾角、主销内倾角、车轮外倾角和前束等均可以调整,但是由于车模加工和制造精度的问题,在通用的规律中还存在着不少的偶然性,一切是实际调整的效果为准。

2.3智能车转向机构调整优化

  理想的转向模型,是指在轮胎不打滑时,忽略左右两侧轮胎由于受力不均产生的变形,忽略轮胎受重力影响下的变形时车辆的的转向建模。在这种理想的模型下,车体的转向半径可以计算得到。

▲ 图2.2 智能车转向示意图

  如图2.2,假设智能车系统为理想的转向模型,且其重心位于其几何中心。车轮满足转向原理,左右轮的轴线与后轮轴线这三条直线必然交于一点。

  转向机构在车辆运行过程中有着非常重要的作用。合适的前桥和转向机构可以保证在车辆直线行驶过程中不会跑偏,能保证车辆行驶的方向稳定性;而在车辆转向时,合适的转向机构可以使车辆自行回到直线行驶状态,具有好的回正性。正是由于这些原因,转向系统优化设计成为智能车设计中机械结构部分的重点,直接关系到赛车能否顺利地完成比赛。在实际操作中,我们通过理论计算的方案进行优化,然后做出实际结构以验证理论数据,并在实际调试过程中不断改进。

  在模型车制做过程中,赛车的转向是通过舵机带动左右横拉杆来实现的。转向舵机的转动速度和功率是一定,要想加快转向机构响应的速度,唯一的办法就是优化舵机的安装位置和其力矩延长杆的长度。由于功率是速度与力矩乘积的函数,过分追求速度,必然要损失力矩,力矩太小也会造成转向迟钝,因此设计时就要综合考虑转向机构响应速度与舵机力矩之间的关系,通过优化得到一个最佳的转向效果。经过最后的实际的参数设计计算,最后得出一套可以稳定、高效工作的参数及机构。

  如图2.3,我们最终设计的这套转向拉杆,我们综合考虑了速度与扭矩间的关系,并根据模型车底盘的具体结构,简化了安装方式,实现了预期目标。

▲ 图2.3 转向拉杆图

2.4智能车后轮减速齿轮机构调整

  模型车后轮采用RS380电机驱动,电机轴与后轮轴之间的传动比为 4.25。齿轮传动机构对车模的驱动能力有很大的影响。齿轮传动部分安装位置的不恰当,会大大增加电机驱动后轮的负载,会严重影响最终成绩。调整的原则是:两传动齿轮轴保持平行, 齿轮间的配合间隙要合适,过松容易打坏齿轮,过紧又会增加传动阻力,浪费动力;传动部分要轻松、顺畅,不能有迟滞或周期性振动的现象。判断齿轮传动是否良好的依据是,听一下电机带动后轮空转时的声音。声音刺耳响亮,说明齿轮间的配合间隙过大,传动中有撞齿现象;声音闷而且有迟滞,则说明齿轮间的配合间隙过小,或者两齿轮轴不平行,电机负载变大。调整好的齿轮传动噪音很小,并且不会有碰撞类的杂音,后轮减速齿轮机构就基本上调整好了,动力传递十分流畅。

2.5轮胎的保养与使用

  本届比赛C车模采用橡胶的有胎纹的橡胶,在使用的过程中主要暴露出的问题有:高速行驶时轮胎抓地力不足;轮胎材料强度不足,长期使用容易磨损。规则中不允许对轮胎进行任何改变轮胎性能的处理,因此在调试过程中,我们尽量选择对称、圆的轮胎;尽可能改变前轮倾角,使轮胎与地面的接触面积在各个工况下综合最大;在不调试的时间里尽量避免四轮与地面接触,保证轮胎的形状不发生改变。

2.6 编码器的安装

  为了提高精度,本车使用了编码器。为了便于安装和减轻重量,我们选择利用原装车模自带的孔位进行编码器的安装,较好的保证了两啮合齿轮轴的平行度及传动的平顺性。

▲ 图2.4 编码器安装

2.7 智能车重心位置的调整

  为了达到较远前瞻,因为摄像头高度不限切需要加装OpenArt mini作为新的识别单元,车前重量过于集中,会引起车重心特别靠前,后轮正压力不足导致甩尾。为了使重心后移,我们尝试了很多传感器支架的搭建方式,使得保证结构稳定的前提下尽量减轻重量。同时,我们把舵机和电池均往后移,适当的增加了车身后部配重,达到了预期的效果。

2.8其它机械结构的调整

  另外,在模型车的机械结构方面还有很多可以改进的地方,比如说车轮、悬架、底盘、车身高度等。

  模型车在高速的条件下(2.3m/s-3.5m/s),由于快速变化的加减速过程,使得模型车的轮胎与轮辋之间很容易发生相对位移,可能导致在加速时会损失部分驱动力。在实验中调试表明,赛车在高速下每跑完一圈,轮胎与轮毂之间通常会产生几个厘米的相对位移,严重影响了赛车的加速过程。为了解决这个问题,我们在实际调试过程中对车轮进行了粘胎处理,可以有效地防止由于轮胎与轮辋错位而引起的驱动力损失的情况。

  此外,我们还对车身高度,以及底盘的形状和质量等,都进行了相应的改进和调整,均取得了不错效果。

第三章 硬件系统设计及实现


3.1主控板和驱动板的硬件设计

  从最初进行硬件电路设计时我们就既定了系统的设计目标:可靠、高效、简洁,在整个系统设计过程中严格按照规范进行。

  可靠性是系统设计的第一要求。我们对电路设计的所有环节都进行了电磁兼容性设计,做好各部分的接地、屏蔽、滤波等工作,并且在外铺设了锡箔纸,将高速数字电路与模拟电路分开,使本系统工作的可靠性达到了设计要求。

  高效与实用性是指本系统的各模块能充分完美的实现相应的功能。新C车模采用双电机驱动,我们设计了单独的驱动芯片组成驱动器,瞬间驱动电流最大可以达到几十安培。

  简洁是指在满足了可靠、高效的要求后,为了尽量减轻车模的负载,降低模型车的重心位置,应使电路设计尽量简洁,尽量减少元器件使用数量,缩小电路板面积,使电路部分重量轻,易于安装,在设计完原理图后,注重PCB板的布局,优化电路的走线,整齐排列元器件,最终做到电路板的简洁。

3.1.1 电源管理模块

  电源模块对于一个控制系统来说极其重要,关系到整个系统是否能够正常工作,因此在设计控制系统时应选好合适的电源模块。竞赛规则规定,比赛使用智能汽车竞赛统一配发的标准车模用7.2V 2000mAh Ni-cd供电或者使用锂电池(两节18650,2AH,配备保护板),我们在实际尝试对比之后选择锂电池供电方案。

  为满足需要,本车模上存在4种供电电压:

  1)智能车使用锂电池(两节18650,2AH,配备保护板)供电,充满时电压在7.8~8.4V,可直接用于直流电机供电。

  2)一些数字器件使用直流5V,5V电源选用线性稳压芯片LM1117-5V。

  3)使用3.3V为单片机系统,人机交互模块和电磁传感器模块供电,采用线性稳压芯片LM1117-3.3V。
  一般来说,线性电源是将输出电压取样然后与参考电压送入比较电压放大器,此电压放大器的输出作为电压调整管的输入,用以控制调整管使其结电压随输入的变化而变化,从而调整其输出电压,技术成熟,制作成本较低,稳定度可以达到要求。

  4)电机驱动模块使用直流12V,使用MC34063升压电源模块。加若干LED显示各类电源工作状况。

  该部分原理图如图3.1所示。

▲ 图3.1 电源管理模块原理图

  3

3.1.2 电机驱动模块

  电机驱动电路为一个由分立元件制作的直流电动机可逆双极型桥式驱动器,其功率元件由四支 N 沟道功率 MOSFET 管组成,额定工作电流可以轻易达到 100A 以上,大大提高了电动机的工作转矩和转速。该驱动器主要由以下部分组成: PWM信号输入接口、逻辑换向电路、死区控制电路、电源电路、上桥臂功率 MOSFET 管栅极驱动电压泵升电路、功率 MOSFET 管栅极驱动电路、桥式功率驱动电路、缓冲保护电路等;专用栅极驱动芯片通常具有防同臂导通、硬件死区、欠电压保护等功能,可以提高电路工作的可靠性。

  常用的电机驱动有两种方式:

一、集成电机驱动芯片;

二、采用N沟道MOSFET和专用栅极驱动芯片设计。

  市面上常见的集成H桥式电机驱动芯片中,33886型芯片性能较为出色,该芯片具有完善的过流、欠压、过温保护等功能,内部MOSFET导通电阻为120毫欧,具有最大5A的连续工作电流。使用集成芯片的电路设计简单,可靠性高,但是性能受限。由于比赛电机内阻仅为几毫欧,而集成芯片内部的每个MOSFET导通电阻在120毫欧以上,大大增加了电枢回路总电阻,此时直流电动机转速降落较大,驱动电路效率较低,电机性能不能充分发挥。

  由于分立的N沟道MOSFET具有极低的导通电阻,大大减小了电枢回路总电阻。另外,专门设计的栅极驱动电路可以提高MOSFET的开关速度,使PWM控制方式的调制频率可以得到提高,从而减少电枢电流脉动。并且专用栅极驱动芯片通常具有防同臂导通、硬件死区、欠电压保护等功能,可以提高电路工作的可靠性。

1.专用栅极驱动芯片的选择:

  IR公司号称功率半导体领袖,所以我们主要在IR公司的产品中进行选择。其中IR2104型半桥驱动芯片可以驱动高端和低端两个N沟道MOSFET,能提供较大的栅极驱动电流,并具有硬件死区、硬件防同臂导通等功能。使用两片 IR2184型半桥驱动芯片可以组成完整的直流电机H桥式驱动电路。由于其功能完善,价格低廉容易采购,所以我们选择它进行设计。

2.MOSFET的选择:

  选择MOSFET时主要考虑的因素有:耐压、导通内阻和封装。智能汽车电源是额定电压为7.2V的电池组,由于电机工作时可能处于再生发电状态,所以驱动部分的元件耐压值最好取两倍电源电压值以上,即耐压在16V以上。而导通内阻则越小越好。封装越大功率越大,即同样导通电阻下通过电流更大,但封装越大栅极电荷越大,会影响导通速度。常用的MOSFET封装有TO-220、TO-252、SO-8等,TO-252封装功率较大、而栅极电荷较小。于是我们最终选择了IR公司TO-252封装的LR7843型N沟道MOSFET,VDSS=55伏、RDS(on)=8.0毫欧、ID=110安。

3、驱动电路的原理分析及元件参数确定

▲ 图3.1.2.2电机驱动分析图

  这个驱动设计单从信号逻辑上分析比较容易理解,但要深入的理解和更好的应用,就需要对电路做较深入的分析,对一些外围元件的参数确定做理论分析计算。图3.8中IC是一个高压驱动芯片,驱动2个半桥MOSFET。Vb,Vs为高压端供电;Ho为高压端驱动输出;COM为低压端驱动供电,Lo为低压端驱动输出;Vss为数字电路供电.此半桥电路的上下桥臂是交替导通的,每当下桥臂开通,上桥臂关断时Vs脚的电位为下桥臂功率管Q2的饱和导通压降,基本上接近地电位,此时Vcc通过自举二极管D对自举电容C2充电使其接近Vcc电压.当Q2关断时Vs端的电压就会升高,由于电容两端的电压不能突变,因此Vb端的电平接近于Vs和Vcc端电压之和,而Vb和Vs之间的电压还是接近Vcc电压.当Q2开通时,C2作为一个浮动的电压源驱动Q2;而C2在Q2开通其间损失的电荷在下一个周期又会得到补充,这种自举供电方式就是利用Vs端的电平在高低电平之间不停地摆动来实现的。由于自举电路无需浮动电源,因此是最便宜的,如图所示自举电路给一只电容器充电,电容器上的电压基于高端输出晶体管源极电压上下浮动。图2.6中的D和C2是IR2104在脉宽调制(PWM)应用时应严格挑选和设计的元器件,根据一定的规则进行计算分析;并在电路实验时进行调整,使电路工作处于最佳状态,其中D是一个重要的自举器件,应能阻断直流干线上的高压,其承受的电流是栅极电荷与开关频率之积,为了减少电荷损失,应选择反向漏电流小的快恢复二极管,芯片内高压部分的供电都来自图中自举电容C2上的电荷;为保证高压部分电路有足够的能量供给应适当选取C2的大小.

  MOSFET具有相似的门极特性,开通时需要在极短的时间内向门极提供足够的栅电荷,在自举电容的充电路径上,分布电感影响了充电的速率,下桥臂功率管的最窄导通时间应保证自举电容有足够的电荷以满足栅极所需要的电荷量再加上功率器件稳态导通时漏电流所失去的电荷量.因此,从最窄导通时间为最小值考虑,自举电容应足够小;综上所述,在选择自举电容大小时应考虑,既不能太大影响窄脉冲的驱动性能;也不能太小影响宽脉冲的驱动要求,应从功率器件的工作频率、开关速度、门极特性等方面进行选择、估算后调试而定。
  该部分原理图如图3.2所示。

▲ 图3.2 电机驱动模块原理图

3.2 智能车传感器模块设计

  本系统采用RT1064芯片作为控制器,全局快门数字摄像头MT9V032作为信息采集传感器。原始采集的图像是模拟电路转换得到的一个二维矩阵,是一幅灰度图像。

第四章 软件系统设计及实现


  控制程序是人的思想在车模体现,程序要体系化,模块化,稳定化,目标是将硬件电路和机械性能发挥到最大,让车模用最快的速度完成比赛。

4.1底层初始化

  编写初始化函数init (),初始化用到的模块,如下(子函数略):

void init(void)
{gpio_init(D12,GPO,0,GPIO_PIN_CONFIG);//蜂鸣器Boma_init();
oled_init();
ips114_init();encoder_init();mt9v03x_csi_init(); motor_init();servo_init();pit_initiate();flash_init();buton_init();AI_uart_init();AI_uart_init1();seekfree_wireless_init();icm20602_init_spi();
}

4.2传感器采集处理算法

  原始图像由于赛道光线不均匀,远处赛道无效信息较多、赛道反光处不可控等情况。对于特殊赛道元素的判断干扰较大。为了使系统更加稳定,提高系统的鲁棒性和可移植性,提供尽可能多的赛道信息,在软件系统设计上必须屏蔽这些因素。

  灰度图像信息较为繁杂,不容易处理。本系统采用图像滤波、边缘检测、图像矫正、二值化等算法将图像优化。进而容易判断各种特殊元素。

4.2.1 图像滤波

  灰度图像跳变点较多,图像较为复杂,为了更好的识别赛道类型,首先对赛道的图像进行滤波处理。
  对图像进行统计排序滤波。采用3*3的滤波器对图像进行线性空间滤波,将滤波器模板乘以图像中对应灰度值,相加取平均得模板中心灰度值。

  g(x*y)=∑_(s=-a)^a▒ ∑_(t=-b)^a▒〖w(s,t)f(x+s,y+t)〗
  a=(m-1)/2,b=(n - 1)/2

  滤波过程:

  g(x,y)=(∑_(s=-a)^a▒ ∑_(t=-b)^b▒〖w(s,t)f(x+s,y+t)〗)/(3*3)

  中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波对处理椒盐噪声非常有效。为后面的图像处理做铺垫。

4.2.2 图像锐化

  在灰度图像中,赛道边缘较为模糊。在本系统中,采用一阶微分对图像进行锐化。3*3锐化模板如下。

  Z=[■(z1&z2&z3@z4&z5&z6@z7&z8&z9)]
  g_x=∂f/∂x=(z_7+2z_8+z_9 )-(z_1+2z_2+z_3 )
  g_y=∂f/∂y=(z_7+2z_8+z_9 )-(z_1+2z_2+z_3 )

M(x,y)=|(z_7+2z_8+z_9 )-(z_1+2z_2+z_3 )|+|(z_7+2z_8+z_9 )-(z_1+2z_2+z_3 )|

  Soble算子如下:
  S1=[■(-1&-2&-1@0&0&0@1&2&1)]
  S2=[■(-1& 0& 1@-2& 0& 2@-1& 0& 1)]
  Sobel算子能够锐化的边缘信息较强。

4.2.3 图像校正

  为了获取更多的信息,在智能车系统中使用了140度摄像头。但是赛道会会发生桶形失真。桶形失真是由镜头引起的成像画面呈桶形膨胀状的失真现象。赛道形状畸形,这不利于赛道元素的判断。
  为了使原始图像尽可能恢复到原始状况,我们进行逆透视变换,使用矩阵变换,实现由摄像头图像到真实图像的映射。

4.2.4 图像扫线

  摄像头算法的核心部分为左右边线的提取,从而推算出中心线的位置和赛道偏差,引导车子的行进方向。边线提取,中心线推算思路:

  1.近处图像较远处图像可靠,所以边线由近到远提取;
  2.最后一行先从中间向两边进行边沿搜索,找到边沿,确保近处图像有效;
  3.之后的行采用边沿跟踪,根据上一行的黑线位置动态地确定本行黑线的搜索范围,搜索黑线,节省时间;
  4.若连续几行的左右线都找不到,判断为十字弯,进行左右线的延伸,直再找到有效的边线;
  5.若左右边线均找到,该行中心线直接为左右边线等权重加权;若某一边线丢失,则根据前面有效行的赛道宽度和另一边线的位置对中心线进行推算;
  6.推算完中心线后可对中心线进行一定的修正,更符合实际。

4.3 特殊元素判断

  在智能车赛道中有很多特殊元素。例如环岛,坡道,车库等元素。这些元素需要软件系统主动识别并且特殊控制车辆运动。

4.3.1 环岛处理

  环岛我们的处理思路是分为入环识别,环内识别,出环识别。对于入环识别,图像边界一侧为直线,另一侧为空白,曲线,空白,直线即可判断为环岛。然后对中线数组进行处理使小车打角进入环岛。对于环内识别,只要一侧曲线弯曲度比较大即可。出环识别,一侧为长直线即可判断为出环。

4.3.2 车库处理

  车库元素位于发车、停车区,这要求我们要提高智能车识别算法的精准性。速度控制灵敏可靠。
  在车库元素,我们首先判断前方到达车库。判断成功后将速度降低,以达到稳定入库。进入车库后,将速度降为零。

4.4 AI处理

4.4.1 摄像头设置

  相机为OpenArt mini,第一版方案为单相机完成赛道任务,受限于总钻风高度,架于总钻风上方,可以完成所有任务。第二版方案为双相机,一前一后,前者完成数字与tag识别,后者完成水果与打靶任务。

  由于openartmini的帧率不高,容易出现漏检问题,最为核心的因素是openartmini帧率跟不上小车运行的速度,在颜色(RGB565、GRAYSCALE)、分辨率(QQVGA、QVGA)中选择了RGB565与QVGA的组合,尽管灰度图配QQVGA分辨率对于需要处理的图像数据是最少的(帧率最高),但由于分辨率低,对于识别任务都不友好,故在尝试后放弃。

  由于大规模的图像数据处理很慢,选择了在收到MCU数据后才进行对应的元素识别。

4.4.2 AprilTag识别原理

  AprilTag是一个视觉基准库,在AR,机器人,相机校准领域广泛使用。通过特定的标志(与二维码相似,但是降低了复杂度以满足实时性要求),可以快速地检测标志,并计算相对位置。

  AprilTag内容主要包含三个步骤:

  第一步是如何根据梯度检测出图像中的各种边缘。

  第二步即如何在边缘图像中找出需要的四边形图案并进行筛选,AprilTag尽可能的对检测出的边缘检测,首先剔除非直线边缘,在直线边缘进行邻接边缘查找,最终若形成闭环则为检测到一个四边形。
  最后一个步便是如何进行二维码编码和二维码解码,编码方式分为三种,其黑边色块长度分别为8,7,6三个色块长度,对于解码内容,要在检测到的四边形内生成点阵列用于计算每色块的值,再根据局部二值模式(Local Binary Patterns)构造简单分类器对四边形内的色块进行分类,将正例色块编码为1将负例色块编码为0,就可以得到该二维码的编码。得到编码以后再与已知库内的编码进行匹配,确定解码出的二维码是否为正确。
  由于Apriltag码在openartmini中可以直接使用,因此,Apriltag码仅需要通过一个简单的图像处理就可以得到极高的准确率。

4.4.3图像处理

  Apriltag码在识别过程中最易出现两个问题:漏检、误检。

  对于误检问题,在小车运动过程会莫名看到一些不知道是什么的图像,并将其识别为Apriltag码。在刚开始的情况下,选择了滤波解决,通过连续两次识别到相同的tag_id后,才将其认定为识别到tag码,该种方法准确率为百分之一百,但容易造成漏检问题,即车辆经过tag码时,仅检测到一帧图像中的tag码。之后选择了设定mini的roi区域与有效tag_id的范围,可以有效提高相机帧率,并在一定程度上防止了将杂点识别为tag的情况,接近100%。

  对于漏检问题,最为核心的因素是openartmini帧率跟不上小车运行的速度,因此设定了roi区域减少数据的处理量,可以根据赛道中tag码贴的位置改变roi区域大小以便达到最优的方案。灰度图配QQVGA分辨率在识别tag中会更快,但改善效果不明显。

  数字识别方式为先寻找指定区域内的矩形,再通过十分类模型完成目标识别。
  识别方框调用了openmv中的find_rect函数,由于该函数通过四元检测算法识别矩形,边界大小过小容易将赛道等干扰因素识别为矩形,边界大小过大则有时难以识别出指定目标,故通过一个较为合适的阈值(50000),加以矩形特征(长宽、位置)筛选出所需要的矩形,例如矩形的长宽比或是单独的长、宽,(将图形畸变考虑在内,实则可以根据所停的位置确定)。

  模型选择了lenet-5模型,通过nncu工具进行量化,量化位数为9.,数据集自己拍摄,每份数字500张,正确率约为95%。

4.4.4 水果动物模型

  水果动物识别参考数字识别。在水果动物数据集进行训练时,有两种方案,一是训练二分类模型,一是训练十分类模型,我们模型是通过cifar-10模型训练,再将识别所得结果二分类,在较小的测试集下,不分优劣,但从特征上分析,每类动物能提取的特征大于动物一个大类所能提取出的共同特征,也就是说十分类后二分类更准。

4.4.5 水果打靶

  识别完水果后还要进行打靶操作,打靶我们尝试了两种方案。
  由于机械结构搭建一定存在误差,激光与相机中轴不可能不存在误差,因此需要通过程序调零,即相机的外参调节,如果需要通过相机标定后通过正逆运动学变换一步到位,内外参的调节是不可绕过的一步,其他方法仅需要修正相机偏差。

  方案一:根据规则将激光定高15cm,通过小车的移动来使得激光打中靶心。当未识别到水果时,发出向前指令。当识别到水果后,判断偏差pan_error,当pan_error小于0时,发出向前指令,当pan_error大于0时,发出向后指令。注意点有二:由于摄像头由舵机控制转向,左侧和右侧pan_error的前进或后退指令正好相反,即左侧时,偏差小于0时为前方。此外,仍需要一个记忆单元,记录上一步的指令,以防出现抖动(在后退时有一帧图像未识别到矩形,发出向前指令)。

  方案二:PID调节舵机,通过与中心点的偏差通过PID方式计算下一需要的占比空。该类方法较为简单,但不应该使用openartmini控制舵机,由于0-255占空比满足不了高精度旋转,误差会很大,应该选择MCU控制。此外,当距离较远时,还会遇到图像透视变换后产生的问题,矩形方框的中点不是图片的中心,偏差就不可信了。解决方案只能通过相机标定得到的相机内参计算实际中心点的位置,可以但不必要。

  因此最好的方案应该是方案一与方案二的结合,在适当的偏差范围转动舵机进行PID调节。

4.4.6 动物停车

  识别完动物后的操作由主控完成,不做赘述。

4.5 控速、过弯策略

4.5.1基于位置式PID的方向控制

  PID控制是工程实际中应用最为广泛的调节器控制方法。问世至今70多年来,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。

【通用原理部分,此处省略3000字...】

4.5.3弯道分析

  在车辆进弯时,需要对三个参数进行设定:切弯路径、转向角度、入弯速度。

  其中,切弯路径主要决定了车辆是选择内道过弯还是外道过弯。切内道,路经最短,但是如果地面附着系数过小会导致车辆出现侧滑的不稳定行驶状态,原因是切内道时,曲率半径过小,同时速度又很快,所以模型车需要的向心力会很大,而赛道本身是平面结构,向心力将全部由来自地面的摩擦力提供,因此赛道表面的附着系数将对赛车的运行状态有很大影响。切外道,路径会略长,但是有更多的调整机会,同时曲率半径的增加会使得模型车可以拥有更高的过弯速度。

  转向角度决定了车辆过弯的稳定性。合适的转向角度会减少车辆在转弯时的调整,不仅路径可以保证最优,运动状态的稳定也会带来效率的提高,减少时间。在考虑转向角度设置时需要注意以下几个问题:对于检测赛道偏移量的传感器而言,在增量较小时的转向灵敏度;检测到较大弯道时的转向灵敏度;对于类似S弯的变向连续弯道的处理。

  对于入弯速度的分析,应该综合考虑路径和转向角度的影响。简单而言,我们会采取入弯减速,出弯加速的方案,这样理论上可以减少过弯时耗费的时间。然而,在过去几届比赛中,通过观察各参赛车对弯道的处理后,我们发现并不是所有人都选择了相同的方案。正如前面说到的那样,不联系路径和转向角度,只是单纯地分析过弯速度,会造成思路的局限甚至错误。例如,在不能及时判断入弯和出弯的标志点就采取“入弯减速、出弯加速”的方案,会出现弯道内行驶状态不稳定、路径差,同时出弯加速时机过晚,一样会浪费时间。所以现在本系统参考实际驾驶时的一些经验,对过弯速度的处理方式确定为:入弯时急减速,以得到足够的调整时间,获得正确的转向角度;在弯道内适当提速,并保持角度不变,为出弯时的加速节约时间;出弯时,先准确判断标志,然后加速,虽然会耗费一些时间,但是面对连续变向弯道可以减少判断出错的概率,保证行驶状态的稳定性,而且弯道内的有限加速对后面的提速也有很大的帮助。综合考虑用可以接收的额外时间换回行驶稳定性还是值得的。

  下面以常见的几种弯道转角处理方式解释各方案的优缺点,其中,横坐标表示由传感器采集回来的赛道中心线相对赛车中心线的偏移量,纵坐标表示转角大小。

  a图表示偏移量与转向角度呈线性关系,在计算及程序编写上都比较简单,也可以实现控制赛车行驶的目标,但是由于规则制定比较简单,对赛车实际行驶状态的分析不够全面,所以在实际应用时不能简单套用。

  b图表示的是在赛车略微偏离赛道中心时,不要对行驶方向作太大调整,而是在当偏离度大到预定值时急速调整转角以保证过弯的及时,同时在以判断出是急弯后,也不要进行大的变动,因为此时转角的值已经很大,仅需对舵机进行微调就可以保证方向的正确性。这种方案的优点是综合考虑了赛车对个弯道的适应程度,同时保证了在直线行驶时的稳定性,和抗干扰性,但是对急弯的响应可能不够及时,这是该方案的主要缺点。

  c图表示的对弯道的处理方案与B图恰好相反,它提高了相应灵敏度,降低了抗干扰性,对于多弯道,且弯道曲率半径较小的赛道有比较好的适应性。

  d、e图是两种比较特殊的处理方案,它们不能用于赛车的全程控制,只是考虑到赛车的实际运行特点对某部分的偏移量有特别要求是使用。对于传统四轮车辆,转向时前轮有比较严格的角度关系,而它们的得到是由转向系统决定的。这样两套系统都对某个值做出了限制,必然会有矛盾,在车由0度转到最大转角时,并不是每时每刻都能同时满足两种条件的限制,那么为了赛车行驶的稳定性,我们可能会在小范围内对转角波动,以得到附近最合适的转角值,减小矛盾。

4.5.4弯道分析策略制定

  在智能车比赛中,我们使用的是分段PID以及分段速度进行控制,即根据differ之的大小,来改变车的Kp,Kd以及速度,在实际情况重,效果卓著,具体调参流程见下文。

第五章 开发工具、制作、安装、调试过程说明


5.1 开发工具

  程序的开发是在KEIL下进行的,包括源程序的编写、编译和链接,并最终生成可执行文件。

5.2 调试过程

5.2.1 控制算法的参数整定

  运用 PID 控制的关键是调整三个比例系数,即参数整定。PID 整定的方法有两类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。由于智能车整个系统是机电高耦合的分布参数系统,并且要考虑赛道具体环境,要建立精确的智能车运动控制数学模型有一定难度,而且对车身机械结构经常进行不断修正,模型参数变化较频繁,可操作性不强;二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单,采用了这种方法。

1.方向控制算法的参数整定

  方向控制采用位置式PID控制。由于小车循迹本质上是一个随动系统,积分项在弯道累积的偏差错误地加在直道的跟踪上,造成在进入直道时转向不够准确,跑直道时虽然能实现跟踪,但是转向调整往往超调,导致车身在直道上左右震荡,这种震荡严重影响了车的整体表现。

  将积分项系数Ki设为0,发现车能在直线高速行驶时仍能保持车身非常稳定,没有震荡,所以没有必要使用 Ki 参数。该控制方案调整为PD控制。Kp和Kd参数由工程整定得出,经过多次试验,得到多组不同情况的参数,并且针对自身模型设置舵机转向的上下限。

2.速度控制算法的参数整定

  速度控制采用增量式PID控制,同样采用上一小节的工程整定法。经多次试验得出,Kp,Ki ,Kd 分别取16,2,1,调节死区设置为1,调节范围设置为450(全速时为1350),车模行驶直道和弯道加减速反映迅速,整体速度良好。

5.3 整车机械方面的调整

  车模的机械也是很重要的一方面,针对摄像头车模,必须有几个特别需要关注的地方:

  1)摄像头必须加以支架固定,否则摄像头抖动会导致小车运行的不稳定。

  2)重心尽可能低,可适当增加配重块,最重要的是,要综合OpenArt位置进行合理的排布,不能挡住总钻风,并且角度也要选择好,增加识别的准确度。

第六章 模型车的主要技术参数


  • 赛车基本参数 长 26cm
  • 宽 18cm
  • 高 29cm
  • 车重 1200g
  • 功耗 空载 10W
  • 带载 大于12W
  • 电容总容量 1880uF
  • 传感器 方波编码器 2个
  • 陀螺仪 1个
  • 10mH的电感 11个
  • 除了车模原有的驱动电机、舵机之外伺服电机个数 0
  • 赛道信息检测 精度(近/远) 2/12.5mm
  • 频率 5ms

结 论


  自报名参加全国大学生智能汽车竞赛以来,我们小组成员从查找资料、设计机构、组装车模、编写程序一步一步的进行,最后终于完成了最初目标,定下了现在这个设计方案。

  在此份技术报告中,我们主要介绍了准备比赛时的基本思路,包括机械、电路以及最重要的控制算法的创新思想。
  在传感器布局,我们分析了摄像头高度和摄像头位置的安装,综合考虑到程序的稳定性、简便性,我们最后敲定了现在的摄像头支架安装,并通过反复实践决定了传感器的数量和位置。

  在电路方面,我们以模块形式分类,主控模块、传感器模块、电源模块、电机驱动模块、速度检测模块、辅助调试模块这六个模块分别设计,在查找资料的基础上各准备了几套方案;然后我们分别实验,最后以报告中所提到的形式决定了我们最终的电路图。

  在算法方面,我们使用C语言编程,利用比赛推荐的开发工具调试程序,经过小组成员不断讨论、改进,终于设计出一套比较通用的,稳定的程序。在这套算法中,我们结合路况调整车速,做到直线加速,弯道减速,保证在最短时间跑完全程。

  在这几个月的备战过程中,场地和经费方面都得到了学校和学院的大力支持,在此特别感谢一直支持和关注智能车比赛的学校和学院领导以及各位指导老师、指导学长,同时也感谢比赛组委会能组织这样一项有意义的比赛。
  现在,面对即将到来的大赛,在历时近四个月的充分准备之后,我们有信心在比赛中取得优异成绩。也许我们的知识还不够丰富,考虑问题也不够全面,但是这份技术报告作为我们四个月辛勤汗水来的结晶,凝聚着我们小组每个人的心血和智慧,随着它的诞生,这份经验将永伴我们一生,成为我们最珍贵的回忆。

参 考 文 献


[1] 邵贝贝. 嵌入式实时操作系统[LC/OS-Ⅱ(第2版)[M]. 北京.清华大学出版社.2004
[2] 邵贝贝. 单片机嵌入式应用的在线开发方法[M].北京.清华大学出版社.2004
[3] 王晓明. 电动机的单片机控制[M].北京. 北京航空航天大学出版社.2002
[4] 臧杰,阎岩. 汽车构造[M]. 北京. 机械工业出版社.2005
[5] 安鹏,马伟.S12单片机模块应用及程序调试[J]. 电子产品世界. 2006.第211期. 162-163
[6] 童诗白,华成英.模拟电子技术基础[M].北京. 高等教育出版社.2000
[9] 沈长生.常用电子元器件使用一读通[M].北京. 人民邮电出版社.2004
[10] 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出版社.2004
[11] 张伟等.Protel DXP高级应用[M].北京. 人民邮电出版社.2002
[12] 张文春. 汽车理论[M].北京.机械工业出版社.2005

#include "headfile.h"int16 count=0;
uint8 clearflag=0;
uint8 sds[4]={0};
uint32 flag1=0;
uint8 flag3=4;
//int16 flag2=0;
uint8 DATA[4]={0};
//???? ????                ??????
void element_find(void)
{if(!startflag)start();if(startflag==1){ crossroad_find();
//  cross_find();//????&&diver==0podao_find();  //????
// roundabout_find();//????//start_line();//??? //apr_find();qipao_find();   //????
//  entry_find();  //?????   ???// stop_find();  //??// garage_find();//????huandao_L_find();      //????sancha_left();sancha_right();}
}
void element_deal(void)
{crossroad_deal();
//  cross_deal();//????//roundabout_deal();//????
//  garage_deal();//????huan_L_entr_count();   //????cheku_deal();//sancha_right();}
void get_road(void)
{if(1)//!qipao_flag{get_bottom_line();get_rest_line();}for(uint16 j=0;j<=59;j++){if(leftline[j]<0)leftline[j]=0;if(leftline[j]>159)leftline[j]=159;if(rightline[j]>159)rightline[j]=159;if(rightline[j]<0)rightline[j]=0;}//get_line_one();// get_line_all();
//  getBlackRow();
//get_endline();if(startflag==1)get_endline_R();   //?????element_find();element_deal();bu_xian();get_middle();
// get_midline();   //???,?????????get_differ();road_type();chujie();
}
int main(void)
{ int i=0,j=0;float differ_contect_speed=0;DisableGlobalIRQ();board_init();//Îñ±Ø±£Áô£¬±¾º¯ÊýÓÃÓÚ³õʼ»¯MPU ʱÖÓ µ÷ÊÔ´®¿Úinit();systick_delay_ms(5000);//×ÜÖжÏ×îºó¿ªÆôEnableGlobalIRQ(0);//      flag1=3854;//×ó5900 ÓÒ5070 5646  3237  1300
//  //×ó 6700 ÓÒ 850     5400  3900    2400
//  while(1)
//  {//  while(!gpio_get(L_bo_1))
//  {////            if(flag1<=3500) flag1=5500;
////            else if(flag1>=7500) flag1=3500;
//          flag1+=1;
//          ips114_showint16(0,3,flag1);
//          pwm_duty(PWM4_MODULE2_CHA_C30, flag1);//¶æ»úÖÐÖµ 50hz/0.02s  x/50000Õ¼¿Õ±È
//          systick_delay_ms(20);
//  }
//  while(!gpio_get(L_bo_2))
//  {////    if(flag1<=3500) flag1=5500;
////            else if(flag1>=7500) flag1=3500;
//          flag1-=1;
//          ips114_showint16(0,3,flag1);
//          pwm_duty(PWM4_MODULE2_CHA_C30, flag1);//¶æ»úÖÐÖµ 50hz/0.02s  x/50000Õ¼¿Õ±È
//          systick_delay_ms(20);
//  }
//  }
//      pwm_duty(servo_PWM, 3410);
//      systick_delay_ms(10000);
//      pwm_duty(servo_PWM, 4380);
//      systick_delay_ms(10000);
//      pwm_duty(servo_PWM, 3916);
//      systick_delay_ms(10000);
//      while(1)
//      {//          pwm_duty(LEFT_MOTOR2_PWM, 0);      //×óÂÖ·´×ª
//          pwm_duty(LEFT_MOTOR1_PWM, 10000);      //×óÂÖÕýת
//          pwm_duty(RIGHT_MOTOR2_PWM,10000);      //ÓÒÂÖÕýת
//          pwm_duty(RIGHT_MOTOR1_PWM,0);     //ÓÒÂÖ·´×ª
//      }
//}/////////////////////////////////////////////////////////////////////////µ÷ÊÔ´úÂë//pwm_duty(servo_PWM, 250000);//¶æ»úÖÐÖµ 50hz/0.02s  x/50000Õ¼¿Õ±È
//    while(1)
//      {//          pwm_duty(LEFT_MOTOR2_PWM, 0);      //×óÂÖ·´×ª
//          pwm_duty(LEFT_MOTOR1_PWM, 10000);      //×óÂÖÕýת
//
//          pwm_duty(RIGHT_MOTOR2_PWM,10000);      //ÓÒÂÖÕýת
//          pwm_duty(RIGHT_MOTOR1_PWM,0);     //ÓÒÂÖ·´×ª
//
//          flag1=encoder_check();
//          ips114_showint16(0,0,flag1);
//          flag2=get_rightspeed();
//          ips114_showint16(0,3,flag2);
//           systick_delay_ms(100);//       }
///////////////////////////////////////////////////////////// ///////////////////
//Write_information();
Read_information();     //????        ????
while(1)
{if(!gpio_get(L_bo_1))     //????
{   button_opreation();
}
else
{Write_information();     //????         ????while(1)
{// if(jieli_flag)    //{/*??????*///show_computer();if(mt9v03x_csi_finish_flag){//uint8 i=58;qz
//      for(int8 k=29;k>=0;k--)
//       {//          flag3= rightline[k]-leftline[k];
//          seekfree_wireless_send_buff(&flag3,1);
//       }
//       flag3= endline1;
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=rightline[59]-leftline[59];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=road_distance;
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=rightline[56];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=leftline[i]-leftline[i-4];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=rightline[i-1]-rightline[i];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=rightline[i-2]-rightline[i];
//       seekfree_wireless_send_buff(&flag3,1);
//      flag3=rightline[i-4]-rightline[i];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=image_Data[15][80];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=image_Data[15][30];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=image_Data[16][96];
//       seekfree_wireless_send_buff(&flag3,1);
//flag3=leftline[59];
// seekfree_wireless_send_buff(&flag3,1);
// flag3=leftline[58];
// seekfree_wireless_send_buff(&flag3,1);
//flag3=leftline[i-2];
// seekfree_wireless_send_buff(&flag3,1);
//flag3=leftline[i-4];
//seekfree_wireless_send_buff(&flag3,1);
//flag3=leftline[i-6];
//seekfree_wireless_send_buff(&flag3,1);
//flag3=leftline[i-8];
// seekfree_wireless_send_buff(&flag3,1);
// flag3=leftline[i-16];
// seekfree_wireless_send_buff(&flag3,1);
//  flag3=rightline[i]-rightline[i-1];
//  seekfree_wireless_send_buff(&flag3,1);
//flag3=rightline[i-2];
// seekfree_wireless_send_buff(&flag3,1);
//flag3=rightline[i-4];
//seekfree_wireless_send_buff(&flag3,1);
//flag3=rightline[i-6];
//seekfree_wireless_send_buff(&flag3,1);
//flag3=rightline[i-8];
//seekfree_wireless_send_buff(&flag3,1);
//flag3=rightline[6];
// seekfree_wireless_send_buff(&flag3,1);
// flag3=rightline[11];
// seekfree_wireless_send_buff(&flag3,1);
//
//flag22=huan_L_flag;
//seekfree_wireless_send_buff(&flag22,1);
//flag22=huan_L_cnt;
//seekfree_wireless_send_buff(&flag22,1);//       flag3=image_Data[2][80];
//          seekfree_wireless_send_buff(&flag3,1);
//        flag3=image_Data[4][80];
//          seekfree_wireless_send_buff(&flag3,1);
//        flag3=image_Data[8][80];
//          seekfree_wireless_send_buff(&flag3,1);
//        flag3=image_Data[12][80];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=image_Data[16][80];
//       seekfree_wireless_send_buff(&flag3,1);
//       flag3=image_Data[6][80];
//            flag3=startflag;
//            seekfree_wireless_send_buff(&flag3,1);
//            flag3=huan_L_flag;
//            seekfree_wireless_send_buff(&flag3,1);
//            flag3=huan_R_flag;
//            seekfree_wireless_send_buff(&flag3,1);
//              flag3=L_crossroad;
//            seekfree_wireless_send_buff(&flag3,1);
//            flag3=R_crossroad;
//            seekfree_wireless_send_buff(&flag3,1);
//        flag3=podao_flag;
//          seekfree_wireless_send_buff(&flag3,1);
//        flag3=ku_L;
//          seekfree_wireless_send_buff(&flag3,1);
//        flag3=ruku_speed_low;
//          seekfree_wireless_send_buff(&flag3,1);
//        flag3=qipao_flag;
//          seekfree_wireless_send_buff(&flag3,1);
//          flag3=s_to_b_1;
//          seekfree_wireless_send_buff(&flag3,1);
//          flag3=s_to_b_in;
//          seekfree_wireless_send_buff(&flag3,1);
//          flag3=duty;
//          seekfree_wireless_send_buff(&flag3,4);
//flag3=sancha_flag;
//          seekfree_wireless_send_buff(&flag3,1);
//          flag3=sancha_flag_left;
//          seekfree_wireless_send_buff(&flag3,1);
//          flag3=sancha_flag_right;
//          seekfree_wireless_send_buff(&flag3,1);
////            flag3=bend_count_L;
////            seekfree_wireless_send_buff(&flag3,1);
////            flag3=bend_count_R;
////            seekfree_wireless_send_buff(&flag3,1);
//                      flag3=-differ;
//          seekfree_wireless_send_buff(&flag3,1);mt9v03x_csi_finish_flag = 0;median_filtering();Sobel_edge();gray_binaryzation();//???         get_road();if(!gpio_get(L_bo_3)) ips114_displayimage032_zoom(image_Data[0], MT9V03X_CSI_W, MT9V03X_CSI_H,240,135);}ServoControlDiffer(differ);
//  differ_contect_speed=(float)((hope_speed/300.0)*differ);
// ServoPDSet(differ);
//ServoControlDiffer(differ_contect_speed); //
//  angle_count();
//ServoPDSet(differ);
//ServoControlDiffer(differ);    //data_conversion(S_N,0,0,0,DATA);if(gpio_get(R_bo_4)){uint8 flagclear1=clearflag;
if(!gpio_get(R_bo_2)&&!gpio_get(R_bo_1))
{clearflag=1;if(clearflag!=flagclear1)ips114_clear(WHITE);
ips114_showstr(0,0,"apryes");
ips114_showint16(150,0, apryes);
ips114_showstr(0,1,"rightspeed");
ips114_showint16(150,1, rightspeed);
ips114_showstr(0,2,"leftspeed");
ips114_showint16(150,2, leftspeed);
ips114_showstr(0,3,"hopespeed");
ips114_showint16(150,3, real_hope_speed);
ips114_showstr(0,4,"qipao_flag");
ips114_showuint16(150,4, qipao_flag);ips114_showstr(0,5,"ku_L");
ips114_showuint16(150,5, ku_L);
ips114_showstr(0,6,"ku_R");
ips114_showuint16(150,6, ku_R);
ips114_showstr(0,7,"sanchacount");
ips114_showuint16(150,7, sanchacount);//oled_fill(0x00);
} else if(!gpio_get(R_bo_2)&&gpio_get(R_bo_1))
{clearflag=2;if(clearflag!=flagclear1)ips114_clear(WHITE);
//          ips114_showstr(0,0,"y");
//          ips114_showint16(150,0,ring_L_flag);
//          ips114_showstr(0,1,"chu");
//          ips114_showint16(150,1,roundabout_flag_L);ips114_showstr(0,0,"sancha_flag");ips114_showint16(150,0,sancha_flag);ips114_showstr(0,1,"sancha_flag_left");ips114_showint16(150,1,sancha_flag_left);ips114_showstr(0,2,"huan_R_flag");ips114_showint16(150,2,huan_R_flag);ips114_showstr(0,3,"huan_L_flag");ips114_showint16(150,3, huan_L_flag);ips114_showstr(0,4,"diver");ips114_showuint16(150,4, diver);ips114_showstr(0,5,"cnt_fache");ips114_showuint16(150,5, cnt_fache);//          ips114_showstr(0,5,"error");
//          ips114_showint16(150,5, qipao_line);ips114_showstr(0,6,"sancha_flag_right");ips114_showuint16(150,6, sancha_flag_right);ips114_showstr(0,7,"huan_L_cnt");ips114_showuint16(150,7, huan_L_cnt);
//          ips114_showstr(0,5,"huan_L_cnt");
//          ips114_showuint16(150,5, huan_L_cnt);
//          ips114_showstr(0,6,"huan_R_cnt");
//          ips114_showuint16(150,6, huan_R_cnt);//          ips114_showstr(0,2,"k");
//         ips114_showfloat(70,2,k,3,3);
//
//          ips114_showstr(0,5,"now_position");
//          ips114_showint16(150,5,now_position);
//          ips114_showstr(0,6,"angle");
//          ips114_showfloat(70,6,angle,3,3);
//          ips114_showstr(0,6,"huan_L_entry");
//          ips114_showint16(150,6,huan_L_entry);
//
//          ips114_showstr(0,6,"distance");
//          ips114_showuint16(150,6, road_distance);
//
//          ips114_showstr(0,3,"b");
//          ips114_showfloat(70,3,b,3,3);
//          ips114_showstr(0,4,"piece_three");
//          ips114_showfloat(70,4,piece_three,3,3);
//          ips114_showstr(0,5,"piece_two");
//          ips114_showfloat(70,5,piece_two,3,3);
//          ips114_showstr(0,6,"piece_one");
//          ips114_showfloat(70,6,piece_one,3,3);
}else if(gpio_get(R_bo_2)&&!gpio_get(R_bo_1))
{   clearflag=2;if(clearflag!=flagclear1)ips114_clear(WHITE);
//          ips114_showstr(0,0,"y");
//          ips114_showint16(150,0,ring_L_flag);
//          ips114_showstr(0,1,"chu");
//          ips114_showint16(150,1,roundabout_flag_L);ips114_showstr(0,0,"differ");ips114_showint16(150,0,differ);ips114_showstr(0,1,"endline");ips114_showint16(150,1,endline);ips114_showstr(0,2,"uart_data");ips114_showint16(150,2,uart_data);ips114_showstr(0,3,"servoKp");ips114_showfloat(150,3, servoKp,2,2);ips114_showstr(0,4,"servoKd");ips114_showfloat(150,4, servoKd,2,2);ips114_showstr(0,5,"podao_flag");ips114_showuint16(150,5, podao_flag);//          ips114_showstr(0,5,"error");
//          ips114_showint16(150,5, qipao_line);ips114_showstr(0,6,"adjustLeft");ips114_showint32(150,6,adjustLeft,5);ips114_showstr(0,7,"angle");ips114_showint16(150,7, angle);//oled_disp_image();}
else
{j=0;for(uint8 i=59;i>=52;i--){ips114_showint8(0,j,rightline[i]);j++;}  j=0;for(uint8 i=51;i>=45;i--){ips114_showint8(60,j,rightline[i]);j++;}  j=0;for(uint8 i=45;i>=38;i--){ips114_showint8(120,j,rightline[i]);j++;}j=0;for(uint8 i=37;i>=30;i--){ips114_showint8(180,j,rightline[i]);j++;}
}//else if(!gpio_get(L_bo_3))
//{//  ips114_displayimage032_zoom(image_Data[0], MT9V03X_CSI_W, MT9V03X_CSI_H,240,135);//}
////else if(gpio_get(R_bo_2)&&gpio_get(R_bo_1))
////{//// // seekfree_sendimg_032(USART_8);
//// if(1)  //????
////    {////      uart_putchar(USART_8,0x00);uart_putchar(USART_8,0xff);uart_putchar(USART_8,0x01);uart_putchar(USART_8,0x01);//????
////      for(i=0; i<MT9V03X_CSI_W*MT9V03X_CSI_H; i++)
////      {////        if(image_Data[i/MT9V03X_CSI_W][i%MT9V03X_CSI_W]==1)
////        {////          uart_putchar(USART_8,0x20);
////          if(i%MT9V03X_CSI_W==0)
////          {////            uart_putchar(USART_8,0x0d);
////            uart_putchar(USART_8,0x0a);
////          }
////        }
////        else if(image_Data[i/MT9V03X_CSI_W][i%MT9V03X_CSI_W] == 0)
////        {////          uart_putchar(USART_8,0x49);
////          if(i%MT9V03X_W==0)
////          {////            uart_putchar(USART_8,0x0d);
////            uart_putchar(USART_8,0x0a);
////          }
////        }
////      }
////    }
//// if(1) //???
////          {////            for(i=0;i<Row;i++)
////            {////              for(j=0;j<Col;j++)
////              {////                if(j==leftline[i])
////                  uart_putchar(USART_8,0x3c);
////                else if(j==midline[i])
////                  uart_putchar(USART_8,0x3d);
////                else if(j==rightline[i])
////                  uart_putchar(USART_8,0x3e);
////                else
////                  uart_putchar(USART_8,0x20);
////              }
////              uart_putchar(USART_8, 0X0d);
////              uart_putchar(USART_8, 0X0a);
////            }
////          }
////   }
//// }
//}
// //}
//    }}
//if(!gpio_get(R_bo_4)||(gpio_get(R_bo_1)&&gpio_get(R_bo_2))||!gpio_get(R_bo_4))
//   ips114_clear(WHITE);}}}
}

● 相关图表链接:

  • 图1.2系统总体方框图
  • 图2.1 智能车C车器件布局图
  • 图2.2 智能车转向示意图
  • 图2.3 转向拉杆图
  • 图2.4 编码器安装
  • 图3.1 电源管理模块原理图
  • 图3.1.2.2电机驱动分析图
  • 图3.2 电机驱动模块原理图

智能车竞赛技术报告 | 智能车视觉 - 上海大学 - 猫耳麻花相关推荐

  1. 智能车竞赛技术报告 | 智能车视觉 - 山东大学(威海) - 山魂五队

    简 介: 本文详细介绍了山东大学(威海)山魂五队在第十六届"恩智浦"杯全国大学生智能汽车竞赛智能视觉组中的系统方案,包括硬件电路设计.机械结构设计.巡线算法以及识别算法的设计等.本 ...

  2. 智能车竞赛技术报告 | 智能车视觉 - 温州大学- 春华秋实

    简 介: 目前自动驾驶话题非常火热,近几年华为.特斯拉.谷歌.百度等大型互联网公司都在进行关于这方面的研究.本文设计了基于恩智浦 RT1064芯片的智能小车,以 keil5为开发环境,利用基于 MT9 ...

  3. 智能车竞赛技术报告 | 智能车视觉 - 西南科技大学 - 西科二队

    简 介: 本车以恩智浦公司的 32 位单片机MI.MXRT1064DV高内核处理速度核心控制器,可提供卓越的CPU性能和最佳实时响应.以MT9V034摄像头为核心传感器,通过摄像头采集道路图像信息送入 ...

  4. 智能车竞赛技术报告 | 智能车视觉 - 新余学院 - 开放艺术队

    简 介: 该智能车设计以 32位的 RT1064微控制器作为控制单元,通过 MT9V034数字摄像头传感器采集赛道信息,将采集到的图像进行处理:通过 OpenARTmini模块部署神经网络识别图像:另 ...

  5. 智能车竞赛技术报告 | 智能车视觉 - 中南林业科技大学 - 弃车人队

    简 介: 本文根据第十六届智能车大赛的要求,经过在实验室的不断调试,研究并设出了拥有自主循迹功能及数字和物种识别功能的以摄像头传感器为主导的 AGV实体.在循迹算法上,为了加快小车对赛道信息的采集速度 ...

  6. 智能车竞赛技术报告 | 智能视觉组 - 北京科技大学智能视觉组

    简 介: 本文设计的智能车系统以 为核心控制单元,通过CMOS摄像头检测赛道信息,使用数字摄像头采集赛道的灰度图,通过动态阈值算法生成二值化图像数组,提取黑色引导线,用于赛道识别:通过光电编码器检测模 ...

  7. 智能车竞赛技术报告 | 智能车视觉 - 南京邮电大学 - 栅库砸车跑路队

    学 校:南京邮电大学  队伍名称:删库砸车跑路队 参赛队员:刘乐      孙锐      甘翠      带队教师:江兵      刘烨      第一章 方案设计   本章主要介绍智能汽车系统总体 ...

  8. 智能车竞赛技术报告 | 智能车视觉 - 青岛工学院 - 青工战斗

    简 介: 本文设计的智能车系统以LPC54606J512微控制器为核心控制单元,基于MT9V034摄像头的图像采样获取赛道图像信息,提取赛道中心线,计算出小车与黑线间的位置偏差,采用PD方式对舵机转向 ...

  9. 智能车竞赛技术报告 | 智能车视觉 - 三江学院 - 识别不别

    学 校:三江学院 队伍名称:识别不别 参赛队员:占晨龙  王汶洁  王倩   带队教师:陈春   葛年明  引 言   本文以第十六届全国大学生智能汽车竞赛为背景,该比赛受教育部高等教育司委托,由教育 ...

最新文章

  1. c++采集声卡输出_耳上明珠 | 魅族双 C 耳机 — EP2C
  2. 异常处理第三讲,SEH(结构化异常处理),异常展开问题
  3. Helm 从入门到实践 | 从 0 开始制作一个 Helm Charts
  4. spring ioc原理_这70 道Spring高频面试题,你不好奇吗?
  5. 【Java】indexOf 方法区分大小写
  6. matepad和鸿蒙,上手华为新 MatePad Pro :搭载鸿蒙系统后,生产力有何不同?
  7. python实现简单爬虫百度首页_python实现简单爬虫功能的示例
  8. 1024程序员节:除了高薪,你还有什么理由坚持做程序员?
  9. LeetCode 437. 路径总和 III
  10. 关于Spring核心配置文件中的各项主要配置
  11. 打印机 计算机 usb,来古计算机-打印机端口自动识别成 USB大容量存储设备(USB mass storage device)...
  12. 拒绝百万年薪的郭盛华,如今自立门户,再创辉煌!
  13. python图片合成的示例
  14. InfluxDB使用HTTP的API编写数据
  15. ubuntu 20.04安装各类软件
  16. 3DSMAX中英文对照大全(从A-Z分类)
  17. iphone有什么软件测试信号,iphone12信号测试-iphone12信号实测
  18. 求解斐波那契数列(Fibonacci Numbers)算法居然有9种,你知道哪几种吗?
  19. 达梦数据库除法保留小数
  20. 日本推出《进击的巨人VR》线下体验|互联网行业公会

热门文章

  1. 配置telnet和SSH
  2. webpack 处理CSS
  3. thymleaf th:text 和 th:utext 之间的区别
  4. php后台守护进程+进程信号处理
  5. JQuery设置checkbox的值,取checkbox的值,设置radio的值,取radio的值,设置下拉选select的值,取select的值...
  6. 二.ubuntu14.04 3D特效设置
  7. “chaos”的算法---之哈希表(HASH)算法详解
  8. 在Qt4中使用QPersistentModelIndex传递QModelIndex
  9. 线程同步 阻塞 异步 非阻塞(转)
  10. (转载)JSON.stringfy()和JSON.parse()的作用