智能车竞赛技术报告 | 智能车视觉 -

学 校:中国计量大学
队伍名称:赛博-10   
参赛队员:陈 峰     
洪晨辰   
毛华斐   
带队教师:金小萍   
陈东晓   

 

第一章


■ 1.1 概述

全国大学生智能汽车竞赛是由教育部高等自动化专业教学指导分委员会主办的一项以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。

该竞赛以汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的科技创意性比赛。比赛要求在大赛组委会统一提供的竞赛车模,竞赛官方推荐的诸多微控制器中选择了RT1064作为核心控制单元,自主构思控制方案及系统设计,包括传感器信号采集处理、控制算法及执行、动力电机驱动、转向舵机控制等,最终实现一套能够自主识别路线,并且可以实时输出车体状态的智能车控制硬件系统。我们从二月份开始经过接近6个月的制作与调试,终于完成了目前的智能小车的制作。期间我们合作共勉,学习开发调试软件的使用、主控芯片控制、控制原理、编程语言等方面的知识,在对机械进行了调整的基础上,对小车软件进行调试,在发现问题后努力解决问题,进一步优化智能小车的机械、软件、和传感器的方案,最终形成了现在的稳定快速的智能小车。

■ 1.2 文本框架

本文较为详细的介绍了制作智能模型车的过程和各项技术。具体章节内容安排如下:

  • 第一章 引言。介绍本竞赛的背景及相关要求;
  • 第二章 智能车系统整体设计。在本竞赛相关的技术及规则要求下建立整个系统的理论概念模型,并将整个系统划分为几个实现具体功能的功能模块,共同协作实现智能车系统的整体目标;
  • 第三章 硬件结构设计与实现。分析各个功能模块实现特定功能的细节,选择最优方案,并根据所选方案完成电路的设计。包括信号采集传感器电路、稳压供电电路及驱动电机与舵机的控制电路等;
  • 第四章 机械结构的调整与优化。根据汽车构造的基本原理,通过反复调整测试,确定出智能车车模主销后倾角,主销内倾角,前轮前束,地盘离地距离等的最佳状态,增加智能车运动过程中的稳定性,使其能在智能汽车控制器的控制下有效、快速以及稳定的行驶。
  • 第五章 软件算法的设计与实现。介绍了基于电感感应自主循迹智能车控制程序的设计。主要描述了路径识别算法的设计、舵机转向控制算法以及车速控制算法的设计;
  • 第六章 系统调试。介绍软件开发的环境,以及对各部分的调试方法。总结智能车的技术参数,总结准备智能车竞赛以来的工作,分析智能车设计制作过程中的得与失。
  • 第七章 介绍车模的一些参数
  • 第八章 总结

 

第二章 能车整体设计


■ 2.1 智能车系统分析

根据第十六届全国大学生智能汽车竞赛的竞赛规则,以恩智浦半导体的跨界处理器RT1064微控制器作为智能车的主控芯片、组委会统一提供的 C 型车模、微控制器开发软件 KEIL5 和在线调试工具等为基础,通过参赛队自行设计基于微控制器控制的模型车在封闭跑道上自主循迹运行。跑道为 45cm 宽的 PVC,中心有连续通电漆包线作为循迹引导线,并且限定跑道相邻障碍间距、坡道高度、长度等参数。智能车要能自主识别引导线并控制车体沿着跑道运动,在保证智能车两个轮胎不出跑道的前提下,双车跑完一圈的时间越短越好。 智能车系统是以 RT1064 微控制器为主控单元,配合循迹用传感器、电机、舵机、电池以及相应的工作电路,以达到能自主循迹并控制模型车以尽可能高的速度稳定在跑道上运动的目的。本智能车制作的主要思路是利用电感来判别前方的跑道轨迹,并将信息采集到 RT1064 微控制器中,同时将车速信息也传输到 RT1064 微控制器中,在 RT1064 微控制器判断处理后,控制转向舵机、动力电机协调工作,完成模型车的运动控制。

在这期间,由电源模块为各个模块提供足够功率、平稳的电能。特别在调试阶段,利用无线串口通讯模块实时传输智能车运行过程中的各项所关心的核心数据在上位机上显示,为调试过程提供足够可供分析使用的数据。车载的 IPS 显示屏也能为设置智能车初始运行数据提供可视界面,方便智能车状态数据的设置。智能车的控制系统主要包括电源管理模块、MCU 模块、电机驱动模块、舵机控制模块、图像采集模块,AI识别模块、速度测量模块、无线通讯模块,激光打靶模块、IPS显示和按键输入模块等。在整个系统中,由电源管理模块实现对其他各模块的电源管理。

