简 介: 本文讨论了基于MIMXRT1064单片机智能车系统的设计,对其机械结构、电路原理、赛道识别、图像识别以及方向、速度控制策略等内容进行了介绍。本设计车模选选择了竞赛指定提供的 C车模,并依据车速快且稳的要求,对原车模的机械结构进行了改装和调整;传感器采用数字摄像头总钻风,以适应智能车在不同光线下的高分辨率;智能车将摄像头检测到的赛道信息发送给单片机,单片机采用赛道识别算法,控制电机及舵机执行相应任务。系统选用编码器检测智能车的实时速度,以经典的PID算法控制智能车的速度和方向完成赛道任务;使用Open ART,在其硬件上编写并运行神经网络完成图像的识别,并将信息发送至单片机,控制智能车运行及激光亮灭,完成识别任务。同时,为了更好地监测小车行驶过程中的状态,系统在调试过程中使用了ZigBee无线模块、多功能调试助手等调试工具,及时对系统的硬件和软件进行了调整。
\

学 校:中国地质大学(武汉)
队伍名称:2021地大乘风队   
参赛队员:汤柏辉、李业敏、舒俊
带队教师:赵 娟、吴涛      

第一章 引言


  全国大学生智能汽车竞赛是以“立足培养、重在参与、鼓励 探索、追求卓越”为宗旨,鼓励创新的一项科技竞赛活动。竞赛要求在规定的汽车模型平台上,恩智浦半导体公司、英飞凌公司等的微控制器作为核心控制模块,通过增加道路传感器、电机驱动模块以及编写相应控制程序,制作完成一个能够自主识别道路的模型汽车。

  此项竟赛设计的知识面广学科交错例如、模式识别、传感技术、电子、电气、计算机、机械等多学科,其中又主要包括,模型的建立、机械结构的制作与调整、PID控制,反馈的建立,传感器检测、图像处理等各专业知识。几个月来的经历,培养了我们电路设计、软件编程、系统调试等多方面的能力,锻炼了我们知识融合、实践动手的能力,最重要的是锻炼了我们的心志。这些对我们今后的学习、生活以及工作都有着重要的实际意义。

第二章 智能车系统总体设计


2.1系统框图及系统介绍

  智能车以MIMXRT1064微控制器为控制单元;通过总钻风摄像头MT9V034获取赛道灰度图像,对图像进行识别,判断赛道信息和小车所处位置;舵机通过连杆机构控制前面两轮转向,使用位置式PID算法控制舵机转角;编码器检测智能车的实时速度,使用增量式PID控制算法调节后面两轮电机的转速,实现了对车运动方向和运动速度的闭环控制。通过优化算法和整定参数,提高智能车的行驶稳定性和速度。图像识别时,通过OpenART获取图像,经过基于硬件平台的神经网络运算,判断图像的所属类别并完成对应任务。另外,通过LCD显示图像及状态信息,使用无线数传将图像发送至电脑上位机,以辅助调试。

▲ 图2.1 整体方案

2.2车模改进

  根据本赛对车速快而稳的要求,本系统的整体布局做了以下几个方面的改进:

(1) 电池放在车子后面,有利于重心分布和增加后轮的摩擦力。
(2) 舵机竖直放置,加长舵机臂,方便控制,减少反应时间。
(3) 用轻便坚固的碳纤杆作为摄像头杆的材料。
(4) 摄像头安于车体的中前部,减少摄像头的盲区的同时可以看得更远。
(5) 降低底盘高度,提高稳定性。

第三章 机械结构设计


  本系统所采用C车模。下面从前轮定位、舵机安装、后轮驱动与差速调节、传感器安装与选用、车模加固及重心降低,车轮固定等方面对C1车模的改造进行介绍。

3.1 前轮定位的调整


  车辆在高速过弯时,转向舵机的负载会因为车轮转向角度增大而增大。为了尽可能降低转向舵机负载对前轮的安装角度,本系统对前轮定位进行了调整,使车辆直线行驶更稳定,转向更轻便,转向后能自动回正,减少轮胎和转向系零件的磨损。前轮是转向轮,它的安装位置由主销内倾、主销后倾、前轮外倾和前轮前束等 4个参数决定,反映了转向轮、主销和前轴等三者在车架上的位置关系。

  经过一段时间的调试,我们发现车子由于机械损耗会出现转向沉重、发抖、跑偏、不正、不归位或轮胎单边磨损、偏磨等不正常磨损现象,这时就需要对前轮进行重新定位。前轮定位做得好才能保障汽车直线行驶的稳定性,转向轻便和减少轮胎的磨损。因此需对赛车的前轮转向模块进行测试实验,联合转向舵机的获取标定数据,并结合相应的转向理论进行调整。

  在实际调试中,我们发现适当增大内倾角的确可以增大转弯时车轮和使车转向更灵活,减小因摩擦不够而引起的转向不足的情况。由此可见,对前轮定位是必要的。

