锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021

时间:2022-12-03 17:30:00 保鲜传感器sx676a光电传感器

简 介: 本文设计了智能汽车系统RT1064微控制器是核心控制单元,通过车身上方的灰度摄像头检测轨道信息,采用光电编码器检测模型车的实时速度PID 控制算法调节驱动左右电机的速度,实现车辆运动速度和方向的闭环控制。使用OpenArt Mini实现智能识别的摄像头。为了提高模型车的速度和稳定性,使用QT大量的硬件和软件测试工具,如上位机、键盘模块等。实验结果表明,系统设计方案确实可行。

学 校:中南大学
队伍名称:中南大学比亚迪午马2021
参赛队员:龚元昌
何鸿江何鸿江何鸿江
丁佳宁???
带队教师:王击???
陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白帆陈白
???


全国大学生智能汽车竞赛是一项鼓励创新的科技竞赛参与、鼓励探索、追求卓越为指导思想,鼓励创新的科技竞赛。在规定的汽车模型平台上使用竞赛要求STC, Infineon, NXP作为核心控制模块,该系列单片机通过添加道路传感器、电机驱动模块和编写相应的控制程序,完成了一辆能够独立识别道路的模型车。参赛选手的目标是模型车需要按照规则在最短的时间内完成单圈赛道。

第十六届智能汽车的智能视觉组是智能汽车首次将图像识别神经网络融入竞争的尝试。这是一个新的组,对我们来说是一个新的挑战。

在本报告中,我们的小组详细阐述了我们的思想和创、算法、调试、车辆参数,详细阐述了我们的思想和创造力,具体体现在电路创新设计中,以及算法的独特想法,单片机具体参数的调试也让我们付出了艰苦的工作。这份报告体现了我们的努力和智慧,是我们共同努力的结果。

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

1. 智能汽车机械结构


智能汽车的所有硬件和软件程序算法都需要一定的机械结构来执行和实现。因此,在设计整个软件架构和算法之前,有必要对整个模型的机械结构有一个清晰的认识,从而调整和优化具体的设计方案。本着稳定、轻的原则,尽量减少重心,合理设计电路板的形状,安排汽车的整体布局,既美观又实用。

1.1 舵机安装

舵机的安装直接关系到转向问题,对汽车的转向角度和转向响应速度起着关键作用。舵机安装有两种方式,一种是卧式安装,另一种是立式安装。卧式安装是车辆模型的默认安装方式,但这种安装会使左右车轮连杆不等长。与卧式舵机相比,立式舵机更有利于保证线性关系,因此我们选择立式安装。另外,车模的转向是由舵机驱动左右横拉杆实现的。舵机的旋转速度和功率是一定的。为了加快转向机构的响应速度,必须优化舵机的安装位置和力矩延长杆的长度。因此,在安装舵机时,应综合考虑转向机构响应速度与舵机扭矩的关系,通过优化获得最佳转向效果。

▲ 图1-1 舵机安装

1.2 编码器安装

对于汽车来说,需要通过编码器收集速度信息来实现闭环控制,因此编码器的安装也非常重要。我们采用逐飞1024线mini编码器精度高,抗干扰能力强。安装编码器时,确保有合适的齿轮啮合,标准如下:传动轴与电机轴平行。启动电机时,如果发出刺耳的声音,说明间隙太小,有卡齿;如果感觉有明显的迟滞,说明齿轮间隙太大。调整好的齿轮传动结构噪声很小,且不会有卡齿的声音,十分流畅。只有确保齿轮的完美啮合,编码器返回的速度值才能更加真实和稳定。

▲ 图1-2 编码器安装

1.3 云台安装

为了完成视觉组识别任务,确保汽车质量分布均匀,我们在舵机和灰度摄像头之间安装了云台支架,支持两个舵机控制OpenArt Mini转向激光。

▲ 图1-3 云台安装

1.4 摄像头安装