其中,对微控制器、测速电路、IPS显示模块、AI识别模块电路提供提供 5V 电压,对舵机提供 4.5V~7.5V 可调电压,对无线串口通讯模块、图像采集模块提供 3.3V 电压。本模型车是后轮驱动,通过自制全桥驱动电路,控制动力电机的正向运行和反向制动,为智能车的运动提供强劲的动力和制动力。路径识别模块则采用图像识别处理循迹方案。采用逐飞科技总钻风摄像头。由于赛道与周围环境有一定的对比度,故可以通过图像处理去计算误差并且进行对应的元素识别,经 MCU 处理判断小车所处赛道的状态,从而做出相应的控制策略。转速测量模块编码器则安装在车后部与电机齿轮进行咬合转动,它会测量出模型车行驶过程中的当前速度,为设定车速的调整提供依据。通过按键设定模型行驶过程中一些较重要的参数,如:图像阈值、车身控制速度等,并在IPS显示屏上直观的显示出来。无线串口传送模块发送传感器检测值和模型车的速度等参数,以方便对整车进行调试。系统框图如下图。

▲ 图2.1 系统框图

▲ 图2.1 系统框图

 

第三章 件设计


硬件是基础,只有一个良好、稳定的硬件环境才能保证小车能平稳快速的行驶。鉴于这个原因我们在满足各个要求的情况下,尽量使设计的电路简单。

■ 3.1 MCU模块

考虑到我们对单片机的熟悉程度以及经济方面的各项因素,我们决定采用 RT1064 单片机作为我们的 MCU 控制模块。i.MX RT 系列跨界处理器将高处理性能与高实时性相结合,可支持下一代需要超高集成度和高安全性的互联网应用,同时又具有 MCU 的易用性,以及非常实惠的价格。

作为应用处理器和微控制器(MCU)的领先供应商,恩智浦独具优势,其推出的全新嵌入式处理器系列可以满足消费者对安全型高性能智能产品日益增长的增强用户体验需求。性能最高的 Arm Cortex-M7 - 3020 CoreMark/1284 DMIPS 600 MHz实时的低延迟响应高达 512 KB 的紧耦合内存(TCM),最快的实时响应,延迟低至 20 ns。低功耗:集成 DC-DC 转换器,实现业界最低的动态功耗(24 MHz 低功耗运行模式)
封装引脚图如下:

▲ 图3.1 核心板引脚图

▲ 图3.1 核心板引脚图

3.2 电源管理模块

电源管理系统是硬件系统的基础,通过对组委会提供的 7.4V 3000mAh 锂电池进行 DC-DC 稳压转换后对微控制器、测速电路、激光打靶、AI识别模块、IPS显示模块提供 5V 电压,对舵机提供 4.5V~7.5 的可调电压,对无线通讯模块(车载部分)、图像采集模块提供 3.3V 电压。

舵机的4.5V~7.5V可调电压以及电路的5V稳压均由SY8205FCC芯片进行稳压,原理图如下:

▲ 图3.2 电源管理模块原理图-1

▲ 图3.2 电源管理模块原理图-1

▲ 图3.3 电源管理模块原理图-2

▲ 图3.3 电源管理模块原理图-2

3.3V稳压电路我们采用RT9013-33GB芯片进行稳压。

注:摄像头使用了部分BOOT引脚,需要使用CR控制上电时序,这里对摄像头供电由单片机的CR引脚进行使能。电路原理图如下:

▲ 图3.4 电源管理模块原理图-3

▲ 图3.4 电源管理模块原理图-3

主板整体PCB如下图:

▲ 图3.5 主板PCB整体图

▲ 图3.5 主板PCB整体图

3.3 电机驱动电路

智能车速度是取得好的成绩的重要条件,由此电机驱动模块的重要性也就不言而喻。直流驱动电机控制直流电机的转速方向和转动速度。驱动芯片我们选择了2184和MOS 管搭建全桥驱动,为强劲的动力提供了保障,使加减速更快更迅猛。彻底决定了驱动的问题,而且能非常好的实现了过弯减速、直道加速的效果。

驱动 PCB 图如下:

▲ 图3.6 驱动PCB整体图

▲ 图3.6 驱动PCB整体图

3.4 本章小结

硬件电路部分需要做到认真仔细无纰漏,从原理图的绘制到 PCB 的布线,都要尽善尽美,做好细节问题。另外电路板的形状大小要和车模机械结构相适配,保证电路稳定的同时也要保证良好的机械结构。

 

第四章 械结构设计与优化