3.1.1 主销后倾

  主销后倾是指前轮主销在车模的纵向平面内(小车的侧面有一个向后的倾角γ,即主销轴线与地面垂直线在车模在纵向平面的夹角,称为“主销后倾角”。采用主销后倾,车模在车轮偏转后会产生一回正力矩,纠正车轮偏转。可通过增减黄色垫片数量来改变,我们采用的主销后倾角大概为 3 度。

▲ 图3.1主销后倾示意图

3.1.2主销内倾

  前轮主销在车模的横向平面内向内倾斜一个β角,即主销轴线与地面垂直线在车模的横向断面内的夹角,称为“主销内倾角”(见图 3.3)。 主销内倾角β也有使车轮自动回正的作用。当转向轮在外力作用下发生偏转时,由于主销内倾的原因,车轮连同整个车模的前部将会被抬高;外力消失后,车轮在重力作用下恢复到中间位置。另外主销内倾还会使主销线延长线与赛道的 交点到车轮中心平面的距离减小,同时转向时赛道作用在转向轮上的阻力矩也会减小,从而减小转向阻力,使转向轻便,灵敏。

  轮胎调整为倾斜以后直线行走的时候是轮胎内侧着地,而当过弯的时候,由于惯性车体会要向弯道外侧倾斜,而这时候的外侧轮胎如果倾斜角度事先调整得当则正好可以胎面着地,从而使车辆在弯道获得最佳抓地力。而如果事先把轮胎装成是完全垂直于地面的话,尽管直线行驶的时候轮胎是胎面着地,而到弯道就会变成轮胎外侧着地了,那样将大大减小轮胎与地面的有效接触面积,从而导致弯道时抓地力大幅降低。主销内倾角不可过大,否则在直道和弯道时均使用轮胎内侧,导致轮胎严重磨损,抓地力极低。

  由于赛道一般会设有连续弯道,车模需在高速下连续转弯,因此本系统将车模主销内倾调为8°左右。

▲ 图3.2主销内倾示意图

3.1.3前轮前束

  前束是转向灵敏度与稳定性的权衡。前束不可以无限度增大,太大了的话,直道行驶时车轮与地面发生的就不是滚动摩擦,而是滑动摩擦,轮胎磨损将急剧增大,且会导致阻力加大,降低直道速度。过度减小,会导致稳定性降低,车辆
  抖动,难以操控。为了增加车子的转向性能以及满足阿克曼转弯原理,本系统将车子的前束调教为大概5°左右。

▲ 图3.3车轮前束示意图

3.2前轮转向能力与舵机的安装

  对于舵机的安装,我们对舵机摆杆的一系列参数分析计算得出的较精确高效的工作参数,并通过多组实验得出符合智能车在高速情况下稳定运行。 舵机摆杆是将舵机的旋转运动转换成横摆运动的一种机构。在智能车比赛里,通过它将舵机转矩传递到连接轮子上面的横拉杆,实现轮子的左右转动,从而实现转向。转向在智能车比赛中是至关重要,而摆杆的设计直接关系到智能车转向灵敏度。

舵机转矩=摆杆作用力*摆杆长度

  通过公式可以得出:拉杆作用力越大,反应越灵敏,转向速度越快;转矩一定时,摆杆越长,作用力就越小,所以摆杆又不能太长。经过实验,本设计选择舵机摆杆的长度在30mm比较合适。同时最终的转向机构还应该尽量满足符合阿克曼转向理论,依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大大约2~4°,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,这样可以使车辆在过弯时转向轮处于纯滚动状态,减少过弯时的阻力,减小轮胎的磨损。

▲ 图3.4舵机转向原理

▲ 图3.5舵机安装效果

3.2.1解决左右不对称问题的方案

  在调试的过程中,本小车曾在很长的一段时间内,车体在行进过程中处于左右不对称的情况。也就是说,在左转弯,右转弯的时候,同样的前瞻和PID参数,总是一个切弯,一个不切弯,严重影响到车速及其稳定性。经过不断的摸索,最终发现主要原因在于车模底盘的细微形变。因此本系统将转向机构的内外倾角与车模底盘进行了一定的调节,同时又精确的调节舵机连杆的距离,做到多处高度对称,最终解决了这个问题。

3.2.2舵机频率与舵机摆臂的限制关系

  为了增快舵机的响应速度,前期我们的舵机频率一直设定在100Hz。在调车的中后期,车速提高到一定程度时我们发现,在某些急弯舵机本应该打死却没有打死,导致一直跑出赛道。在排除了软件的原因后,经过多次试验,最终发现是舵机频率太高导致扭力减小,和摆臂的长度不匹配,急弯无法摆动摆臂。在试验了减小舵机频率和减小摆臂长度两种方案后,最终决采用50Hz控制舵机,保持摆臂的长度,解决了急弯舵机打不死的问题。

3.3编码器的安装

  速度传感器一般可以选择对射式光栅或光电编码器。对射式光栅的重量轻,阻力小精度也高,然而光栅暴露在外界容易受到外界光线或粉尘等的影响,导致计数不准确;而光电编码器就不存在此类问题。所以最后本系统选择了编码器,该编码器线数512线,可以达到很高的精度。在安装编码器的时候要保证有合适的齿轮咬合。

  此种咬合完美的原则是:两个传动齿轮轴保持平行,齿轮间的配合间隙要合适,过松容易打坏齿轮,过紧又会增加传动阻力;传动部分要轻松、顺畅,容易转动。判断齿轮传动是否调整好的一个依据是,听一下电机带动后轮空转时的声音。声音刺耳响亮,说明齿轮间的配合间隙过大,传动中有撞齿现象;声音闷而且有迟滞,则说明齿轮间的配合间隙过小,咬合过紧,或者两齿轮轴不平行,电机负载加大。调整好的齿轮传动噪音小,并且不会有碰撞类的杂音。根据编码器的机械参数,本设计采用合适的编码器支架来使编码器与电机适当地咬合在一起。

▲ 图3.6编码器安装

3.4摄像头的选择安装及固定

  为了降低整车重心,需要严格控制总钻风像头的安装位置和重量。我们采用轻巧的铝合金夹持组件并用碳纤维管作为安装总钻风的主桅,这样可以获得最大的刚度质量比,整套装置具有很高的定位精度和刚度,使摄像头便于拆卸和维修,具有赛场快速保障能力。

3.5车模的加固以及车模重心的降低

  在符合官方规定的前提下,采样硬连接,使用连接件连接车身和摄像头两个部分以获得理想的效果,使车模重心降到最低,又不至于坡道处刮到赛道。用502粘合轮胎与轮箍的外接触处,以防止转向时出现轮胎和轮毂脱离而失去抓地力的情况。电池的位置也在查阅资料和实践后得出的,以四六比例配重的位置,以达到前后轮转向能力的一致性,得到最好的控制效果。车子前端加防撞保护,增强车子防撞能力。车模固定如图所示:

第四章 硬件电路系统设计与实现


  本系统的硬件设计力求在保证车体稳定工作的基础上,使其更高效、简洁。

4.1总体方案选择

  本次竞赛车模采用12.6V航母锂电池供电,经过电池保护板后为主控和驱动供电。主控上集成了多路5V,3.3V,6V稳压电路,为核心板,外设以及舵机供电,激光发射为OPENART自带的PWM接口驱动;驱动模块采用12V供电,经降压处理后为隔离芯片供电。整个系统的电路框图如下所示。

▲ 图4.1系统整体电路图

4.2各部分电路

  主控设计:主板上设置了核心板插座,编码器接口,舵机接口,PWM信号输出接口,OPENMOVIE信号接口,OLED插座,无线调参模块接口,陀螺仪接口,云台控制接口,按键,拨码开关等外设。原理图如下:

▲ 图4.2核心板引脚配置

▲ 图4.3主板外设接口

  舵机稳压电源模块为TPS565201芯片进行稳压处理,此芯片完全可以满足舵机电流需求,避免了由于电流不足导致舵机打角缓慢打角不充分的问题。原理图如图4.4所示。

▲ 图4.4舵机电源模块

  5V稳压模块采用TPS565201芯片进行稳压处理,其为RT1064以及其它需5V电压外设供电,同时为3.3V降压输入。原理图如图4.5所示。

▲ 图4.5 5V稳压模块

  3.3V稳压模块由AMS1117-3.3V芯片进行稳压处理,本主控我们采用两个AMS1117-3.3V芯片给OPENMOVIE和其它外设供电,确保了摄像头不会因为电源问题造成图像采集缺失等问题。其电源输入是经过TPS565201进行降压后再输入的,避免了压差过大导致芯片工作不稳定的情况,同时TPS565201过大电流足够支持相关外设的电流需求。原理图如图4.6所示。

▲ 图4.6 3.3V稳压模块

  为在调试过程中调试方便,我们在主控板上添加了3个LED灯以及5个按键,原理图如图4.7所示。

▲ 图4.7按键及LED灯

  电机驱动设计:

  电机驱动采用半桥驱动方案。来自CPU的PWM信号经过缓冲器芯片后输入半桥驱动芯片,该芯片采用12V电压控制的MOS开启,从而控制电机转动。下面为各部分详细分析:
  缓冲芯片与电流检测芯片所需3.3V电压为ASM1117-3.3V提供。MOS的12V开启电压为电源提供,原理图如下:

▲ 图4.8隔离芯片及3.3V稳压模块

▲ 图4.9电流检测模块

  PWM信号经缓冲器后输入半桥驱动芯片IR2302。其具有极快的动态相应速度,还具有电源欠压保护和关断逻辑。半桥驱动电路图如下:

▲ 图4.10左驱动电路

▲ 图4.11右驱动电路

4.3 小结

  硬件电路基本要求是稳定能用,在这个基础上再从原理图的绘制到 PCB 的布局布线寻找各个能提高性能的细节。另外电路板的形状大小要和车模机械结构相适配,保证电路稳定的同时也要保证良好的机械结构。

第五章 软件系统设计与实现


  高效稳定的软件是智能车平稳快速移动的基础。本系统使用总钻风摄像头来获取赛道信息,使用OpenART来获取图像信息,图像采集处理就成了整个软件的核心内容。而MCU处理速度有限,如何高效提取所需的图像信息和利用所剩不多的计算资源来完成车体速度和方向的控制就成了我们研究的核心内容。经过不断的尝试和改进,本设计采用了几种巧妙而行之有效的方案,充分利用了MCU的有效时间和计算资源。在智能车的速度和方向控制方面,本系统使用了鲁棒性很好的经典PID 控制算法,配合使用理论计算和实际参数补偿的办法,使智能车达到了稳定快速的移动效果。

5.1方向控制

  方向控制模块用舵机来实现。在图像处理之后,计算道路的实际中心与图像中心的差值,即车的位置偏差。偏差可以反应车的当前相对位置,用PD算法对车的位置偏差进行调控,实现转向控制。PD算法是基于偏差的控制,通过对偏差进行比例P、微分D运算,能有效提高舵机的响应速度,减小稳态误差,提高动态性能,对改善舵机的滞后特性具有极佳效果。在对PD控制进行参数整定时,研究发现采用动态P参数即该参数是关于偏差值的二次函数,可以实现忽略小偏差的同时对大偏差做出迅速响应,达到在弯道曲率大的位置车能够快速响应,在道路曲率小的地方快速平滑稳定的效果。PD算法的结构框图如图5.1所示。

▲ 图5.1 PD算法结构框图

5.2速度控制

5.2.1 PID控制算法介绍

  在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。

  PID控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。将偏差的比例§、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称PID控制器。

▲ 图5.2 PID控制器原理框图

  在计算机控制系统中,使用的是数字PID控制器,控制规律为:
e(k)=r(k)−c(k)e\left( k \right) = r\left( k \right) - c\left( k \right)e(k)=r(k)−c(k)
u(k)=Kp{e(k)+TTI∑j=0ke(j)+TDT[e(k)−e(k−1)]}u\left( k \right) = K_p \left\{ {e\left( k \right) + {T \over {T_I }}\sum\limits_{j = 0}^k {e\left( j \right) + {{T_D } \over T}\left[ {e\left( k \right) - e\left( {k - 1} \right)} \right]} } \right\}u(k)=Kp​{e(k)+TI​T​j=0∑k​e(j)+TTD​​[e(k)−e(k−1)]}

式中:
  k——采样序号,k = 0,1,2…; r(k)——第k次给定值;
  c(k)——第k次实际输出值; u(k)—— 第k次输出控制量;
  e(k)—— 第k次偏差; e(k-1)—— 第k-1次偏差;
  KP——比例系数; TI——积分时间常数;
  TD——微分时间常数; T——采样周期。

  简单说来,PID控制器各校正环节的作用如下:

  • 比例环节:及时成比例地反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。
  • 积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数,越大,积分作用越弱,反之则越强。
  • 微分环节:能反映偏差信号的变化趋势(变化速率),并能在该偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。

  数字PID控制算法通常分为位置式PID控制算法和增量式PID控制算法。

5.2.2位置式PID

  位置式PID中,由于计算机输出的u (k) 直接去控制执行机构(如阀门),u(k)的值和执行机构的位置(如阀门开度)是一一对应的,所以通常称公式(4.5)为位置式PID控制算法。

  位置式PID控制算法的缺点是:由于全量输出,所以每次输出均与过去的状态有关,计算时要对过去e(k)进行累加,计算机工作量大;而且因为计算机输出的u(k)对应的是执行机构的实际位置,如计算机出现故障,u(k)的大幅度变化,会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成严重的生产事故。因而产生了增量式PID 控制的控制算法,所谓增量式PID 是指数字控制器的输出只是控制量的增量△u(k)。

5.2.3增量式PID

  当执行机构需要的是控制量的增量(例如:驱动步进电机)时,可由上式推导出提供增量的PID控制算式。对上述表达式做运算,可得:

u(k−1)=Kp[e(k−1)+TTI∑j=0k−1e(j)+TDT[e(k−1)−e(k−2)]]u\left( {k - 1} \right) = K_p \left[ {e\left( {k - 1} \right) + {T \over {T_I }}\sum\limits_{j = 0}^{k - 1} {e\left( j \right)} + {{T_D } \over T}\left[ {e\left( {k - 1} \right) - e\left( {k - 2} \right)} \right]} \right]u(k−1)=Kp​[e(k−1)+TI​T​j=0∑k−1​e(j)+TTD​​[e(k−1)−e(k−2)]]

Δu(k)=KP{[e(k)−e(k−1)]+TTIe(k)+TDT[e(k)−2e(k−1)+e(k−2)]}\Delta u\left( k \right) = K_P \left\{ {\left[ {e\left( k \right) - e\left( {k - 1} \right)} \right] + {T \over {T_I }}e\left( k \right) + {{T_D } \over T}\left[ {e\left( k \right) - 2e\left( {k - 1} \right) + e\left( {k - 2} \right)} \right]} \right\}Δu(k)=KP​{[e(k)−e(k−1)]+TI​T​e(k)+TTD​​[e(k)−2e(k−1)+e(k−2)]}

=KPΔe(k)+KIe(k)+KD[Δe(k)−Δe(k−1)]= K_P \Delta e\left( k \right) + K_I e\left( k \right) + K_D \left[ {\Delta e\left( k \right) - \Delta e\left( {k - 1} \right)} \right]=KP​Δe(k)+KI​e(k)+KD​[Δe(k)−Δe(k−1)]

式中:

Δe(k)=e(k)−e(k−1)\Delta e\left( k \right) = e\left( k \right) - e\left( {k - 1} \right)Δe(k)=e(k)−e(k−1)

KI=KPTTI;KD=KpTDTK_I = K_P {T \over {T_I }};\,\,\,K_D = K_p {{T_D } \over T}KI​=KP​TI​T​;KD​=Kp​TTD​​

  上式称为增量式PID控制算法,可以看出由于一般计算机控制系统采用恒定的采样周期T,一旦确定了KP、TI 、TD,只要使用前后三次测量值的偏差,即可求出控制增量。

  增量式PID具有以下优点:
(1) 由于计算机输出增量,所以误动作时影响小,必要时可用逻辑判断的方法关掉。
(2) 手动/自动切换时冲击小,便于实现无扰动切换。此外,当计算机发生故障时,由于输出通道或执行装置具有信号的锁存作用,故能保持原值。
(3) 算式中不需要累加。控制增量△u(k)的确定仅与最近k次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。

  但增量式PID也有其不足之处:积分截断效应大,有静态误差;溢出的影响大。使用时,常选择带死区、积分分离等改进PID控制算法。

5.3识别图像处理

  模型的部署常见的有以下两种思路:一是量化为nncu这是通过nncu工具将训练好的h5模型进行量化转化。二是量化为tflite。这直接使用tensorflow将h5模型转化为tflite模型,并量化实现。经过测试,我们最终选用了第二种方案,量化效果较好。

▲ 图5.3 量化工具

5.4 模型设计

5.4.1 模型结构

  模型主要由4种子模块构成:

① 基本的特征提取单元:Conv2D+BatchNormalization+ReLU6。

  Conv2D后立刻接上BatchNormalization减少了训练时的梯度消失,同时训练完成后可以将bn层融合到conv层中减少计算量;ReLU6限制了输出的范围,便于后续进行int8量化。

② 降采样和正则化:MaxPooling2D+SpatialDropout2D。

  最大池化算是常用降采样方式;通道dropout随机丢弃整个特征图,提升通道间的独立性,同时降低过拟合。

③ 空间注意力单元:x*sigmoid(conv(x))。

  由于识别图像仅在Openart的识别范围中中占据小部分区域,使用注意力单元帮助网络更好的提取特征。

  ④ 分类头:MaxPool2D+Dense

④ 分类头:MaxPool2D+Dense

  最后一层特征图大小为55256,并在Dense层将结果分为13分类:0~9、动物、水果、其他。

  此外建立模型的代码中使用超参数width来控制模型的宽度,经过不同参数的选取测试,发现当width=0.5时,可以在计算速度和模型精度上取得较好的平衡。

5.4.2 数据集的制作

  对于数字,官方仅提供了十张标准的数字图片,如果直接使用OpenArt-mini采集实际数据,不仅工作量大,而且背景单一,可能出现更换场地后识别效果下降的现象。所以我们使用COCO开源数据集作为背景,并将标准数字图片随机贴图到背景图上的方式生成数据集,结合数据增强手段。
  对于动物、水果、其他,做法也与数字相同。

5.4.3模型训练

  训练步骤基本参照官方训练方案,仅将模型替换成自己搭建的模型。仅使用数据增强得到的图片用于训练集,而采集少量实录数据作为测试集。两个数据域有一定的差异,可以更好的看出模型和数据增强的有效性。

5.5赛道图像处理

  摄像头作为智能车的眼睛,拥有比电磁更为远的前瞻,可以让小车运动时对赛道元素的判断更有预见性,也更便于硬件对小车进行控制[1]。而摄像头的核心,又在于巡线算法的设计。只有准确地识别出赛道边界与中线,才能获得较为准确的赛道偏差,从而进行相对应的控制,使小车跑得快而稳定。
  本章以下对摄像头的巡线算法设计做简要的介绍。

  图像的分辨率为 188*80,每一个坐标点存着一个数值,代表该点的颜色。
  以下为具体的赛道元素识别算法设计。

5.5.1直道搜索边线

  自下而上地从图像中间往两边搜索赛道边界点,将左右边界分别存入左右边界数组,中线根据左右边线计算得出,得到的图像即为基础的赛道边界识别情况,如下图。

5.5.2转弯处理

  此处以右转弯为例,左右转弯识别方法相同。

  在该帧图像中,检测到左右边界的坐标值从图像的左下往右上变化,收拢于图像边界之上,也就是纵坐标减小的时候,横坐标逐渐变大(为防止图像的边界为锯齿状产生振荡递增,变大的次数需要累计计数到指定值),则判定为右转弯,将中线重写,以贴合实际的中线曲线,同时给出右转弯标志位。

5.5.3 十字路口处理

第一步:搜索构成十字的四个拐点,分别搜左(右)下拐点,搜到了左(右)下拐点的前提下才搜左(右)上拐点。 根据拐点处的赛道边界横坐标变化大的特征,下拐点处往上数个坐标处会使得赛道边界与图像边界重合,据此特征识别下拐点。上拐点的识别同理,连续的赛道边界与图像边界重合结束后,往上的边界横坐标变化大(左边界迅速增大,右边界迅速减小),根据此特征标记上拐点。
第二步:根据识别到的四个拐点,做出一个矩形区域,通过循环检测区域内黑色像素点的个数,同时记录总像素点数,求出黑色点的比例,当比例小于指定值,即识别为全十字,同时给出十字标志位。
第三步:根据左(右)边上下两个拐点的位置信息,计算出两点所处直线方程。然后将上下两个拐点之间的边界横坐标重写,从而实现补线。

5.5.4 环岛

  此处以左环岛为例,左右方法大致相同。

(1)入环前期部分

  在此帧图像中,检测到右边界有从右下向左上延伸的趋势(累计计数到一定值即可判定为真),同时检测到左边界有一点连续丢线。此时可用 for 循环定位到上下两个拐点,然后将左边界(与中线)修正如下图。检测到多帧图像有此特征,即给出左环岛标志位,准备入环。

(2)入环中期部分

  在此帧图像中,已经接收到了入环前期部分得到的左环岛标志位。而此时的图像中已经没有了下拐点,直接将识别到的上拐点连接到图像最左下角,即修正左边界。

(3)入环后期部分

  赛道右边界的趋势为从下往上走的同时向横坐标减小。与中期图像相比,图像的左下角没有丢线,此时直接把左边界的上拐点连接到右边界最低点进行右边界修正,然后修正中线。

(4)环岛内部处理

  由于小车在环岛内部时的图像与转弯图像无差异,所以环岛内部的处理即为上述的转弯处理方法。如下图所示:

(5)出环前期部分

  出环岛时,前期的图像如下,此时根据图像左边界的丢线情况,获取到一个动态的纵坐标值,将右边界修正。同时将中线直连到所得左边界最高处从而获取赛道偏差。

(6)出环后期部分

  在出环前期部分,小车始终处于转弯状态,待小车转弯结束对准出环路口的时候,图像如下。此时只需要检测到赛道左边界的上拐点,然后将其直连到图像左下角,即可完成左边界修正,然后修正中线。小车行驶过此路段后,左环岛标志为清零。

5.5.5 坡道识别

  当检测到当前图像的左右边界均从最下连接到最上时,使用循环对下图中以图像最上方白线长度为长,图像高度为宽的长方形区域进行计数。如该区域内部全为白色像素点,同时长方形面积大于设定的阈值,即判定为坡道,给出标志位。

5.5.6三岔路口识别

  对于三岔入口,可捕获左右两边的两个拐点,然后计算组成这个拐点的两条线段的斜率,满足一定条件即认为识别到了三岔,然后捕获前方的第三个拐点,通过第三个拐点分别与左右两个拐点的连接补线来实现进入三岔路口的方向。出去三岔路口也是同理,且遵循“左进左出,右进右出”的原则。

第六章 软件调试与开发工具


  整个智能车是一个复杂的系统模型,所以在开发中使用合适有效的调试工 具进行测试与调试显得尤为重要。为此使用了 TF 卡存储和在线调试两种方法,并且结合 EEPROM 掉电不丢失数据的特性进行数据保存,在调试中收到了很好的效果。

6.1 MDK

  程序开发在 Keil uVision5 MDK-ARM IDE 下进行, MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,而且功能强大,能够满足大多数苛刻的嵌入式应用。

  MDK-ARM 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件 支持就可以模拟各种 ARM 内核、外部设备甚至中断的软件运行环境。从中可以了解和评估 IAR EWARM 的功能和使用方法。

▲ 图6.1 MDK

6.2 Pycharm

  Pycharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。

▲ 图6.2 Pycharm

6.3 OpenMV

  OpenMV IDE是用于 OpenMV Cam 的首要集成开发环境。它具有强大的文本编辑器、调试终端和带直方图显示的帧缓冲区查看器。OpenMV IDE 使您可以轻松地对 OpenMV Cam 进行编程。它成本低易拓展,开发环境友好,除了用于图像处理外,还可以用Python调用其硬件资源,进行I/O控制,与现实世界进行交互。

▲ 图6.3 OpenMV IDE

第七章 车模主要参数说明


致谢


  毫无疑问,这段经历对每位参赛队员来说都是难忘的,它不仅使我们更深入地了解所学专业,让我们学到了很多在课堂上根本就学不到的知识,也打开了视野,增长了见识,为我们以后更好地服务社会打下了坚实的基础;不仅使我们在理论上对自动化这个领域有了全新的认识,而且在实习能力上也得到了提高,真正地做到了学以致用。

  在刚接触赛题时,我们对自己能否完成它曾表示怀疑。可是,现实的脚步声却是那么地清晰、有力。在一次次理论与实习相结合的过程中,在队友们的通力配合下,我们从无数次的失败中吸取了宝贵的经验教训,而且随着时间的推移,意志也得到了磨练,恐惧心理也逐渐地消失了。我们时刻提醒自己,唯有不断努力,才能与时俱进。

  总之,这趟智能车之旅的意义,已不再单单是一个比赛这么简单,而是预示着我们向专业大门迈出了一大步,也表征了我们曾经都为了一个国赛梦、一个更快更强的智能车梦拼尽全力。在此,首先要感谢卓晴老师用一篇篇微信推文给我们答疑解惑,感谢组委会为我们搭建了这个美好的竞赛平台。其次,感谢学校对我们的大力支持,如果没有学校给我们提供的场地和经费支持,比赛也很难做下去;当然,取得这样的成绩更离不开老师的指导与帮助,老师把自己的时间、精力都放在我们身上,时刻监督我们,这样我们才能一鼓作气从校赛撑到现在,从未放弃过。最后,感谢我们自己坚持到了最后,不论结果如何,我们都是赢家!

参考文献


[1] 卓晴,黄开胜,邵贝贝.学做智能车 [M].北京:北京航空航天大学出版社.2007.
[2] 邵贝贝.单片机嵌入式应用的在线开发方法[M].北京:清华大学出版社,2004.
[3] 张军.AVR单片机应用系统开发典型实例[M].北京:中国电力出版社,2005.
[4] 王晓明.电动机的单片机控制[M].北京:北京航空航天大学出版社,2002.
[5] 阎石.数字电子技术基础[M].北京:高等教育出版社,2000.
[6] 谭浩强著.C程序设计[M].北京:清华大学出版社,2003.
[7] 孙楠.嵌入式智能小车的设计与实现[D].辽宁:辽宁师范大学,2009.
[8] 孙青.基于嵌入式控制系统的自动导引小车设计与实现[D].南京:南京理工大学,2010.
[9] 张文春.汽车理论 [M].北京.机械工业出版社.2005.
[10] 殷剑宏,吴开亚.图论及其算法 [M] .中国科学技术大学出版社,2003.
[11] 沈长生.常用电子元器件使用一读通[M].北京. 人民邮电出版社.2004

■ 源代码

#include "headfile.h" static int Device_Init(void)
{ mt9v03x_csi_init(); ips200_init(); KEY_Init(); LED_init(); icm20602_init_spi(); MotorInit(); flash_init(); return RT_EOK;
}
INIT_DEVICE_EXPORT(Device_Init); /** * @description: 应用初始化 * @author: TLS * @Date: 2021-07-05 00:57:07 */
static int App_Init(void)
{ pit_init();                   //初始化pit外设 pit_interrupt_ms(PIT_CH0, 1); //1ms,速度环
// #if USE_CC // if(use_cc) pit_interrupt_us(PIT_CH1, 100); //100us,电流环
// #endif NVIC_SetPriority(PIT_IRQn, 2); //设置中断优先级 范围0-15 越小优先级越高 四路PIT共用一个PIT中断函数 airturn_init(); control_init(); display_init(); openart_mini_init(); return RT_EOK;
}
INIT_APP_EXPORT(App_Init); #include "control.h" extern uint8 order; void control_entry(void *parameter)
{ SPEED_DEC_COE = 0.2; //0.25 MAXSPEED_SET = 130; UPHILL_SPEED = 130; GARAGE_SPEED = 30; MAXSPEED_SET_FORHILL = 100; MAXSPEED_SET_FORNORMAL = 130; MAXSPEED_SET_FORISLAND = 130; MAXSPEED_SET_FORFORK = 130; MAXSPEED_SET_FOR_SEARCH_APRILTAG = 20; MAXSPEED_SET_FOROUTFORK = 100; PRESIGHT_COE_NORMAL = 20; PRESIGHT_COE_START = 40; PRESIGHT_COE = 20; while (1) { if (mt9v03x_csi_finish_flag && (ParameterPage == 0)) { mt9v03x_csi_finish_flag = 0; threshold = OTSU(MT9V03X_CSI_W, MT9V03X_CSI_H, mt9v03x_csi_image); ThresholdSegment(mt9v03x_csi_image, threshold, MT9V03X_CSI_H, MT9V03X_CSI_W); static uint8 clean_once = 0; if (menu_status != menu_status_last && clean_once == 0) //拨码开关切换防止清屏不完全 { clean_once = 1; show_photo = 0; ips200_clear(IPS200_BGCOLOR); //清屏 } else if (menu_status == menu_status_last && clean_once == 1) { clean_once = 0; } if (menu_status != menu_status3) { ModeDesicion(); ActionGOGOGO(); SteeringController(); check_openart(); if (OledNextPage == 2 || OledNextPage == 3) { if (show_photo == 1) { ips200_displayimage032_zoom1(Threshold_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H); } else if (show_photo == 2) { ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H); } // rt_thread_mdelay(2); } } else { rt_thread_mdelay(30); } } rt_thread_mdelay(5); //50 }
} int control_init(void)
{ rt_thread_t tid; //创建显示线程 优先级设置为31 tid = rt_thread_create("control", control_entry, RT_NULL, 10 * 1024, //10 11,        //11 30); //启动显示线程 if (tid != RT_NULL) { rt_thread_startup(tid); } return RT_EOK;
} 

● 相关图表链接:

  • 图2.1 整体方案
  • 图3.1主销后倾示意图
  • 图3.2主销内倾示意图
  • 图3.3车轮前束示意图
  • 图3.4舵机转向原理
  • 图3.5舵机安装效果
  • 图3.6编码器安装
  • 图4.1系统整体电路图
  • 图4.2核心板引脚配置
  • 图4.3主板外设接口
  • 图4.4舵机电源模块
  • 图4.5 5V稳压模块
  • 图4.6 3.3V稳压模块
  • 图4.7按键及LED灯
  • 图4.8隔离芯片及3.3V稳压模块
  • 图4.9电流检测模块
  • 图4.10左驱动电路
  • 图4.11右驱动电路
  • 图5.1 PD算法结构框图
  • 图5.2 PID控制器原理框图
  • 图5.3 量化工具
  • 图6.1 MDK
  • 图6.2 Pycharm
  • 图6.3 OpenMV IDE

智能车竞赛技术报告 | 智能车视觉 - 中国地质大学(武汉) - 2021 地大乘风队相关推荐

  1. 智能车竞赛技术报告 | 全向行进组 - 沈阳工业大学 - 找不到北队

    简 介: 本文设计的智能车系统以沁恒CH32V103R微控制器为核心控制单元,通过车体上方摄像头以及车体前方的电磁传感器检测赛道信息:通过1024线迷你正交解码编码器检测模型车的实时速度,反馈给微控制 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 智能车竞赛技术报告 | 单车拉力组-大连海事大学-同舟拾队

    简 介: 本文设计的智能车以STC16F40K128最小系统板为系统核心控制,通过陀螺仪MPU6050读取车身角度以及通过编码器对电机转速的控制,调节S3010舵机控制转向,从而实现车在一定速度下保持 ...

最新文章

  1. C语言 经典编程100
  2. 一道很熟悉的前端面试题,你怎么答?
  3. Android学习——SharedPreferences
  4. node-webkit中使用sqlite3(MAC平台)
  5. 关于ajax表单提交.serialize()
  6. java的OutOfMemoryError: PermGen space实战剖析
  7. .arx 与此版本的 AutoCAD 不兼容。
  8. ST-LINK官方驱动下载方法
  9. win10如何设置锁屏后不熄屏
  10. 天津大学仁爱学院2014计算机系毕业晚会,天津大学仁爱学院什么专业好
  11. 面试问离职原因,怎么说才好?
  12. 另类数据的全面解析与24种场景应用!
  13. Android优雅的ui倒计时,Hurry - 一款颜值超高的日历+倒计时 APP - Android 应用 - 生活 - 【最美应用】...
  14. Vue 安装echarts-gl引入vue报错
  15. 【题解】【PTA-Python题库】第1章-3 输出“人生苦短,我学Python” (10 分)
  16. JOIN US | 京东云技术精英招聘
  17. Java是什么?为什么要学习Java?Java有哪些特点?
  18. 机械加工工艺规程的制订
  19. Andrei Alexandrescu的SD2C大会演讲主题
  20. 什么是DTO 什么是KYC

热门文章

  1. selenium之窗口操作
  2. 从零学React Native之13 持久化存储
  3. Elmah 日志记录组件
  4. 测试工具–super-mack
  5. RabbitMQ启动参数具体含义
  6. .NET 中关于 TypeCode 和枚举类型的问题
  7. ubuntu server中的一些小知识(个人收集贴)
  8. WPF 动态模拟CPU 使用率曲线图
  9. Flutter持久化存储之文件存储
  10. 又做出行系统又组建车队,雷诺-日产、Transdev的三方联盟要发大招了