摄像头中心距地面高度31cm,因此,在汽车行驶中,相机杆很容易摇晃。为了减少这种摇晃,我们使用两个细碳杆来支撑主杆,使主杆的力强度不会太大,相机的摇晃幅度大大降低,以确保图像采集的质量。

▲ 图1-4 摄像头安装

1.5 前轮调整

为了保持汽车直线行驶的稳定性,转向轻,使转向轮自动正确,减少轮胎磨损,转向轮、转向节和前轴与框架安装保持一定的相对位置,转向轮定位参数为:主销后倾、主销内倾、前轮外倾、前轮前束四个参数。

1.5.1 主销后倾调整

主销后倾角是指主销轴线相对于车轮中心线向后倾斜的角度。前轮重心在主销轴上。由于主销向后倾斜,前轮重心不在车轮与地面的接触点上,产生离心力。主销向后倾斜形成的离心力可以保证汽车直线行驶的稳定性,帮助车轮自动更正。主销后倾角延长线离地面接触越远,速度越高,离心力越大。在中高速行驶中,保持汽车直线行驶的稳定性。适当增加主销售后倾角可帮助转向轮自动正确,有效抑制转向器振动,使转向变轻,调整主销售后倾角可修复驾驶偏差。

▲ 图1-5 主销后倾

1.5.2 主销内倾调整

主销内倾角是指主销轴相对于车轮中心线向内倾斜的角度。由于主销轴向内倾斜,前轴荷载更接近前轮中心线。主销内倾轴延伸线越近,转向角越大,转向轮越高,车轮的正转矩越大。

▲ 图1-6 主销内倾

1.5.3 前轮外倾调节

前轮倾斜在车轮轴和垂直于车辆支撑平面的平面上,车轮轴与水平线之间的锐角,即轮胎中心线和垂直线的角度,向外为正,向内为负。不同的角度可以改变轮胎与地面的接触点,直接影响轮胎的磨损,改变车辆重量在轴上的力分布,避免轴承的异常磨损。
外倾角的存在也会影响车辆的行驶方向,因此左右轮的外倾角必须相等,在力平衡的情况下不会影响车辆的直线行驶,然后配合车轮前束,使车轮直线行驶,避免轮胎磨损不均匀。

▲ 图1-7 前轮外倾

1.5.4 前轮前束调节

前轮前束是指前轮前端面与后端面在汽车横向方向的距离差,也可指车身前 进方向与前轮平面之间的夹角,此时也称前束角。从上往下看,两个车轮指向的方向在前端指向内称为车轮前束,指向外的则称为车轮后束。前轮前束的作用是保证汽车的行驶性能,减少轮胎的磨损。前轮在滚动时,其惯性力自然将轮胎向内偏斜,如果前束适当,轮胎滚动时的偏斜方向就会抵消,轮胎内外侧磨损的现象会减少。

▲ 图1-8 前轮前束

1.6 轮胎处理

1.6.1 轮胎打磨

车模原有的轮胎花纹比较深,为了增大轮胎与赛道的摩擦力,需要对轮胎进行打磨。我们将轮胎胎皮安装于后轮轮毂,利用电机驱动其旋转,用砂纸来进行打磨,省时省力,也能打磨得更加均匀。需要注意不能将花纹打磨消失,否则摩擦力会下降从而影响转向,也有可能违反相关规定。

1.6.2 轮胎软化处理

车模原有的轮胎材质较硬,所以需要进行软化处理。软化后的轮胎以较高速运行时,在拐弯时轮胎发生形变,接触面增大,可以确保车模的运行状态更加稳定。我们在调车结束后都会把软化剂涂抹在轮胎的表面,并用保鲜膜包裹,持续一周就能看到明显的效果。

1.6.3 涂抹硅橡胶

轮胎经过软化后易于发生形变,也会带来一些不利影响,例如车模在较高速运行时胎皮会因为离心力过大发生脱落,与轮毂的连接不再那么紧密。所以我们在轮毂和胎皮的接触处涂抹了704硅橡胶来粘合胎皮和轮毂,使胎皮在车模运行过程中与轮毂紧密连接,避免脱落情况的发生。

