智能车竞赛技术报告 | 智能车视觉 - 三江学院 - 识别不别
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能车竞赛技术报告 | 智能车视觉 - 三江学院 - 识别不别相关的知识,希望对你有一定的参考价值。
队伍名称:识别不别
参赛队员:占晨龙
王汶洁
王倩
带队教师:陈春
葛年明
引 言
本文以第十六届全国大学生智能汽车竞赛为背景,该比赛受教育部高等教育司委托,由教育部高等自动化专业教学指导分委员会主办全国大学生智能汽车竞赛。该竞赛以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一,为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。该竞赛由竞赛秘书处为各参赛队提供/购置规定范围内的标准硬软件技术平台,竞赛过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,保证竞赛向健康、普及,持续的方向发展。
车模应主委会要求采用的是C车模,主控核心是NXP公司的MK60DN512ZVLQ10单片机做为核心主控制器,而应第十六届全国大学生智能汽车竞赛智能视觉组别的要求,我们采用OpenART mini摄像头视觉传感器进行图像识别,通过MT9V034神眼数字摄像头经过主控处理进行软件二值化,同时自制电感采集进行对赛道的元素识别,通过光电编码器来检测车速,并采用MK600的输入捕捉功能进行脉冲计算获得速度和路程;转向舵机采用PD控制;驱动电机采用增量式 PID控制,通过PWM控制驱动电路调整电机的功率;而车速的目标值由默认值、运行安全方案和基于图像处理的优化策略进行综合控制。车模上的主控板、驱动板等电路板均由队员自制。
本文第一章中简要的介绍系统总体方案的选择,第二章对车模的硬件机械结构结构的设计进行简单的介绍,第三章对硬件设计方案选择进行介绍,第四章为软件系统的设计与实现,第五章介绍了系统的开发工具和调试工具
第一章 系统整体设计
智能车系统的总体选取NXP的MK60DN512ZVLQ10单片机作为系统控制处理器,通过二值化摄像头检测赛道信息,提取黑线引导线,用于赛道识别;用PD方式对舵机进行控制,实现对车模的转向控制;同时通过编码器获取赛车的当前速度,并采用PID控制系统实现速度闭环控制,驱动电机采用 PID控制,通过PWM控制驱动电路调整电机的功率;而车速的目标值由默认值、运行安全方案和基于图像处理的优化策略进行综合控制。为提高车模的速度和稳定性,使用上位机、 拨码开关、按键模块等调试工具,进行了大量硬件与软件测试。对特殊元素的识别,采用OpenART mini进行识别,并于主控进行通讯,主控做出相应的任务完成比赛。
▲ 图1.1 系统框图
系统的框图如上图(1.1)所示,该系统总共包括10个系统,电源模块,调试模块,赛道采集模块,坡道识别模块,电感模块,调试模块,舵机控制模块,电机控制模块,主控模块,特殊元素采集模块,摄像头模块。
1. 电源模块,电源模块为整块电路提供有效的直流电源,包括5V,3.3V和可调的稳压,为求高质量的电源,我们采用等芯片。
2. K60单片机,型号为: MK60DN512ZVLQ10,作为整个小车的核心控制,负责接收信号和驱动相关模块,并能对信号进行及时的处理和反馈。
3. 坡道检测模块,光电传感器模块E18-D80NK红外光电。
4. 舵机控制模,舵机通过LM1084S产生5.8V稳压,用单片机PWM输出端口便可以直接驱动。
5. 直流电机采用MOSFET搭建双桥驱动,单片机输出PWM,然后通过编码器进行闭环控制电机
6. 调试模块,调试模块包括TFT显示屏、蓝牙发送上位机等以搭建一个友好的交互环境,及时掌握小车状态.
7. 电机控制模块,采用DRV8701ERGER、STL150N3LLH5等芯片搭建的电路,小巧与母板可直插大大的减小了占用面积同时方便检修,耐压过流能力强等优点。
8 . 特殊元素采集检测模块,本次采用的是逐飞科技的OPENART mini 集成度高可编程摄像头,对赛道上的二维码数字标识符和ART码进行检测并通过串口通讯将信息发送至主控板上。
9. 摄像头模块,采用的是龙邱的MT9V034神眼数字摄像头,选取125°的广角摄像头,采样速率高且不易出错等优点。
10. 电感采集模块,可以对赛道上的电磁信号进行采集并放大,对赛道上的特殊元素如圆环进行判断。
▲ 图1.2整车布局图
第二章 机械系统设计及实现
2.1前轮定位
前轮定位对赛车的速度有很大的影响,虽然车模比较小,但是前轮定位作用还是不容忽视的。轮定位的内容有:主销后倾、主销内倾、前轮前束。
2.1.1 主销后倾
转向轮(前轮)围绕主销进行旋转,前轴的轴荷通过主销传给转向轮,具备这两点的就叫做主销。主销向后倾斜,主销轴线与地面垂直线在赛车纵向平面内的夹角称为主销后倾。如图所示:
▲ 图2.1.1
前轮重心在主销的轴线上,由于主销向后倾斜使前轮的重心不在车轮与地面的接触点上,于是产生了离心力,主销后倾形成的离心力,可以保证汽车直线行驶的稳定性,还可以帮助车轮自动回正。
2.1.2 主销内倾
主销在横向平面内向内倾斜,主销轴线与地面垂直线在赛车横向断面内的夹角称为主销内倾角。主销内倾角也有使轮胎自动回正的作用,当汽车转向轮在外力作用下发生偏转时,由于主销内倾,则车轮连同整个汽车的前部将被抬起一定高度,在外力消失后,车轮就会在重力作用下力图恢复到原来的中间位置。但主销内倾角不宜过大,否则在转弯时轮胎将与赛道间产生较大的滑动,从而会增加轮胎与路面间的摩擦阻力,使转向变得沉重,同时会加速轮胎的磨
2.1.3 前轮前束
通过车轮中心的汽车横向平面与车轮平面的交线与地面垂线之间的夹角,称为前轮外倾角。 前轮外倾角是前轮的上端向外倾斜的角度,如果前面两个轮子呈现“V”字形则称正倾角,呈现“八”字则称负倾角。前轮外倾可以抵消由于车的重力使车轮向内倾斜的趋势,减少赛车机件的磨损与负重。前轮前束是前轮前端向内倾斜的程度,当两轮的前端距离小后端距离大时为内八字,前端距离大后端距离小为外八字。由于前轮外倾使轮子滚动时类似与圆锥滚动,从而导致两侧车轮向外滚开。但由于拉杆的作用使车轮不可能向外滚开,车轮会出现边滚变向内划的现象,从而增加了轮胎的磨损。前轮外八字与前轮外倾搭配,一方面可以抵消前轮外倾的负作用,另一方面由于赛车前进时车轮由于惯性自然的向内倾斜,外八字可以抵消其向内倾斜的趋势。外八字还可以使转向时靠近弯道内侧的轮胎比靠近弯道外侧的轮胎的转向程度更大,则使内轮胎比外轮胎的转弯半径小,有利与转向。
2.2 车模重心
车体的重心可以用吊线法测出,车体重心的位置对赛车加减速性能、转向性能和稳定性都有较大的影响。重心调整主要包括重心高度和前后位置的调整。 理论上,车体重心越低稳定性越好,重心低有利于赛车在高速转弯的贴地性,可以有效防止发生侧翻,因此在车体底盘高度、舵机安装、电路板的安装等上尽量使重心放低。
根据车辆运动学理论,车身重心前移,大部分重量压在前轮,转向负荷增大,会增加转向,对模型车的制动性能和操纵稳定性有益,但降低转向的灵敏度,同时降低后轮的抓地力;重心后移,会减少转向,但增大转向灵敏度,后轮抓地力也会增加。但综合起来看,重心应靠近后轴一点。
2.3 车模底盘高度
车模底盘的高度主要由赛道中的坡决定,在顺利过坡的前提下底盘越低越好。这样会使得重心更低,赛车的稳定型更强。
2.4舵机安装
舵机有立式和卧式两种安装方案(立式:转轴处于水平方向;卧式:转轴处于竖直方向)。
- 舵机立式安装方式的优点:
(1) 转向响应速度快,转向角较为符合阿克曼转向原理,它由舵机臂竖直平面的运动转化为拉杆水平方向的运动,减少了在同一平面上运动的死区;(2) 方便安装舵机臂,有利于调节赛车转向的中值。
- 舵机立式安装方式的缺点:
(1) 不好安装固定;
(2) 安装后较高,占用竖直方向的空间,会挡到摄像头
(3) 重心较高。
- 舵机立式安装的优点:
(1) 转向响应速度快,转向角较为符合阿克曼转向原理,它由舵机臂竖直平面的运动转化为拉杆水平方向的运动,减少了在同一平面上运动的死区;
(2) 方便安装舵机臂,有利于调节赛车转向的中值。
- 舵机立式安装方式的缺点:
(1) 不好安装固定;
(2) 安装后较高,占用竖直方向的空间,会挡到摄像头
(3) 重心较高。
- 舵机卧式安装方式的优点:
(1) 转向响应速度较快;
(2) 高度较低
(3) 重心低。
舵机卧式安装方式的缺点:转向角部分符合阿克曼转向原理(转角小时),舵机臂和拉杆都在水平平面内运动,当舵机臂长度与转角臂长度相等时会导致内、外侧轮不符合阿克曼转角。经过仿真分析后得出舵机立式安装方式较好,立式安装方式的转角较符合阿克曼转角。
同时舵机的摆杆的长度也会直接影响到舵机的转矩。由公式舵机转矩 = 舵机摆杆作用力 * 摆杆长度,得:舵机摆杆作用力越大,反应越灵敏,转向速度越快。转矩一定时,摆杆越长,输出的作用力越小,所以摆杆不能太长,不然会拉不动轮胎左右转向。经过多次实验测量,我们决定采用3-4cm的长度。
2.5 编码器的安装
编码器是用来对车速进行测算的仪器,目前很多学校使用的是通过光电编码的编码器,其精度较高、安装较为方便,但体积有点大。光电编码器的安装精度较高,要求编码器轴与赛车后轴同轴,且编码盘必须与赛车的中心线共线。我们是直接装在车上,利用齿轮与差速器上的大齿轮相咬合。这种安装方法方便快捷,更能较准确的测出电机的转速。
▲ 图2.5.1 编码器安装
2.6摄像头的固定
对于整个车来说,摄像头的安装影响到整个车采集信息的准确性。在摄像头安装过程中,我们在简洁,保证强度的基础上,严格控制摄像头的安装位置和增量。整套装置具有很高的定位精度和刚度,使摄像头便于调节、拆卸和维修,具有赛场快速保障能力。
▲ 图2.6.1
2.7电池的固定
由于电池可以影响重心的位置,而且固定在板子上,要求是要易于拆卸,因此,我们采用用铜柱将它卡死,及时车子需要很大的向心力,也可以保持,而且在易于拆卸
第三章 硬件系统设计及实现
3.1硬件设计方案
我们主要从系统的稳定性、可靠性、高效性、实用性、简洁等方面来考虑硬件的整体设计。从最初方案设定到最终方案的敲定,我们经历各种讨论与大的改动才有了如下的硬件方案。可靠性与稳定性是一个系统能够完成预设功能的最大前提。电路进行单片化设计,将电源模块、调试模块、图像信号处理模块、速度 反馈信息处理模块、驱动模块和各个接口电路设计在一块主板上。主板直接用螺 丝螺母固定于底盘上。电路做好了模拟部分和数字部分的隔离、各个电源的滤波, 以及对干扰信号的屏蔽工作。各个接口连接可靠牢固。 简洁。主板外形设计根据车模尺寸、形状量身打造。器件排放整齐。减少了 各个电路板之间的连线,使整车看上去简洁美观。如下图
▲ 图3.1.1 母板PCB
▲ 图3.1.2 母板PCB
3.2运放模块设计
电磁传感器由六路 10mH 电感和 6.8nF 电容构成谐振,采集到的信号在离赛道高 2cm 以上可检测到正常信号,并且传输给板载 LMV358 运算放大器放大整流后通过输出信号接口,接 到单片机 ADC 接口。离赛道中心 2-30cm(实测不止这个距离)均可看到单片机采集的值明显的连 续变化,并且在同一位置检测的值基本稳定,是较为理想的赛道信号电磁传感器。电感布局方面根 据不同赛道元素需求,对电感合理布局,如下图。
▲ 图3.2.1 电磁传感器PCB
▲ 图3.2.1 电磁传感器PCB
3.3驱动模块
- 驱动方案优势:
1、无需升压电路,简化设计,应用更加广泛。在以往的智能车电机驱动方案 中,使用了栅极驱动芯片 IR2104 + IR7843,但由于栅极驱动芯片需要 10V 以上 电压供电,因此需要在驱动电路上加一个 BOOST 升压电路,而在使用中发现升压 电路在电磁组中可能对电磁信号采集产生一定干扰。而此方案中的门极驱动芯片 DRV8701E 采用了内部自举升压,而不需要外部升压电路,可以适用于更加广泛的 输入电源(5.9V-45V)。
2、带过流保护功能,保护电机,保护智能车,使用更加安全。门极驱动芯片 DRV8701E 内部自带 OCP(Overcurrent Protection)功能,当芯片内部检测到触 发过流事件。此时芯片内部将禁止使能,达到控制输出保护驱动板以及电机的效果。
3、驱动性能更加强劲,24V 大电机也能搞定。驱动性能强劲主要由以下几面 体现:
(1) 首先 N-MOS 管 TPH1R403NL 的 DS 导通内阻更小,只有 1.7 毫欧,而之 前的 IR7843 的为 3.3 毫欧。且 TPH1R403NL 的瞬间峰值电流可达 200A,持续电流 可达 60A,均高于 IR7843 的对应参数。
(2) 其次 DRV8701E 芯片的理论输入电压范围为 5.9V-45V,这就可使用更高 电压的输入电源,进而轻松驱动 12V-24V 的电机。
(3) 内阻小减小了内部损耗,驱动板长时间驱动高速电机,大电流使用也 不发烫,不影响性能。
4、驱动信号更加简单,解放 PWM 资源。在以往的 IR2104+IR7843 方案中,若 控制两个电机的正反转,则需要 4 路 PWM 信号来作为输入信号。而在此 DRV8701E+TPH1R403NL 方案中,只需要 2 路 PWM 信号+2 路普通 IO 口引脚,即可 进行控制。即控制 1 个电机只需要输入一个 PWM 信号控制转速,通过一个普通 IO 口输出高低电平来控制转向。
5、体积更小,适用于各组别智能车搭建。
▲ 图3.3.2 驱动模块PCB
第四章 软件系统设计及实现
4.1 各种元素的扫线方法
4.1.1 黑线提取
(1)二值化
原图像采集来为灰度,经我们多次算法修改发现将图像进行二值化后,处理起来更为方便,而采用动态阈值,固定曝光。阈值用大津阈值算的,曝光根据实时的 AD 值调节,最好控制在 200 左右为最佳。采用动态阈值的好处是能适应光强不均的环境比如体育场等。判断黑白与跳边沿的方法一样,于阈值判断为白 ,小于阈值判断为黑(背景和黑线)。代码如下
int GetOSTU(uint8_t tmImage[LCDH][LCDW])
{
int16_t i,j;
uint32_t Amount = 0;
uint32_t PixelBack = 0;
uint32_t PixelIntegralBack = 0;
uint32_t PixelIntegral = 0;
int32_t PixelIntegralFore = 0;
int32_t PixelFore = 0;
float OmegaBack, OmegaFore, MicroBack, MicroFore, SigmaB, Sigma; // 类间方差;
int16_t MinValue, MaxValue;
uint8_t Threshold = 0;
uint8_t HistoGram[256]; //
for (j = 0; j < 256; j++) HistoGram[j] = 0; //初始化灰度直方图
for (j = 0; j < LCDH; j++)
{
for (i = 0; i < LCDW; i++)
{
HistoGram[tmImage[j][i]]++; //统计灰度级中每个像素在整幅图像中的个数
}
}
for (MinValue = 0; MinValue < 256 && HistoGram[MinValue] == 0; MinValue++) ; //获取最小灰度的值
for (MaxValue = 255; MaxValue > MinValue && HistoGram[MinValue] == 0; MaxValue--) ; //获取最大灰度的值
if (MaxValue == MinValue) return MaxValue; // 图像中只有一个颜色
if (MinValue + 1 == MaxValue) return MinValue; // 图像中只有二个颜色
for (j = MinValue; j <= MaxValue; j++) Amount += HistoGram[j]; // 像素总数
PixelIntegral = 0;
for (j = MinValue; j <= MaxValue; j++)
{
PixelIntegral += HistoGram[j] * j;//灰度值总数
}
SigmaB = -1;
for (j = MinValue; j < MaxValue; j++)
{
PixelBack = PixelBack + HistoGram[j]; //前景像素点数
PixelFore = Amount - PixelBack; //背景像素点数
OmegaBack = (float)PixelBack / Amount;//前景像素百分比
OmegaFore = (float)PixelFore / Amount;//背景像素百分比
PixelIntegralBack += HistoGram[j] * j; //前景灰度值
PixelIntegralFore = PixelIntegral - PixelIntegralBack;//背景灰度值
MicroBack = (float)PixelIntegralBack / PixelBack; //前景灰度百分比
MicroFore = (float)PixelIntegralFore / PixelFore; //背景灰度百分比
Sigma = OmegaBack * OmegaFore * (MicroBack - MicroFore) * (MicroBack - MicroFore);//计算类间方差
if (Sigma > SigmaB) //遍历最大的类间方差g //找出最大类间方差以及对应的阈值
{
SigmaB = Sigma;
Threshold = j;
}
}
return Threshold; //返回最佳阈值;
}
(2)提取赛道边沿
得到一幅完好的二值化后的图片后需要对赛道的边沿进行提取与显示,这里我们采用的是从中间向左右扫,以俩个点为步长基准,当从中间往俩边扫时,有俩个点的跳变便标为左右赛道边界。跳变对光线要求挺高,但是容易提取,便于控制。提取代码如下:
for(y=58;y>=0;y--)//扫描完58,整副图像处理完毕
{
for(x=my_lastzhongjian;x<=93;x++)//从中间向右扫描
{
if(Pixle[y][x-1]==0&&Pixle[y][x]==0)//gaidong
{
right_heixian[y]=x;
shaobudaoyou_flag[y]=1;
break;
}
}
for(x=my_lastzhongjian;x>=0;x--)//向左扫描
{
if(Pixle[y][x+1]==0&&Pixle[y][x]==0)//gaidong
{
left_heixian[y]=x;
shaobudaozuo_flag[y]=1;
break;
}
}
(3)布线
当赛道缺失或光线暗淡图像都会有明显的缺失,这时我们应当对图像进行布线,在原先图像的基础上进行向上拟合中线,而当面对不同的元素我们采取的布线方法都是不一样的。
if(y>48)//丢边补线,加整个赛道补线
{
if(shaobudaoyou_flag[y]==0&&shaobudaozuo_flag[y]==1)//扫不到右
{
right_heixian[y]=left_heixian[y]+2*half_width_group[y];//y为数组中的x值
}
else if(shaobudaoyou_flag[y]==1&&shaobudaozuo_flag[y]==0)//扫不到左
{
left_heixian[y]=right_heixian[y]-2*half_width_group[y];
}
else if(shaobudaoyou_flag[y]==0&&shaobudaozuo_flag[y]==0)//都扫不到
{
left_heixian[y]=0;//如果两边都扫不到,直接从中间提取中线
right_heixian[y]=93;
}
}
else if(y<=48)//更远的补线,
{
if(shaobudaoyou_flag[y]==0&&shaobudaozuo_flag[y]==1)//扫不到右
{
right_heixian[y]=right_heixian[y+1]+(abs)(left_heixian[y]-left_heixian[y+1])-1;//根据左边这一点与上一点,
//(y+1)为数组中上一次的x坐标,//left_heixian[y]-left_heixian[y+1]算左边偏移量,减一为后期补偿
}
else if(shaobudaoyou_flag[y]==1&&shaobudaozuo_flag[y]==0)//扫不到左
{
left_heixian[y]=left_heixian[y+1]-(abs)(right_heixian[y+1]-right_heixian[y])+1;//abs为取绝对值
}
else if(shaobudaoyou_flag[y]==0&&shaobudaozuo_flag[y]==0)//都扫不到
{
left_heixian[y]=0;
right_heixian[y]=93;
}
}
(3)坡道
当摄像头架得高时上坡的时候会丢线并且还看到的图像还会和人字的重复误判,为了防止误判我们用了红外识别坡道。在上坡、下坡的时候,红外能感应到,进入坡道模式。而实现红外检测也十分简单,下面为红外检测代码。
if(GPIO_PinRead(PTB17)==0)
podao_flag=1;
(4)起跑线
起跑线的在赛道中观测还较为明显,且作为主标识十分方便,而我们采用的是对某一行的黑白值进行计算,这样不仅处理起来十分的迅速且不易出错,下面为起跑线检测代码:
void star_line_judg()
{
// int kk,bai_flag=0,hei_flag=0,heibai_flag=0,baihei_flag=0;
bai_flag=0;
hei_flag=0;
heibai_flag=0;
baihei_flag=0;
for(kk=20;kk<=92;kk++)
{
if(Pixle[20][kk]>0)
bai_flag=1;
else
if(bai_flag&&Pixle[20][kk]==0)
{
baihei_flag++;
bai_flag=0;
}
if(Pixle[20][kk]==0)
hei_flag=1;
else
if(hei_flag&&Pixle[20][kk]>0)
{
heibai_flag++;
hei_flag=0;
}
}
if(baihei_flag>=4&&heibai_flag>=4&&baihei_flag-heibai_flag<=2) //第二次停车检测到
star_lineflag=1;
}
4.1.2元素的处理方法
(1)圆环处理方法
圆环的处理方法较为复杂,如果单用摄像头的话需要许多的标识位,且算法十分的复杂,因此我们决定采用电磁辅助入环,电磁归一化后,对入环的特殊位置进行标记,图4.1-1中2位置为我们检测的入环时机,当在此位置检测到后摄像头对圆环进行布线,入环后仅需要摄像头继续跑。
▲ 图4.1.1 入环的位置
电磁归一化代码如下:
LnowADC[0] = (uint16_t)(ADC_Get(0)*0.806);
LnowADC[1] = (uint16_t)(ADC_Get(1)*0.806); ,
LnowADC[4] = (uint16_t)(ADC_Get(2)*0.806);
LnowADC[5] = (uint16_t)(ADC_Get(3)*0.806);
// BatVolt = ADC_Read(ADC7); // 刷新电池电压
if (LnowADC[0] < ad_min[0])
ad_min[0] = LnowADC[0]; // 刷新最小值
else if (LnowADC[0] > ad_max[0])
ad_max[0] = LnowADC[0]; // 刷新最大值
if (LnowADC[1] 智能车竞赛技术报告 | 智能车视觉 - 新余学院 - 开放艺术队
智能车竞赛技术报告 | 智能车视觉 - 石家庄学院 - 百事
智能车竞赛技术报告 | 智能车视觉 - 宜宾学院- 平头哥1组
智能车竞赛技术报告 | 智能车视觉 - 中原工学院 - 逐鹿 - 分母队