任何的控制算法和软件程序都是需要一定的机械结构来执行和实现的,因此在设计整个软件架构和算法之前一定要对整个车模的机械结构有一个感性的认识,然后建立相应的数学模型。从而再针对具体的设计方案来调整赛车的机械结构。本章将主要介绍赛车车模的机械特点和调整方案。 整车的设计我们本着轻巧的原则,同时最大可能地降低重心且重心稍靠后。合理设计电路板的形状,机械零件的大小及形状,安排好车的整体布局,使之既美观,又简便。为增强模型车的抓地力,使模型车具有良好的转向性能,我们对前束、主销内倾角、后倾角、避震等我们都进行了精细地调整。

4.1 前轮定位调整

调试中发现,在赛车过弯时,转向舵机的负载会因为车轮转向角度增大而增大。为了尽可能降低转向舵机负载,对前轮的安装角度,即前轮定位进行了调整。车轮定位角度是存在于悬架系统和各活动机件间的相对角度,保持正确的车轮定位角度可确保车辆直线行驶,改善车辆的转向性能,确保转向系统自动回正,避免轴承因受力不当而受损失去精度,还可以保证轮胎与地面紧密接合,减少轮胎磨损、悬架系统磨损以及降低油耗等。汽车悬架系统主要定位角度包括:车轮外倾、车轮前束、主销后倾、主销内倾等。

1)车轮外倾:在过车轮轴线且垂直于车辆支承平面的平面内,车轮轴线与水平线之间所夹锐角。即由车前方看轮胎中心线与垂直线所成的角度,向外为正,向内为负。其角度的不同能改变轮胎与地面的接触点,直接影响轮胎的磨损状况。并改变了车重在车轴上的受力分布,避免轴承产生异常磨损。此外,外倾角的存在可用来抵消车身载重后,悬架系统机件变形所产生的角度变化。外倾角的存在也会影响车的行进方向,因此左右轮的外倾角必须相等,在受力互相平衡的情况下不致影响车辆的直线行驶,再与车轮前束配合,使车轮直线行驶并避免轮胎磨损不均。四轮定位仪测量车轮外倾角的范围为±10°。

  1. 车轮前束:车轮前束,同一轴两端车轮轮辋内侧轮廓线的水平直径的端点为等腰梯形的顶点,等腰梯形前后底边长度之差为前束。当梯形前底边小于后底边时,前束为正,反之则为负。车轮的水平直径与车辆纵向对称平面之间的夹角为前束角。由于车轮外倾及路面阻力使前轮有向两侧张开做滚锥运动的趋势但受车轴约束,不能向外滚动,导致车轮边滚边滑,增加了磨损,通过前束可使车轮在每瞬间的滚动方向都接近于正前方,减轻了轮毂外轴承的压力和轮胎的磨损。四轮定位仪测量车轮前束角的范围为±6°。

▲ 图 4.1车轮前束图

▲ 图 4.1车轮前束图

  1. 主销后倾:主销后倾,过车轮中心的铅垂线和真实或假想的转向主销轴线在车辆纵向对称平面的投影线所夹锐角为主销后倾角,向前为负,向后为正。主销后倾角的存在可使车轮转向轴线与地面的交点在轮胎接地点的前方,可利用地面对轮胎的阻力产生绕主销轴线的回正力矩,该力矩的方向正好与车轮偏转方向相反,使车辆保持直线行驶。后倾角越大车辆的直线行驶性越好,转向后方向盘的回复性也越好,但主销后倾角过大会使转向变得沉重,驾驶员容易疲劳;主销后倾角过小,当汽车直线行驶时,容易发生前轮摆振,转盘摇摆不定,转向后转向盘自动回正能力变弱,驾驶员会失去路感;当左右轮主销后倾角不等时,车辆直线行驶时会引起跑偏,驾驶员不敢放松转向盘,难于操纵或极易引起驾驶员疲劳。四轮定位仪测量主销后倾角的范围为±15°。

▲ 图 4.2 主鞘后倾图

▲ 图 4.2 主鞘后倾图

  1. 主销内倾:主销内倾,定义为在同时垂直于车辆纵向对称平面和车辆支承平面的平面内,由真实的或假想的转向主销的轴线在该平面上的投影与车辆支承平面的垂线所构成的锐角。主销内倾角的作用,是使车轮在受外力偏离直线行驶时,前轮会在重力作用下自动回正。另外,主销内倾角还可减少前轮传至转向机构上的冲击,并使转向轻便,但内倾角不宜过大,否则在转向时,会使轮胎磨损加快。主销内倾角越大前轮自动回正的作用就越强烈,但转向时也越费力,轮胎磨损增大;反之,角度越小前轮自动回正的作用就越弱。四轮定位仪测量主销内倾角的范围为±20°。