1.7 云台支架设计

云台由一个270度舵机DG-MG92B和一个180度舵机M3512D组成,利用SketchUp进行支架设计,分为两个部分:

第一部分:下接车模底盘,上承270度舵机DG-MG92B。

▲ 图1-9 云台第一部分

第二部分:前接激光、OpenArt Mini,后接180度舵机M3512D。

▲ 图1-10 云台第二部分

 

2. 硬件系统设计及实现


2.1 硬件整体设计

我们学校往届的硬件设计风格是做集成板,即将电驱板、主板、核心板、电磁板布局于一块 PCB 上,十分考验硬件设计能力,虽然轻巧,但是一旦损坏就要整块重做。所以我们队的硬件设计采用主板和电驱板分离的方案。只要保持两个PCB 板的接口一致就可以进行更新换代,更加灵活。

通过对智能视觉组的规则分析可知需要至少一个舵机来实现智能摄像头的转向和一个激光驱动电路。所以相比一般的基础四轮主板电路,我们的智能视觉主板电路额外加入了两个的舵机接口、智能摄像头通讯接口以及激光驱动电路。

2.2 电源管理

电源模块对于一个控制系统来说极其重要,关系到整个系统是否能够正常工作,因此在设计控制系统时应选好合适的电源模块。竞赛规则规定,比赛使用智能汽车竞赛统一配发的标准车模用7.2V 2000mAh Ni-cd供电或者使用锂电池(两节18650,2AH,配备保护板),由于智能视觉组相比基础四轮组任务多,负载的外设更多。我们最终选择了锂电池供电方案。采用2节18650电池串联接保护板作为总电源给主板供电。一节18650电池的规格是3000mAH,30A。电池保护板为20A限流。实物如图2-1所示:

▲ 图2-1 锂电池

2.3 主板设计

主板是智能车核心板和智能车沟通的桥梁,我们采用的核心板为逐飞科技的RT1064 V1.3核心板,排针接口,实物图如图2-2所示:

▲ 图2-2 RT1064核心板

可考虑到系统的可靠性是要求。我们对主板电路设计的所有环节做好各部分的接地、屏蔽、滤波等工作,使本系统工作的可靠性达到了设计要求。主板上有六类电源:总电源(电池电源)、核心板及智能摄像头电源(5V)、5V电源、3V3电源、摄像头电源(3V3)、舵机电源。除了3V3电源其他电源的输出都加入了磁珠进行隔离,增强了稳定性。由于我们的赛道识别采用纯摄像头方案,所以对摄像头的稳定性要求很高,专门开辟了一个3V3电源给摄像头供电。同时,核心板和智能摄像头相当于两个RT1064单片机,工作时我们可以感受到功率高带来的明显的发热,所以为了保证稳定性专门为其开辟了一个5V电源。原理图如下,5V电源稳压采用TPS76850 LDO,最高输入10V,输出电流1A,满足要。3V3电源采用5V转3V3 LDO RT9013-33GB,价格便宜且稳定。舵机芯片采用经典的AS1015。

除此之外还加入了用于上位机调试的无线串口接口以及显示屏接口。

▲ 图2-3 主板原理图

PCB仿真图以及实物图如图2-4和2-5所示:

▲ 图2-4 主板PCB仿真

2.4 电机驱动板设计

我们为了国赛准备了两套电机驱动方案:基于IR2104S的双极性型和基于DRV8701E的使能型。实际测试时发现IR2104S的电机控制要比DRV8701E更硬。所以国赛最终采用了IR2104S的方案。MOS管使用IRLR7843。电驱板上使用74LVC245 8路缓冲芯片隔离主板和电驱,使用SX1308升压芯片为IR2104



放弃的DRV8701E方案的电驱板实物图如下:

▲ 图2-9 DRV8701E电驱

2.5 智能视觉任务外设

