我们采用 RT-Thread来对代码进行开发和运行,极大的提高了开发的效率,任务调度的功能可以让我们极大的提高利用 CPU的效率,提高了摄像头的帧率,提高了车辆前进的上限,且在各个方面能够轻松的切换任务,实实在在的减少了不必要的代码算力浪费和代码开发的速度。
- 第一章,叙述本设计的研究背景,对智能车技术发展状况进行了阐述,得出本设计的主要研究工作和论文结构安排。第二章,智能车系统总体设计,先介绍设计思路,进一步简述本设计的系统结构,最后展示了智能车的整车布局情况。
- 第三章,设计与优化机械结构,其中包括基于阿克曼转向原理的转向结构优化,得到结构合理的转向梯形结构,并优化其他结构部分。
- 第四章,硬件电路的设计与优化,重点介绍了 RT1064最小系统部分,电源部分,视频信 处理部分,驱动电路部分,速度检测部分。
- 第五章,路径识别是视觉导航的关键技术,运用差比和算法检测出赛道两条黑色边界线,经过特殊处理得到赛道中心边界线,进而完成路径识别和决策规划。还介绍了如何运用 OpenArtmini实现功能和任务。
- 第六章,本章主要介绍对于速度,方向的控制,简要介绍了 PID控制的方法。
- 第七章,重点介绍了如何完成动物水果动物以及 Apriltag码的识别。
- 第八章,重点介绍了如何对 RT-Thread的移植和运用。第九章,重点介绍了 RT-Thread操作系统的创新使用
- 第十章,总结。
第二章 系统总体设计
2.1系统概述
智能车的核心单元和 OpenARTmini的核心单元都是采用了恩智浦公司推出的 32位微控制器 RT1064。其采用 ARM-Cortex-M7芯片内核,芯片频率为 600Mhz,是 STM32F103系列的 8倍多,有 1M片内 SRAM和 4M片内 FLASH和丰富 IO口
智能车系统的工作原理:
摄像头自动循迹识别智能车系统硬件分为 6大模块:主控制器模块、电源模块、赛道信息采集模块、智能视觉识别模块、方向控制模块、速度控制电路模块,摄像头自动循迹智能车系统硬件整体设计框图如图 2.1所示。主控制器模块采用恩智浦公司推出的 RT1064系列的 32位微控制器 NXPRT1064作为智能车嵌入式系统的核心控制单元,是整个摄像头智能车的“大脑”,完成各项任务的分配与协调。电源模块负责提供各子模块所需的电压。赛道信息采集模块采用摄像头,通过 MT9V03X总钻风采样灰度图,将得到的数据储存在二维数组中,通过路径识别算法提取偏差。智能视觉识别模块采用在 OpenARTmini上部署神经 络模型识别数字水果和动物,然后再将识别信息传回小车主控模块,再由主控模块判断下一步的行为。
方向控制模块使用的是 S3010转向舵机,该舵机转向灵活、反应速度快且力矩较大,通过赛道中心线部位与小车位置的偏差,由相应控制算法控制舵机灵活转弯。通过 PID算法以及灵活调整 PID参数,通过编码器读到的数值进行一定运算得到现场速度。停车由摄像头采集图像内是否遇到斑马线然后判断黑白跳变条数来决定。
第三章 机械安装
3.1智能车整体参数调校
智能车的整体参数,都对整个智能车系统的稳定运行起着至关重要的作用,通过对小车的布局,尽量保证小车左右平衡,以及寻找一个合适的重心,保证小车既能够可靠地抓牢地面,又能够对前轮舵机,后轮电机有较快的响应。机械的变化可以提升小车的速度上限,另外,机械的稳定性非常重要,因此要尽量保证小车既能够可靠地抓牢地面,又能够对前轮舵机,后轮电机有较快的响应。
3.2前轮倾角调节
3.2.1主销内倾
主销在转向轴线上向内倾斜,主销轴线与地面垂直线在赛车横向断面内的夹角称为主销内倾角。主销内倾角也有使轮胎自动回正的作用,当汽车转向轮在外力作用下发生偏转时,由于主销内倾,则车轮将整辆车抬起,在外力消失后,车轮就会在重力作用下力图恢复到原来的中间位置,主要在低速时可利用内倾回复转向。
3.2.2主销后倾
主销后倾角的作用是当汽车直线行驶时,若转向轮受到外力作用而发生偏转,汽车会转向。这时,后倾角会使路面对车轮产生一个侧向反作用力,使车轮回正,从而保证在中高速行驶中汽车直线行驶的稳定性,适当的加大主销后倾角可以帮助转向轮自动回正,可有效扼制转向器的摆振。
3.2.3前轮前束调节
通过车轮中心的汽车横向平面与车轮平面的交线与地面垂线之间的夹角,称为前轮外倾角,前轮外倾可以抵消由于车的重力使车轮向内倾斜的趋势,减少赛车机件的磨损与负重,保证车辆行驶性能,前轮在滚动时,其惯性力自然将轮胎向内偏斜,抵消轮胎偏斜的力,从而减小磨损
3.2.4车轮外倾角
轮外倾角是指通过车轮中心的汽车横向平面与车轮平面的交线与地面垂线之间的夹角,对汽车的转向性能有直接影响,它的作用是提高前轮的转向安全性和转向操纵的轻便性。在汽车的横向平面内,轮胎呈 “八”字型时称为 “负外倾 ”,而呈现 “V”字形张开时称为正外倾。如果车轮垂直地面一旦满载就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。所以事先将车轮校偏一个正外倾角度,一般这个角度约在 1°左右,以减少承载轴承负荷,增加零件使用寿命,提高汽车的安全性能。
模型车提供了专门的外倾角调整配件,近似调节其外倾角。由于竞赛中模型主要用于竞速,所以要求尽量减轻重量,其底盘和前桥上承受的载荷不大,所以外倾角调整为 0°即可,并且要与前轮前束匹配。
3.3车模重心
在完成车模的搭建后,通过测量小车轮胎位置的质量测量出整个车模的质心分布。从而保证整个小车的稳定性,车体重心的位置对赛车加减速性能、转向性能和稳定性都有较大的影响,同时还应该尽量降低车模重心高度,防止车模行驶时发生侧翻
3.4舵机安装
舵机的安装方式有立式和卧式两种,经过分析,我们沿用经典的立式装法。舵机是具有较大延迟特性的器件,其延迟与其转角大小成正比,但如果能使舵机转过一个较小的角度而使车轮转过一个越大的角度,则会大大提高舵机过弯的响应速度。这不仅与舵机的安装方式有关,而且也与舵机输出臂的长度有关。
硬件系统是整个智能车系统可靠运行的基础,更是软件程序得以稳定运行的基础,所以硬件系统的设计是非常重要的,我们的硬件系统主要包括电源管理模块,电机驱动模块,舵机驱动模块,电磁循迹模块,主要使用三块板子分别为母版,电机驱动以及电磁。
4.2.电源管理模块
再通过如上电路将 5v降为 3.3v,其中 u6使用的是 rt9013-33gb
4.3单片机
4.5电磁模块
因为在路上有时仅凭摄像头会出现小误差导致偏移出赛道的情况,可能会冲撞导致损坏摄像头,所以我们使用电磁模块,来有效防止这一情况的出现,电路图如下:
第五章 图像信息获取及处理
5.1赛道信息采集
赛道信息获取是智能车稳定快速运行的根本保障。赛道信息通过 MT9V03X总钻风摄像头进行采集, MT9V03X总钻风摄像头采集速率最高可达每秒 498帧,它具有 FPS可调,全局快门、高动态范围( High dynamic range)、可进行自动曝光等优点。同时 MT9V03X总钻风摄像头采集的是灰度图,具有更多的赛道信息。
上表列出了 4种情况
- 情况 1:黑点为 30,白点为 100,我们通过差比和公式计算并放大100倍,得到的结果为 53。
- 情况 2:白点 1为 90,白点 2为 100,我们通过差比和公式计算并放大 100倍,得到的结果为 5。
- 情况 3:黑点 1为 30,黑点 2为 35,我们通过差比和公式计算并放大 100倍,得到的结果为 7。
通过对这三种情况进行分析,我们可以看到当选取的两个点,像素值差距较大时计算出来的值比较大,像素值差距较小的时候计算出来的值比较小,那么我们就可以设置一个阈值,当差比和计算出来的值超过这个阈值的时候(这个阈值就需要自己上赛道观察白点与黑点的值,然后再自己计算一下这个黑点与白点的差比和值是多少,然后计算出来的值乘以 0.7来作为阈值,也可以根据自己的测试对这个阈值再稍加调试),我们认为找到了一个黑点与一个白点。
- 情况 4:可以看得出来白点与黑点都比较暗,但是通过差比和计算出来的值却还是和正常图像计算出来的值差距不大,
这样我们就可以通过使用差比和提高我们的稳定性,不像二值化那样光线稍有变化二值化图像就会跟随着变化。所以,使用这样的方法也相当于提高了对光线的适应能力。
5.2消除寻线误判
对于利用差和比寻找赛道边界来说,判断出何处为赛道边界其实是容易误判的,举例说明,当寻找右边界时,假如处于弯道,或者车身不正进入直道时候,图片就会如下图 1所示,可以发现,左边界和有边界在远处一定距离已经被扫线到一处去了,因为差比和算法,每次都是从中间开始往两边扫线的,当赛道已经完全处于中心点外便会导致赛道误判。于是进行优化的方式是通过每次找到边界之后,对下一次起始的点做偏移修正,并且对差和比中加入方向的概念,通过判断像素值的大小一定是从大到小来进行做限制条件,这样同时可以减少运算工作量,同时完美解决了这种现象的发生,提高了寻找中线的稳定性。
5.3算法优化
简单使用差比和对每一行像素点扫线寻找赛道边界后会发现在弯道曲率较大的时候,会出现单边寻找赛道边线丢线的情况,如下图所示,左边边线已经丢失了,蓝色为计算出的赛道中线,导致中线,明显畸变,会导致计算出来的偏差位置过小,导致舵机打角过小,从而向外侧冲出赛道。解决办法有两个,一种为修改摄像头角度,另一种是通过算法修正。
可以发现,即使现在图像发生了严重的丢线情况,赛道中线也能被精准的定位。效果良好,极大的提高了弯道过弯时,舵机打角的准确性。
5.5灰度图中的八领域寻线应用
传统的八领域寻线都是将图像二值化之后再进行寻线,其基本思想是:遍历图像找到第一个非零像素点,那么这个点一定是边界点。设这个点为起始点 x,顺时针查找该点八邻域内遇到的第一个非零像素点 x’(点 x’也为边界点)。令x=x’,再进行邻域内的顺时针查找,查找的起点为刚刚 x到 x’过程中 x’前一个零点。
第七章 图像识别
7.1 OpenART mini整体代码思路
OpenARTmini兼容了几乎所有的 Openmv的库文件,对图像的处理只要调用相应的 api即可,十分的简介方便。智能视觉组赛题的识别要求包括三项,数字识别, Apriltag码识别以及水果动物的分类,这三个任务我们都基于官方建议的 OpenARTmini进行实现,早期也使用了龙邱的 openmv来实现,但由于仅支持 nncu神经 络模型并不支持 tf模型,并不如 OpenARTmini方便,于是后期更换了摄像头。
部署神经 络模型有两种方式,一种是官方介绍的,通过 nncu工具将 h5模型量化转换进行部署,还有一种就是通过 tensorflow将 h5模型转换为 tflite模型,再部署到 OpenARTmini上。
最后我们采用第二种方案,首先我们通过学习谷歌发布的 moblienetv3.0轻量型模型,改进了自己的 tensorflow模型,显著提高了模型的识别效率和准确率,之后通过爬虫从互联 上爬取了足够的动物水果的图片,通过大量的训练和参数调试,最终得到了良好的识别动物水果的模型,最后通过 tensorflow官方学习了模型量化的方法,转换为 tflite模型之后部署到了摄像头上,做到了即使是识别逐飞官方数据集之外的动物水果图片,在复杂背景之下也能做到对靶标类型正确识别。
相同的对数字靶标也做了相似的模型训练,训练了一个十一分类 tflite神经 络模型,同样取得成效。
7.2数字识别
首先会打开摄像头的打光灯来保证光线恒定,再通过 openmv的色块二值化函数 find_blobs,通过颜色的设置将紫色矩形边框二值化显示出来,同时运行 find_rects来寻找矩形框,因为二值化图形的处理非常迅速,整个寻找边框的过程效率大大提升达到了每秒近 40fps,再次通过对矩形边框的限制条件,如正方形和大小显著,来准确定位矩形位置,获得矩形边框位置后,再通过二值化之前的图像,定位矩形图片位置并且进行神经 络模型识别,通过识别之后向小车发送数字的信息。整个过程只需要大概 200ms,可以迅速的识别并通过三叉路口,唯一遗憾的是,真实赛场上因为光线的变化,在远离靶标的时候,摄像头的打光灯不能很好的照射到靶标上,于是识别三叉路口会存在找不到色块的问题,最终采用了停车策略,来保证稳定通过三叉路口,但在光线良好的赛场,通过三叉路口的速度将会很快。
同样的动物和水果的识别也和数字识别一样,但会是在识别边框到中心位置之前一直返回矩形边框的中心位置,直到到达图片的中心,发送指令让小车停下并识别靶标,识别完成后再通过,打靶或者直接通过。
-2RT-Tread源码可从 RT-Tread官 ->资源->下载处免费下载,如图 9-2所示
8.1移植
1)首先将 rt-tread源码放到逐飞工程目录的 Libraries里,如图 8-3所示
3)将 Libraries->rt-tread-> src中的 C文件全部添加进 rttread_src分组中,如图 8-5所示
5)将内核部分汇编支持的文件 Libraries->rt-tread->libcpu->arm->cortex-m7中的 c文件和 context_rvds.S(如果是用的 IAR则应该添加 context_iar.S)添加进 rttread_lib分组中,如图 8-8所示
6)加载组件文件 Libraries->rt-tread-> components-> finsh,将里面的 c文件全部添加到 rttread_componets分组中如图 9-8所示
8)将刚刚添加文件的头文件路径包含进来,如下图 8-10所示 …Librariesrt-threadbspimxrtimxrt1064-nxp-evk …Librariesrttherad_librariesincludelibc
…Librariesrttherad_librariescomponentsfinsh
…Librariesrttherad_librariesinclude
-10把汇编的头文件路径也包含进来如下图 8-11所示
…Librariesrt-threadlibcpuarmcortex-m7
9)将 RT-Tread头文件包含进来,如下图 9-12所示
11)修改 board分组下的 board.c文件将 <rthw.h>头文件和 <fsl_sdmmc_event.h>头文件包含进来,在 board.c文件中添加如图 8-14所示内容
继续在 board.c文件中添加三个函数,如下图 8-16和 8-17所示
12)打开 sdmmc分组下的” fsl_sdmmc_event.c”文件将 SysTick_Handler函数注释掉再打开 seekfree_libraries分组下的” common.c”和” common.h”将里面 HardFault_Handler( void)函数和 MemManage_Handler( void)函数以及 PendSV_Handler(void)函数的声明和定义都注释掉即可
打开 sdmmc分组下的 “fsl_sdmmc_event.c”文件,添加 void sdmmc_tick_handler(void)函数,在”fsl_sdmmc_event.h”头文件里面声明该函数, c文件里的实现方式如下图 8-19所示
13)再次编译之后发现还是会出现两个错误,这是分散加载文件错误导致的
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!