▲ 图 4.3 主鞘内倾图

▲ 图 4.3 主鞘内倾图

4.2 转向梯形结构

参考汽车采用的转向梯形结构,设计出针对模型车的转向机构——后置双梯形转向机构。该转向机构左右转向对称,能够快速响应转向动作,并使左右转向轮最大程度地符合阿克曼转向原理。

4.3 后轮差速调整

在车实际跑的过程中,我们发现,后面两个轮的相对松紧程度,也就是差速对拐弯有很大的影响。差速太紧,则拐弯容易甩尾,速度快的时候很容易甩出去,但是差速如果太松,虽然会改善转弯性能,但是严重影响了直线上的加减速,而且齿轮的咬合也不是很好,对齿轮会有一定的损坏。所以,后面两个轮子的相对松紧程度要适中,经过多次的调试,我们得出了比较满意的效果。当然,实际还需要根据不同的赛道和车的机械性能进行相应的微调。在调解差速上也没有一个确定固定的完美值,整个调节过程都是基于自己的把握,基于自己的车所适应的差速。因此在差速调节上存在着只可意会不可言传的奥妙,因此在差速调节方面也只能说给出这么一种观点,而不能给出很有效的可实施方案,很多东西都需要一个摸索过程,而不是照搬。

4.4 轮胎的使用

轮胎是小车非常重要的部分。由于工艺差别,需要我们多购买一些车模轮胎,挑选出其中无凸起,轮胎表面平整,且能与轮毂紧密贴合的轮胎。一副新的轮胎刚开始使用摩擦力较差,在经过一段时间的磨合后,小车在赛道上行驶时会出现尖锐的声音,这时是轮胎摩擦力较好的时期。用胶水封起来即可。

4.5 车模实物图

▲ 图4.5 车模实物图

▲ 图4.5 车模实物图

4.6 本章小结

本章主要介绍了智能车机械部分的设计和优化。智能车机械结构的性能影响着整个系统的高效性和稳定性,故先进行转向结构的设计,对后置双梯形转向结构优化其结构参数,通过试验测试验证最优参数满足系统要求[5]。在基础之上,确定采用立式方式安装舵机,并设计了舵机的安装结构。最后,对摄像头安装结构、后悬架等其他部分都进行了优化。

 

第五章 统开发及调试工具


5.1 KEIL、PYCHARM编译器

要分析车模在赛道的行驶实时情况必须使用无线传输模块,我们使用的无线模块无须软件控制,既可以当普通的串口线使用,其简单实用,在实验室范围内可以任意个角落都没有盲区。上位机方面我们使用串口助手,配合自己编写好的脚本可以观察小车行驶过程中电感值和舵机 PWM 值的变化,方便对于训练的需求对小车进行调试。只有平时做好准备,这样才会在比赛时做到胸有成竹。

Keil C51 是美国 Keil Software 公司出品的 51 系列兼容单片机 C 语言软件开发系统,与汇编相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil 提供了包括 C 编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行 Keil 软件需要 WIN98、NT、WIN2000、WINXP 等操作系统。如果你使用 C 语言编程,那么 Keil 几乎就是你的不二之选,即使不使用 C 语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

PyCharm 是一种 Python IDE,带有一整套可以帮助用户在使用 Python 语言开发时提高其效率的工具,比如调试、语法高亮、Project 管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该 IDE 提供了一些高级功能,以用于支持 Django 框架下的专业 Web 开发。Keras 是一个由 Python 编写的开源人工神经网络库,可以作为 Tensorflow、Microsoft-CNTK 和 Theano 的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。

Keras 在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度。Keras 支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型。在硬件和开发环境方面,Keras 支持多操作系统下的多 GPU 并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK 等系统下的组件。

Keras 的主要开发者是谷歌工程师 François Chollet,此外其 GitHub 项目页面包含 6 名主要维护者和超过 800 名直接贡献者。Keras 在其正式版本公开后,除部分预编译模型外,按 MIT 许可证开放源代码。

5.2 调试工具

5.2.1 蓝牙无线串口模块与虚拟示波器

我队使用无线蓝牙串口实时采集车辆信息进行调试,无线蓝牙串口使用方便,与串口类似,同时具有小车运行时可进行通信的特性,十分方便。同时,我队使用网上下载的虚拟示波器进行数据的图像化分析,可直观的看出速度控制与舵机控制的效果与变化曲线,强化了调试的能力。