为了完成智能视觉组的识别及打靶任务,主板上引出了两个舵机接口以控制二维云台。采用三极管电路控制激光打靶,智能摄像头通过引脚与主板相连进行供电、通讯和控制。即主板起供电作用,云台和激光的控制由智能摄像头完成。激光控制电路原理图如下:

▲ 图2-10 激光电路

激光头功率为5mw,实物图如下:

▲ 图2-11 激光头

使用的智能摄像头为逐飞科技的 OpenArt Mini 摄像头,其主控芯片为 RT1064,具有强大的神经网络部署和运行能力:

▲ 图2-12 OpenArt Mini

 

3. 软件系统设计及实现


3.1 软件整体设计

采用类似于操作系统的开发思路,将小车分为硬件控制和软件控制两部分分别进行初始化和控制。针对小车每个外设(电机、舵机、显示屏、按键等)编写独立的驱动文件,再将定时中断里的控制算法作为类似于线程一样处理进行打开、关闭等操作。显示屏菜单显示和赛道检测算法放在主函数里进行。

3.2 硬件外设控制

主要负责硬件控制的初始化,例如电驱控制引脚、摄像头通讯引脚、显示屏引脚的初始化。

3.3 软件参数控制

主要负责小车基本参数的初始化(例如从Flash读取数据等)以及定时器中断里的算法启停管理。

3.4 小车控制算法

电机控制采用增量式PI控制,实际速度由编码器测量得到(M法)从而控制电机,因为C车模的两个电机的电气参数可能不一致,所以将两个电机分开进行闭环控制

舵机控制采用位置式PD控制,设定打角由赛道检测算法计算出的结果给出,计算出偏差从而给出控制量。
PID控制是工程实际中应用最为广泛的调节器控制方法。问世至今70多年来,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
PID控制原理框图如图:

▲ 图3-1 PID控制原理框图

单位反馈e代表理想输入与实际输出的误差,这个误差信号被送到控制器,控制器算出误差信号的积分值和微分值,并将它们与原误差信号进行线性组合,得到输出量u。

其中,Kp、Ki 、Kd分别称为比例系数、积分系数、微分系数。u接着被送到了执行机构,这样就获得了新的输出信号 ,这个新的输出信号被再次送到感应器以发现新的误差信号,这个过程就这样周而复始地进行。
数字控制系统中,PID控制器是通过计算机PID控制算法程序实现的。计算机直接数字控制系统大多数是采样-数据控制系统。进入计算机的连续-时间信号,必须经过采样和整量化后,变成数字量,方能进入计算机的存贮器和寄存器,而在数字计算机中的计算和处理,不论是积分还是微分,只能用数值计算去逼近。
用矩形数值积分代替上式中的积分项,对导数项用后向差分逼近,得到数字PID控制器的基本算式(位置算式):

其中T是采样时间,为三个待调参数,在实际代码实现算法时,

对位置式加以变换,可以得到PID算法的另一种实现形式(增量式):

3.5 上位机通信

为了便于调试我们专门开发了自己的一套上位机工具:
指令上位机:

▲ 图3-2 指令上位机

图像采集上位机:

▲ 图3-3 图像采集上位机

代码仿真上位机:

▲ 图3-4 代码仿真上位机

 

4. 赛道识别算法实现

4.

4.1 车库

车库是赛道中特征非常明显的元素,扫描一定区域内每一行的黑白跳变点个数,正常赛道的跳变点个数必定小于某一阈值,当超过阈值时就认为识别到了斑马线。

入库过程中斑马线位置的变化会影响扫线,因此我们采用了固定打角及距离直接入库的方法,多次调试后即可精准入库。但此种方法容易受赛道摩擦系数等因素影响,稍有不慎就可能蹭到路肩,对控制方案也有较高要求。

▲ 图4-1 车库元素

4.2 环岛

