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

智能车竞赛技术报告 | 智能车视觉 - 三江学院 - 识别不别

时间:2022-08-13 14:00:02 电感的前端会不会升压数字智能电容电容智能交互屏卧式固定电感器ch2m光电传感器2200uf大容量电容

学 校:三江学院
队伍名称:识别不别
参赛队员:占晨龙?
王汶洁?
王倩??
带队教师:陈春??
葛年明?


??本文以第十六届全国大学生智能汽车竞赛为背景,由教育部高等教育部委托,由教育部高等自动化专业教学指导分委员会主办。以智能汽车为研究对象的创意技术竞赛是全国大学生的探索性工程实践活动,是教育部倡导的大学生技术竞赛之一。为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革。竞赛以基于培训、参与、鼓励探索、追求卓越为指导思想,旨在促进高校素质教育,培养大学生综合知识应用能力、基本工程实践能力和创新意识,激发大学生从事科学研究和探索的兴趣和潜力,倡导理论联系实际、务实的学习风格和团队合作人文精神,为优秀人才的脱颖而出创造条件。竞赛由竞赛秘书处在规定范围内为参赛队伍提供/购买标准硬件技术平台。竞赛过程包括理论设计、实际生产、车辆调试、现场竞赛等环节,要求学生组成团队,共同工作,初步体验工程研发项目从设计到实现的全过程。本次竞赛融合了科学性、趣味性和观赏性,是一场以快速发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械、汽车等多学科专业的创意竞赛。比赛规则透明,评价标准客观,坚持公开、公平、公正的原则,确保比赛健康、普及、可持续发展。

??车模应主委会要求采用C车模,主控核心为NXP公司的MK60DN512ZVLQ10单片机作为核心主控制器,应第十六届全国大学生智能汽车竞赛智能视觉组的要求,采用OpenART mini通过摄像头视觉传感器识别图像MT9V034神眼数字摄像头通过主控处理软件二值化,同时,自制电感采集识别轨道元素,通过光电编码器检测速度,并使用MK脉冲计算输入捕捉功能获得600的速度和距离;转向舵机采用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] < ad_min[1])
        ad_min[1] = LnowADC[1];
    else if (LnowADC元器件数据手册IC替代型号,打造电子元器件IC百科大全!
          

相关文章