5.2.2 用户界面
鉴于逐飞IPS快速显示的性能,较大的屏幕以及可以显示原灰度图像等特点,我队利用 IPS 显示图像以避免串口传输###
图像导致小车不能正常运行的问题。同时,我队将重要参数显示在 IPS 显示屏上,以方便调试。

 

第六章 径识别与决策规划设计


6.1 程序设计概述

程序与算法是智能车的核心,也是智能车智能的体现,程序设计要求流程清晰、算法高效、稳定、符合实际规律。程序的设计要确定好条件和解的范围,切勿遗漏特定情况或者将算法使用在超越前提条件的情况中。总的来说即控制车模在符合大赛规则前提下,以最短的时间跑完整个赛道并能停在车库内。

▲ 图6.1 程序框图

▲ 图6.1 程序框图

6.2 程序框图

▲ 图6.2 程序流程图

▲ 图6.2 程序流程图

6.3 边界线识别

边界线识别的准确性决定了智能车系统运行的稳定性。要想智能车稳定、快速地行驶,就必须高效、稳定地识别赛道边界线,进而提取出赛道中心线。

6.3.1 赛道边界线提取

提取赛道边界线是整个边界线识别的关键部分,只有正确地提取到赛道边界线,才能正确地控制智能车。沿边跟踪利用赛道连续的特征,且相邻行的赛道边界线位置相差不超过 5个像素,其原理跟动态中线检测基本相同,只是每行扫描起始位置不是根据上一行的中心引导线位置来确定。先从像素矩阵中第一行的中心线位置开始向左右扫描,向左扫描到上升沿即为左边线,向右扫描到上升沿即为右边线,即扫描下一行之前先找到上一行引导线边缘的位置,在找到的上一行左边缘位置向右移动一个安全量作为下一行的左侧扫描起始位置,找到的上一行右边缘位置向左移动一个安全量作为下一行的右侧扫描起始位置,然后在下一行图像中,从左侧扫描起始位置开始向左扫描,当扫描到上升沿即为左边线位置,从右侧扫描起始位置向右扫描,当扫描到上升沿即为右边线位置,依次类推,此检测算法与动态中线检测算法的检测能力一致,但较节省时间。

6.4 赛道类型识别

6.4.1 十字识别

一般判断十字的方法为通过在主循环里面循环判断十字两边的角点,以及两边全白的条件来作为判断依据。如果存在车已经在十字了但没有判别出十字,则放宽判断条件的严格度,如果跑一圈误判次数过多,则将条件的严格度提高,减少错误判断的次数。斜入十字的判断方式与一般十字有所不同,需要把十字条件改为一边的拐点,因为此时另一边在实际情况下是不存在拐点的。同时,也需要注意的一点便是,若将一个拐点作为十字判断条件的话,误判的几率会大大增加。因此,一个稳定的拐点方案十分重要,然而,不仅仅需要稳定的拐点方案,不然便会和环岛路口的判断条件或者车库的判断条件相似,容易引起判断错误。所以,做好状态区分相当重要,如果仍然难以区分,便把区分条件的严格度提高直至合适,如果区分效果好,便说明十字已经可以成功判断。

6.4.2 环岛识别

环岛的识别方法是通过在主循环里面循环判断环岛一开始的角点,作为判断环岛的标记,接着通过黑环进行入环识别,识别成功之后寻找另一个角点,然后给舵机指令使车拐进去即可,若拐不过去则增大舵机拐角直至可以成功入环;之后便是出环识别,若看到同一边的拐点便可以开始给舵机指令进行打角,若拐不过去则增大舵机拐角直至可以成功出环,如果舵机出现拐过头甚至有点超调的迹象的话,便将舵机打角参数下降直至合适。环岛的判别如果都放在主循环里面去判断,则判断失误的可能性就会大大提高,极有可能出现车遇到十字路上就判断出了入环岛状态的误判现象,这是极有可能的事情,所以需要把状态机情况逐一分开并嵌套在一起,如同铁索连舟一样,环环紧扣,提高判断条件的严格度,才能减少误判的次数。检测环岛算法完善的方法是将其他状态识别均关闭,让小车只进行环岛状态机,同时添加蜂鸣器进行辅助,如若小车进行数圈环岛判断执行的过程中,蜂鸣器均相应正常且环岛位置而没有误判的话,便说明环岛判断十分完善且稳定。

6.4.3 坡道识别