环岛的识别和处理比较复杂,首先应检测到左侧或右侧有双边黑特域,再验证对边是否无岔口,且边线为向赛道内倾斜的直线,若满足即可能为环岛入口。为防止小车将出口误判为入口,需要一定的限制条件加以区分。
利用黑特域补线执行入环操作,小车驶入环岛后,切换到出环模式,利用基本控制方法过环岛。当小车看到左侧或右侧远岔口时,即可开始出环补线,这时需要适当加大控制量,以免小车冲出赛道。

▲ 图4-2 环岛元素

4.3 三岔

赛道中三角形的黑色大块区域是三岔的显著特征,首先识别到左右两侧都有远岔口,再扫描两个岔口之间黑色点个数所占比例,超过一定值即认为识别到三岔。利用三边黑特域进行补线,执行入三岔操作。同理可以方便地识别三岔出口,这时利用岔口补线,可有效避免三岔复入,且出三岔轨迹比较顺滑。

▲ 图4-3 三岔元素

4.4 十字

小车正入十字时,可以看到左右两侧都有双边黑特域,识别起来比较方便,不过一旦车身倾斜,十字特征和环岛、三岔特征都有很多相似之处,十分容易引起误判,对车身的姿态控制有很高要求,识别十字之后将两边口补线即可很好地驶过十字。

▲ 图4-4 十字元素

4.5 坡道

由于摄像头中心距离地面高度31cm,坡道对于小车而言如履平地,因此我们没有进行特殊处理,但急弯接坡道时小车有可能姿态不正,撞到路肩,也有可能飞出坡道,产生较大的冲击力,容易损坏机械部件,最好还是识别坡道,进行一定的减速处理。

4.6 二维码

二维码也属于特征比较明显的元素,首先从下向上扫描判断赛道中线是否为黑色点,若是再从该行的附近行的中线向两边扫描,记录黑白跳变点个数,大于一定值则可能是二维码。不过上述特征与斑马线完全重合,但二维码对应的赛道左右边界附近应为白色区域,无跳变,可以通过这一特征进行区别。

▲ 图4-5 二维码元素

 

5. AI视觉功能设计及实现


5.1 总体设计

AI视觉组的识别对象有三种:AprilTag、数字以及动物水果。我们采用的策略是除了 AprilTag 有现成的函数可以调用外,针对每一种元素设计一个识别网络。

使用的摄像头为逐飞科技的 OpenArt Mini,其性能优于 OpenMV,且支持神经网络训练。同时 OpenArt Mini 连接着两种外设:云台和激光,直接控制更有利于代码的编写

5.2 训练数据处理及识别

训练集的质量好坏直接关乎于神经网络的识别效果的准确与否。可以说再复杂,有效的神经网络结构被喂不合适的数据后部署在目标场景时效果依然会很差。一般来说,我们得预分析我们要识别的对象,将实际预测的对象作为预测集,最关键的一点就是要尽可能使训练集和预测集满足同一分布。即要识别什么就用什么训练。

当处于训练数据严重不足时(例如数字识别的10张图片),我们可以采用数据增强的方式来扩增数据集,常见的数据增强方法有旋转、平移、高斯噪声、剪裁等。我们主要采用了先加紫框后旋转的方法对训练图片进行处理。因为小车运行时智能摄像头的摇晃可能使抓取的图片有一定的倾斜,符合实际情况。

▲ 图5-1 数据增强后的图片

同时为了增强神经网络的泛化能力,我们在原本逐飞科技默认的神经网络结构中穿插了Dropout环节,在 Dropout 环节中,神经网络将每个隐藏神经元的输出设置为零(概率为 0.5)。 以这种方式“脱落”的神经元不会对前向传播做出贡献,也不会参与反向传播。因此,每次出现输入时,神经网络都会对不同的体系结构进行采样,但是所有这些体系结构都会共享权重。由于神经元不能依靠特定其他神经元的存在,因此该技术减少了神经元的复杂共适应。 因此,它被迫学习更强大的功能,这些功能可与其他神经元的许多不同随机子集结合使用。最后还有一种增强泛化能力的方法就是扩增数据集,我们尝试了编写网络爬虫脚本从网络上爬取了更多的图片扩充了数据集。
基本神经网络结构如图5-2所示:

▲ 图5-2 神经网络结构

5.3 AprilTag 识别

这个元素的识别可以调用MicroPython自带的函数 find_apriltag,该函数具有较强的鲁棒性。在输出结果中对不在0~9范围内的结果作了过滤,识别较为精确。

5.4 数字识别

数字识别神经网络采用上述的十分类神经网络,训练集使用用OpenArt Mini摄像头直接拍摄得到的图片,这样得到的训练集更加贴近真实情况。训练完后取得了较好的识别效果。

5.5 动物水果识别

动物水果识别神经网络采用上述的十分类神经网络,训练集采用经过数据增强后的官方数据集,具体增强效果如图5-1。训练完后取得了较好的识别效果。

5.6 打靶

由于激光和摄像头是固定在一块的,所以相比其他队伍激光摄像头分离的方案我们的打靶操作就简单了许多,也不需要做摄像头标定计算激光打靶的空间变换矩阵,直接摄像头检测镜头中心是否和靶子中心对准,然后向小车发送停止指令,最后打开激光打靶。实际测试效果不错,选择合适的接近阈值可以顺利完成打靶任务,且相对稳定。

5.7 针对国赛规则的应对策略

由于国赛的识别任务是采用电脑播放图片,且四个类别的图片顺序随机,这给原先利用元素标志来切换神经网络的队伍带来了困难。

我们解决这个问题的方法是将这几个类别的识别串接起来,当一个识别到负类时进入下一环节,可以看作是将多分类拆分为了多个串接起来的二分类,尽管牺牲了运行速度,但通过拆分保证了每一环节的识别准确率。

所以相比之前的神经网络结构输出加入了负类这一输出,数字识别神经网络变为11分类,负类的图片取自动物水果,AprilTag。
动物水果识别神经网络保持不变。

识别过程具体是先识别是否有 AprilTag,不是 AprilTag 则调用数字识别神经网络识别数字,不是数字则最后调用动物水果识别神经网络识别动物水果。通过神经网络输出的负类这一类别完成串接。实际测试大概300ms完成一张图片的识别,尽管速度较慢,但准确率相当高。

 

6. 开发工具、作、安装、调试过程说明


6.1 Keil MDK软件

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

▲ 图6-1 Keil主界面

MDK需要对程序进行编译、下载,然后才能启动Debug对程序进行在线调试。可以对程序进行单步运行、多步运行、插入断点、观察变量等操作。

▲ 图6-2 Keil Debug

6.2 Qt软件

Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

在应用程序输出窗口可以方便地观察感兴趣的数据,可通过串口的使用实时监测控制小车,这样就可以不用数据线也能观测小车信息。

▲ 图6-3 调试

6.3 OpenMV IDE

OpenMV IDE 是用于 OpenMV Cam 的首要集成开发环境。它具有强大的文本编辑器、调试终端和带直方图显示的帧缓冲区查看器

▲ 图6-4 OpenMV IDE

6.4 显示屏和按键

在软件中进行了菜单的编写,可通过小车上的显示屏实时显示小车当前的各类信息,并可以通过按键进行参数修改和模式转换等功能。

▲ 图6-5 显示屏

 

7. 模型车的主要技术参数


 

束语


这是我们小队第一次参加智能车竞赛,从第一次见到车模的无从下手到日日夜夜与车模相伴,我们经历了太多。疫情断代,在缺乏学长的指导以及规则变化的情况下我们不得不从零开始,一步一步按照自己的想法去实现纯摄像头的赛道识别。虽然现在看来依然有点不稳定,但这一路走来感觉收获良多。

在这几个月的备战过程中,场地和经费方面都得到了学校和学院的支持,在此特别感谢一直支持和关注智能车比赛的王击老师以及学长们,同时也感谢比赛组委会能组织这样一项有意义的比赛。