坡道的判别主要是通过赛道形状的改变,也就是赛道宽度的改变以及陀螺仪的数据变化来进行判断识别。但是往往车子在过弯或者在过十字之类的赛道元素时,赛道的宽度便会发生一定的改变,以及小车在触碰路肩时可能会导致计算偏差变化。为了避免这些情况的出现,相应作出的处理便是将两个判断条件结合起来提高判断条件严格度,便能稳定判断进出坡道。识别之后设置适当的过坡速度,避免飞坡带来的不确定因素,最后只要在主函数中循环判断是否是坡道状态的条件即可。如果没有坡道判别,那么车子上坡后一旦车速过高,就会产生飞坡的现象,此时落地的车身姿态掌控难度大大提高,因为整辆车都在空中,如果下坡是弯道元素,那么便极有可能出现飞出赛道的情况。但是如果判断出坡道就减速,出坡就加速,那么在整体速度上,小车的速度就相比之下慢了许多,所以相应的措施是设置出坡后便进行一定的加速,判断出坡道了就降低一定的速度,如此一来,在车速不会降低的同时也避免了飞坡带来的风险。

6.4.4 车库识别

车库是去年第十五届智能车大赛新出的元素,其要求是小车必须起跑出库,出库时开始计时,入库结束计时。根据该比赛规则,不难判断出,入库这一元素将是决定该队是否有成绩的重要一环。我们团队的做法是通过识别单边的拐点,识别之后进行入库操作,但是把入库这一个元素和十字或者环岛区别开有不小的难度,我们团队的做法是通过识别另一边的直线来避免十字误判,再通过拐点的情况来区别环岛和入库。如此一来,就能基本区分出入库,十字和环岛这三种状态。此时入库如果拐不过去或者拐的太晚了,那么应把舵机打角增加至合适,加快舵机的反应速度。

6.4.5 三岔路识别

三岔路是今年第十六届智能车大赛新添加的元素,其要求是在三岔路口摆放数字靶标,通过AI识别出数字并判断出奇偶来决定第一次进入三岔路的方向,第二圈则无需识别数字自动进入三岔路口的另一方向,但是国赛由于疫情原因将在线上举行,则去除了三岔路口的数字识别部分,自动选定方向,保持车模与前一次进入三岔路选择的方向不一致即可。

6.5 控制器设计

智能车自主驾驶的性能很大程度上受控制器的影响,要实现路径跟踪和速度策略,就必须设计一个实时、有效的控制器。由于智能车自主驾驶是方向和速度控制的相互协调,所以智能车的跟踪预瞄控制器主要包括有方向控制器和速度控制器。

▲ 图6.4 控制器设计

▲ 图6.4 控制器设计

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

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

▲ 图6.5 PID原理图

▲ 图6.5 PID原理图

▲ 图6.6 PID系数图

▲ 图6.6 PID系数图

6.5.1 舵机控制

舵机是一个位置随动系统,它由舵盘、减速齿轮组、位置反馈电位计、直流电机和控制电路组成。通过内部位置反馈,使它的舵盘输出转角正比于给定的控制信号,因此对于它的控制可以使用开环控制方式。在负载小于其最大输出力矩的情况下,它的输出转角正比于给定的脉冲宽度。舵机控制是控制算法中最重要的方面之一。一旦舵机控制出错,智能汽车就极有可能出界犯规了。因此,平时调车的主要任务之一就是观察舵机,使之控制合理。舵机的控制采取传统的 PD 控制。为了防止把舵机的齿轮打坏,应该对舵机的打角进行限幅处理。

▲ 图6.7 PD控制图

▲ 图6.7 PD控制图

6.5.2 电机控制

智能车的速度控制器采用增量式 PID 控制器,即给直流电机输入控制量的增量,并通过旋转编码器反馈速度形成闭环控制,最后,为了提高智能车速度的快速响应能力,特别地引入 bang-bang 控制提高速度控制器的响应能力。

6.6 AI识别算法的实现

6.6.1 数据集

1、github上逐飞的官方数据集
2、使用opencv对官方数据集进行模糊、旋转等处理形成新的数据集
3、使用openart抓框并保存下来的图片作为最真实的数据集,用以测试模型的效果

6.6.2 卷积神经网络搭建

由于openart运行内存(过大的模型会导致openart内存溢出导致宕机)以及运行效果、运行速率等多方面的限制下,选用keras卷积3层网络;由于识别其他东西时会导致误判,因此需要加一分类others来应对抓错框时的误判;比赛方的要求只是需要识别出动物或水果(奇数或偶数),因此可以将10分类缩减为2分类,大大提高了模型的准确性,因此使用2+1的3分类作为输出层。

由于疫情原因更改了识别要求,加入基础三分类模型,用以初步识别目标为何类图片
模型图如下:

▲ 图6.8 模型图

▲ 图6.8 模型图

6.6.3 模型量化