也许我们的知识还不够丰富,考虑问题也不够全面,但是这份技术报告作为我们七个月辛勤汗水来的结晶,凝聚着我们小组每个人的心血和智慧,随着它的诞生,这份经验将永伴我们一生,成为我们最珍贵的回忆。

 

考文献


[1] 邵贝贝. 单片机嵌入式应用的在线开发方法[M].北京.清华大学出版社.2004
[2] 王晓明. 电动机的单片机控制[M].北京. 北京航空航天大学出版社.2002
[3] 臧杰,阎岩. 汽车构造[M]. 北京. 机械工业出版社.2005
[4] 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出版社.2004
[5] 张文春. 汽车理论[M].北京.机械工业出版社.2005
[6] 周志华. 机器学习[M]. 清华大学出版社. 2016

■ 附录:程序源代码

static inline void SpeedControlCal(void) 
{ 
         
    float SpeedDelta; //速度偏差 
    /**************左轮控制计算*************/ 
    SpeedDelta = CarInfo.SpeedSet - LeftSpeed; //计算偏差量 
    if (CarInfo.IsMotorDiffrientialOn == 'T') 
        SpeedDelta += MotorDifferential * (MotorDifferential >= 0 ? AdjustablePars.par_8 : 1); 
    LeftSpeedControlBais = SpeedControlPid.P * (SpeedDelta - LeftSpeedDeltaPrev); //增量式PID控制器 
    if (SpeedControlPid.I != 0) 
    { 
         
        if (SystemSettings.ChangeIEnable == 'T') 
        { 
         
            LeftSpeedControlBais += ChangeI(DetAbs((CarInfo.SpeedSet + MotorDifferential), LeftSpeed)) * SpeedControlPid.I * SpeedDelta; 
        } 
        else 
        { 
         
            LeftSpeedControlBais += SpeedControlPid.I * SpeedDelta; 
        } 
    } 
    if (SpeedControlPid.D != 0) 
    { 
         
        LeftSpeedControlBais += SpeedControlPid.D * (SpeedDelta + LeftSpeedDeltaPrevPrev - 2 * LeftSpeedDeltaPrev); 
    } 
    LeftSpeedDeltaPrevPrev = LeftSpeedDeltaPrev; //更新为上上次偏差 
    LeftSpeedDeltaPrev = SpeedDelta;             //更新为上次偏差                                                                      //保存上一次偏差 
    LeftSpeedControlOut += LeftSpeedControlBais; 
    /**************右轮控制计算*************/ 
    SpeedDelta = CarInfo.SpeedSet - RightSpeed; //计算偏差量 
    if (CarInfo.IsMotorDiffrientialOn == 'T') 
        SpeedDelta -= MotorDifferential * (MotorDifferential < 0 ? AdjustablePars.par_8 : 1); 
    RightSpeedControlBais = SpeedControlPid.P * (SpeedDelta - RightSpeedDeltaPrev); //增量式PID控制器 
    if (SpeedControlPid.I != 0) 
    { 
         
        if (SystemSettings.ChangeIEnable == 'T') 
        { 
         
            RightSpeedControlBais += ChangeI(DetAbs((CarInfo.SpeedSet - MotorDifferential), RightSpeed)) * SpeedControlPid.I * SpeedDelta; 
        } 
        else 
        { 
         
            RightSpeedControlBais += SpeedControlPid.I * SpeedDelta; 
        } 
    } 
    if (SpeedControlPid.D != 0) 
    { 
         
        RightSpeedControlBais += SpeedControlPid.D * (SpeedDelta + RightSpeedDeltaPrevPrev - 2 * RightSpeedDeltaPrev); 
    } 
    RightSpeedDeltaPrevPrev = RightSpeedDeltaPrev; //更新为上上次偏差 
    RightSpeedDeltaPrev = SpeedDelta;              //更新为上次偏差                                                                      //保存上一次偏差 
    RightSpeedControlOut += RightSpeedControlBais; //增量输出 
} 
 
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章