考虑到tflite相对nncu运行更加顺畅,更加适合openart上的部署,因此使用tflite作为量化模型的工具。

6.6.4 模型部署

将量化后的.tflite文件放入openart的SD卡中,在main.py文件中导入tf库,使用tf.load()函数导入模型,使用classify()函数获取识别结果,对结果进行分析,使用串口将分析后的结果发送给单片机,令单片机做出相对应的指令。

6.7 本章小结

本章主要介绍了智能车控制器的设计。先介绍了控制器的总体框架,其主要包括方向控制器和速度控制器,接着介绍了 PID 控制器的控制原理和特点,然后先从舵机性能的分析出发,进而设计出开环的位置式 PD 方向控制器,然后对于电机,设计出增量式 PID 速度控制器,并引入 bang-bang 控制提高速度控制器的响应能力,设计了根据不同赛道情况的速度决策方案,最终设计出了符合系统要求的跟踪控制器。

 

第七章 模技术参数说明


7.1 车模主要技术参数表

参数名称 参数指标

  • 车模重量 1050g
  • 车模长度 29.5cm
  • 车模宽度 18.0cm
  • 车模高度 28.7cm
  • 传感器种类及数量 总钻风摄像头(1个)
  • 电路电容总量 1235.5uf
  • 赛道信息检测频率 200次/秒
  • 赛道信息检测精度 3mm

 

第八章


智能车竞赛是一个多学科、综合性的比赛,其中设计涉及了控制、传感技术、电子信息、模式识别、汽车电子、机械等多个学科,在整个准备的过程中,我们不仅仅把所学的理论知识应用于实际,还自学了大量的新知识。不仅开拓了我们的视野,同时也使我们的动手能力、运用知识的能力、分析解决问题的能力也有了很大的提高。

制作智能车是一个长期的工程,只有在平时抓牢每一个细节,不放过每一点瑕疵,严格要求车,严格要求自己,不断积累努力,才能够筑起成功的万里长城。艰苦的付出和坚持不懈的努力是制作智能车所必须的精神,所幸有赛博智能车实验室的同学们一路相伴,大家在一起努力一起奋斗的这一段时间是制作智能车过程中最美好的时光。希望学弟学妹们能够继续把赛博智能车实验室的竞速组发扬光大。

再次也特别感谢中国计量大学,感谢学校教务处和学校领导、教授,感谢指导老师陈东晓,感谢队友和实验室的各个同学,感谢杭州电子科技大学、浙江工业大学和哈尔滨工业大学的技术报告,给了我们团队不少的帮助和启发。本文所涉及的一切内容,不仅仅是我们团队的辛勤劳作的结晶,同时还有许多人智慧的光芒,在这里也要特别感谢他们的好想法、好建议、好思路。

最后,衷心祝愿这个智能车竞赛越办越好,越来越有活力。

 

考文献


[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
[7] 沈长生.常用电子元器件使用一读通[M].北京.人民邮电出版社.2004
[8] 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出版社.2004
[9] 张伟等.Protel DXP 高级应用[M].北京. 人民邮电出版社.2002
[10] 张文春. 汽车理论[M].北京.机械工业出版社.2005
[11] 卓晴 李马: 基于磁场检测的寻线小车传感器布局研究. 2009.
[12] 卓晴 黄开胜 邵贝贝. 学做智能车. 北京航天航空出版社
[13]卞家杰,赵强,戚基艳,金嘉琦,邹姗姗.运用 MATLAB 分析基于阿克曼转向梯形的转向模型[J].机械工程师,2019(09)

■ 附录A:(参考代码)

#include "graphics.h"

unsigned char ImageAnalyse[IMG_ROW][IMG_COL];		//分析图像,主要用来给人看看的

Line topc_To_bottom_r;		//固定直线之一
Line topc_To_bottom_l;		//固定直线之一
Line topr_To_bottom_l;		//固定直线之一
Line topl_To_bottom_r;		//固定直线之一
Line L_Island_In;
 //清空画布
void AnlsImgCLS(void)
{
//    if (IMG_DRAW_EN)
//    {
        memset((void *)ImageAnalyse, 0, sizeof(ImageAnalyse) / sizeof(char));
//    }
}

void PreviewPointX(const Point point, const char size)
{
//    if (IMG_DRAW_EN)
//    {
        char t = 0;
        for (t = 1; t <= size; t++)
        {
            if (point.x + t > DRAW_RIGHT || point.x - t < DRAW_LEFT
                || point.y + t > DRAW_BOTTOM || point.y - t < DRAW_TOP)
            {
                return;
            }
            ImageAnalyse[point.y + t][point.x - t] = IMG_WHITE;
            ImageAnalyse[point.y + t][point.x + t] = IMG_WHITE;
            ImageAnalyse[point.y - t][point.x + t] = IMG_WHITE;
            ImageAnalyse[point.y - t][point.x - t] = IMG_WHITE;
        }
        ImageAnalyse[point.y][point.x] = IMG_WHITE;
//    }
}

//画圆
void PreviewCircle(int x0, int y0, int r)
{
    int a = 0, b = r, di = 3 - r * 2;
    while (a <= b)
    {
        ImageAnalyse[x0 + a][y0 + b] = IMG_WHITE;
        ImageAnalyse[x0 + a][y0 - b] = IMG_WHITE;
        ImageAnalyse[x0 + b][y0 + a] = IMG_WHITE;
        ImageAnalyse[x0 + b][y0 - a] = IMG_WHITE;
        ImageAnalyse[x0 - a][y0 - b] = IMG_WHITE;
        ImageAnalyse[x0 - a][y0 + b] = IMG_WHITE;
        ImageAnalyse[x0 - b][y0 + a] = IMG_WHITE;
        ImageAnalyse[x0 - b][y0 - a] = IMG_WHITE;
        a++;
        if (di < 0) di += 4 * a + 6;
        else {
            di += 10 + 4 * (a - b);
            b--;
        }
    }
}

void PreviewPointRect(const Point point, const char len)
{
//    if (IMG_DRAW_EN)
//    {
        int coolen = (int)((len - 1) >> 1);
        int i = 0, cot = (len - 1) * 4;
        int s_x = coolen, s_y = coolen;
        char turn = 0;
        for (i = 0; i < cot; i++)
        {
            if (point.y + s_y <= DRAW_BOTTOM && point.y + s_y >= DRAW_TOP)
            {
                if (point.x + s_x >= DRAW_LEFT && point.x + s_x <= DRAW_RIGHT)
                {
                    ImageAnalyse[point.y + s_y][point.x + s_x] = IMG_WHITE;
                }
            }
            if (turn == 0)
            {
                if (s_y > -coolen)
                {
                    s_y--;
                    if (s_y == -coolen) turn = 1;
                }
            }
            else if (turn == 1)
            {
                if (s_x > -coolen)
                {
                    s_x--;
                    if (s_x == -coolen) turn = 2;
                }
            }
            else if (turn == 2)
            {
                if (s_y < coolen)
                {
                    s_y++;
                    if (s_y == coolen) turn = 3;
                }
            }
            else if (turn == 3)
            {
                if (s_x < coolen)
                {
                    s_x++;
                    if (s_x == coolen) break;
                }
            }
        }
//    }
}

void PreviewLine(const Line *org)
{
//    if (IMG_DRAW_EN)
//    {
        int t;
        for (t = 0; t <= org->endpos; t++)
        {
            if (org->point[t].x <= DRAW_RIGHT && org->point[t].x >= DRAW_LEFT
                && org->point[t].y <= DRAW_BOTTOM && org->point[t].y >= DRAW_TOP)
            {
                ImageAnalyse[org->point[t].y][org->point[t].x] = IMG_WHITE;
            }
        }
//    }
}

void PreviewLineBase(void)
{
//    if (IMG_DRAW_EN)
//    {
        char line, count = 0;
        for (line = DRAW_ROWS - 20; line < DRAW_ROWS; line++)//show base vertical line
        {
            if (count < 5)
            {
                ImageAnalyse[line][DRAW_CENTER] = IMG_WHITE;
            }
            count++;
            if (count > 10)
            {
                count = 0;
            }
        }
//    }
}

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具&#xff0c;无论这些应用是用于服务器&#xff0c;还是图形用户界面&#xff08;GUI&#xff09;或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时&#xff0c;开发人员倾向于认为它是一个简单的步骤&#xff0c;需要读取项目的CMakeLists.txt文件&#xff0c;并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件&#xff0c;Xcode项目&#xff0c;Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图&#xff1a; 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程&#xff0c;沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角&#xff0c;进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后&#xff0c;任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one&#xff1a; //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two&#xff1a; //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1&#xff0c;直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写&#xff0c;Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Beats 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上&#xff0c;所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列&#xff0c;这个系列很全面也很经典。但如果你希望能够快速地入门&#xff0c;这里推荐《Linux 就该这么学》&#xff0c;其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的&#xff0c;但是死活装不上呢&#xff1f; 搜一下&#xff0c;有人提到 “默认安装时‘无线LAN服务’是关闭的&#xff0c;如果需要开启&#xff0c;只需要在“添加角色和功能”中&#xff0c;选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…