智能车竞赛技术报告 | 节能信标组 - 安徽工业大学 - 摸鱼大队
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能车竞赛技术报告 | 节能信标组 - 安徽工业大学 - 摸鱼大队相关的知识,希望对你有一定的参考价值。
队伍名称:摸鱼大队
参赛队员:孙方策 钱佳维 祝浩天带队
教师:钱牧云 刘一帆
第一章 引言
全国大学生智能汽车竞赛是一项以“立足培养、重在参与、鼓励探索、追求卓越”为指导思想,面向全国大学生开展的具有探索性的工程实践活动。它以设计制作在特定赛道上能自主行驶且具有优越性能的智能模型汽车这类复杂工程问题为任务,鼓励大学生组成团队,综合运用多学科知识,提出、分析、设计、开发并研究智能汽车的机械结构、电子电路、运动控制和开发与调试等问题, 激发大学生从事工程技术开发和科学研究探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神。
第二章 机械结构
车身机械结构采用了全3D打印设计的三轮车。为了减轻重量,均采用了百分之二十的填充度。三轮车依靠两轮的差速实现方向的修正,后方的万向轮起到支撑车体的作用。此结构的优点转向灵活,控制简单。
零件一:车底架
其中车底架使用强度相对更高的PLA材料,设计有电路板安装孔,电机套安装孔,万向轮安装孔,为小车整体提供了稳固的安装基础。由于填充度较低,在底架上方设计了加强筋,使得车架有更高的机械强度,弯曲形变幅度大大降低。
零件二:电机套
电机通过两个ABS材料打印的夹套固定在底架上。电机套和电机采用过渡配合,电机刚好能够插入设计的套孔中,然后通过螺钉压紧电机,即可有效地固定住电机。
零件三:联轴器
车轮和电机轴通过联轴器进行连接,在初版设计中直接使用了成品的黄铜六角联轴器,但因其较重,便想3D打印一个联轴器。成品黄铜联轴器使用了径向的紧定螺钉通过螺纹连接压紧电机轴带来的轴向摩擦力固定,但3D打印的径向螺纹强度不够,只能另想办法。最终我采用了电机轴和联轴器过盈配合的方案,实际使用效果良好。联轴器和车轮的连接直接通过一根M4螺钉固定。
零件四:充电线圈
充电线圈使用了自己绕制的利兹线大线圈,通过扎带固定在车架正下方。线圈滴加了502胶水,使得其变得十分坚硬,在车减速前倾时还能起到支撑作用。
零件五:摄像头底座
摄像头通过一根碳素杆和碳素杆底座固定在车身上。
构件一:万向轮
车后轮使用了3D打印自制的万向轮,相比买的成品万向轮能减掉不少重量。万向轮由于承载了一部分车身重量,对机械强度要求较高,便采用了全填充高精度的打印方式。该构件由底座,轮架,轴承三种零件构成,底座和轮架之间通过轴承的过盈配合连接实现了平面内的旋转运动,轮架通过螺钉螺母夹住一个充当轮子的轴承,便构成了一个迷你的万向轮。
第三章 硬件设计
正如之前所说,到后来,所有人的接受效率都已经达到了极致,相差不了多少,所以如何做到更加节能才是后面所需要考虑的。
3.1 单片机最小系统
本次比赛对节能信标组指定使用了英飞凌系列的单片机,选用了TC264芯片,为了节约时间,减少不必要的BUG,直接使用了逐飞科技提供的TC264最小核心板,只不过这款单片机的能耗有点高,甚至能赶得上电机的能耗。
3.2电源管理模块
3.2.1 主控及各种传感器的供电
节能组已经出现好几年了,出现了一个又一个优秀的方案,但是有一款芯片始终备受各参赛队伍的青睐,那就是德州仪器的TPS63070。TPS6307x 是一款具有低静态电流的高效降压-升压转换器,适用于那些输入电压可能高于或低于输出电压的应用。在升压或降压模式下,输出电流可高达2A。此降压-升压转换器基于一个固定频率、脉宽调制(PWM)控制器,此控制器通过使用同步整流来获得最高效率。在低负载电流情况下,此转换器进入省电模式以在宽负载电流范围内保持高效率。转换器可被禁用以大大减少电池消耗。在关断期间,负载从电池上断开。此器件采用2.5mm x 3mm QFN 封装。
由于大部分传感器,都是需要3.3V供电,所以选用了台湾立锜RT9013-33GB,该稳压芯片体积小,能耗低,压降仅400mV @ 500mA。固定输出3.3V。只不过该芯片最大的电流为500ma。所以采用了多个稳压芯片分别给主控 ,屏幕,摄像头供电。
3.2.2 电机驱动的供电
电机驱动的供电电压通常是由选用的电机决定的,因为我们选用的是12V的RE13电机,选用的芯片依旧是德州仪器的TPS61088,也是大多数参赛选手的选择,此款芯片早年在充电宝上工作过,也算是经受过实战的考验。TPS61088 采用自适应恒定关断时间峰值电流控制拓扑结构来调节输出电压。在中等到重负载条件下,TPS61088 工作在PWM 模式。在轻负载条件下,该器件可通过MODE 引脚选择下列两种工作模式一种是可提高效率的PFM 模式;另一种是可避免因开关频率较低而引发应用问题的强制PWM 模式。可通过外部电阻在200kHz 至2.2MHz 范围内调节PWM 模式下的开关频率。TPS61088 还实现了可(VQFN) 封装编程的软启动功能和可调节的开关峰值电流限制功能。此外,该器件还提供有13.2V 输出过压保护、逐周期2 应用过流保护和热关断保护。TPS61088 采用20 引脚4.50mm × 3.50mm VQFN。
3.3电机驱动模块
智能车电机驱动模块方案早已成熟,这两年兴起的DRV8701E是一股潮流,但是考虑到体积,电机电流等因素,觉得DRV8701E有点大材小用,所以后面选用了东芝的TB6612集成驱动。
TB6612FNC是东芝半导体公司的一款电机驱动芯片,也是集成了两个全H桥。电源供电电压2.5~13.5V,H桥输出的平均电流1.2A,最大可到3.2A。内置过热保护和低压检测关断电路,PWM控制的频率可达100kHZ。
为了保护单片机引脚,使用了光耦隔离,把单片机和电机驱动分开,避免电机驱动的大电压大电流损坏单片机。这里选用了TI公司的SN74HC244PWR。74HC244是一款高速 CMOS 驱动隔离器件,引脚兼容低功耗肖特基 TTL 系列。是八路正相缓冲器、线路驱动器,具有三态输出。该三态输出由输出使能端1OE和2OE控制。任意 NOE 的高电平将使输出端呈现高阻态。
3.4 编码器和电机接口
选用的re13电机自带512线的编码器,需要3.8伏以上电压供电。需要区分每个引脚对应的功能。
3.5 陀螺仪&加速度计接口
陀螺仪&加速度计模块采用IIC 进行数据的读取,接口如下。
3.6 人机交互模块
为了方便调试,在车模上增加了TFT 液晶、LED 指示灯、按键和拨码开关,可以通过TFT 观察车辆的一些数据,LED 在车模运行时指示某些特殊元素,按键可以用来调参和实现特定功能,拨码开关用于策略调整。
3.7 电压检测电路
为了实时检测电容的充电电压,利用电阻分压,简单设计了一个电压测量电路。
3.8 无线充电电路
充电方案用的是卓大大在公众号推文“火中取栗”提到的LCC充电补偿网络。
电路很是简单,但是一定要注意元器件的选型,二极管我选用的是15A级别的,电容选用的是1000V耐压值的COG电容,电感是自己绕制,选用250股的利兹线。
3.9 电路板实物展示
下图依次为主控板(正)、主控板(反)、充电板(正)、充电板(反)
第四章 软件算法
高效的软件程序是智能车高速平稳自动寻灯的基础。我们设计的智能车系统采用带有只能通过红外线的镜头的摄像头进行赛道识别,图像采集及校正处理就成了整个软件的核心内容。在智能车的转向和速度控制方面,我们使用了经典PID控制算法,配合使用理论计算和实际参数补偿的办法,使智能车能够稳定快速寻灯。
4.1自启动
由于比赛的要求:将车放在灯上面之后便不能碰车身,因此车子需要到达一定的电量之后自启动,所以首先我们需要做的就是得到车子的实时电量,而刚好在tc264主板有一个adc接口是专门采集电量的,因此在这里我们可以使用adc采集,而adc采集原理是:
将模拟量转换成数字量的过程称为“模数转换”。完成模数转换的电路 称为模数转换器,简称 ADC。其具体原理如下图:
因此我们可以使用主板提供的检测电量的adc引脚来检测车子电量。
具体代码如下:
while(1)//进入循环
{
voltage=adc_mean_filter(ADC_0,ADC0_CH8_A8,ADC_8BIT,5);//得到电压值
if(voltage>9.00)
{
break;
}//当电压值大于9v跳出循环进入下面的程序从而达到自启动的目的。
}
4.2采集图像并找寻灯的位置:
在找灯之前我们先需要获得摄像头所摄入的图像,而摄像头摄入图像的原理是:图像采集就是将图像源的模拟信号转化为数字信号并将这些数字信息存储在存储器的过程。其及具体原理如下:
一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。
通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的。
在计算机领域中,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。在数字图像领域之外,“黑白图像”也表示“灰度图像”。
获得图像之后我们需要对图像进行处理从而找到灯的具体位置。
一开始我们觉得在那么多的像素点中排除众多干扰找到信号灯实在是一件很困难的事情,后来我们一想信号灯其实主要散发的是红外线,因此我们如果能把除红外线之外的其他光过滤掉,那样就可以消除绝大部分干扰,因此我们加上了过滤其他光的镜片。
其实在现实生活中有许多发光物都会发出红外线,比如太阳或者日光灯等等,因此实际比赛的过程中要确保不能存在发出红外线光的外在干扰。
如果以上都完成的很好,那么在图像中接受只有信标灯发出的光在,就简单了,我们都知道图像实际上是由一个个像素点组成的,而现在图像中接收到的只有信标灯发出的光,因此我们可以判断只要像素点的亮度大于一定的值(阈值)我们便可以确定这个像素点其实就是信标灯发出的光被摄像头接收到的像素点。因此该像素点的位置就是信标灯的位置。
具体操作就是对摄像头传送回的图像一行一行进行扫描,然后将亮度大于阈值的像素点的位置记录下来,这便是信号灯的位置。
4.3 pid控制寻灯的方向和速度:
pid由于用途广泛、使用灵活,已有系列化产品,使用中只需设定三个参数(Kp,Ti和Td)即可。在很多情况下,并不一定需要全部三个单元,可以取其中的一到两个单元,但比例控制单元是必不可少的。
首先,PID应用范围广。虽然很多工业过程是非线性或时变的,但通过对其简化可以变成基本线性和动态特性不随时间变化的系统,这样PID就可控制了。
其次,PID参数较易整定。也就是,PID参数Kp,Ti和Td可以根据过程的动态特性及时整定。如果过程的动态特性变化,例如可能由负载的变化引起系统动态特性变化,PID参数就可以重新整定。
第三,PID控制器在实践中也不断的得到改进
PID在控制非线性、时变、耦合及参数和结构不确定的复杂过程时,工作得不是太好。最重要的是,如果PID控制器不能控制复杂过程,无论怎么调参数都没用。
虽然有这些缺点,但简单的PID控制器有时却是最好的控制器。
pid具体如下:
PID控制器由比例单元§、积分单元(I)和微分单元(D)组成。其输入e(t)与输出u(t)的关系为:
u(t)=kp[e(t)+1/TI∫e(t)dt+TDde(t)/dt]式中积分的上下限分别是t和0
因此它的传递函数为:G(s)=U(s)/E(s)=kp[1+1/(TIs)+TD*s]
其中kp为比例系数;TI为积分时间常数;TD为微分时间常数。
其过程:
Pid 其实也分为许多种类型包括:位置式pid,增量式pid,模糊pid,自适应pid,神经网络pid等等。我们在使用过程中主要使用位置式pid和增量式pid。
具体使用如下:
在使用过程中我们首先使用的加的是位置式pid,其代码如下:
int32 PlacePID_Control(pPID_t p, int32 NowData, int32 SetData)
{
//当前误差,定义为寄存器变量,只能用于整型和字符型变量,提高运算速度
int32 iError, // 当前误差
Realize; // 最后得出的实际增量
iError = SetData - NowData; // 计算当前误差
p->SumError += p->I * iError; // 误差积分
p->SumError = RANGE_PROTECT(p->SumError, p->T, -(p->T));
Realize = (int32)( (p->P) * iError
+ p->SumError
+ p->D * (iError - p->LastError) );
p->PrevError = p->LastError; // 更新前次误差
p->LastError = iError; // 更新上次误差
p->LastData = NowData; // 更新上次数据
return Realize; // 返回实际值
}
可以使用返回值Realize,加到左右电机的pwm值,从而实现左右电机差速,从而进行转向找灯,可是在实际使用过程中我们发现如果不加增量式pid控制在速度给的很快的时候,车子本该走子直线的时候车子会弯弯曲曲的左转右转,经过上位机对电量的测量,这实际上对电量是一个很大的消耗,而且弯弯曲曲实际的速度也不能做到到很快。
因此之后我们加上了增量式pid,其具体代码如下:
int32 PID_Increase(pPID_t p, int32 NowData, int32 SetData)
{
//当前误差,定义为寄存器变量,只能用于整型和字符型变量,提高运算速度
int32 iError, //当前误差
Increase; //最后得出的实际增量
iError = SetData - NowData; // 计算当前误差
Increase = (int32)(p->P * (iError - p->LastError) + p->I * iError + p->D * (iError - 2 * p->LastError + p->PrevError));
p->PrevError = p->LastError; // 更新前次误差
p->LastError = iError; // 更新上次误差
p->LastData = NowData; // 更新上次数据
return Increase; // 返回增量
}
我们可以使用函数的返回值Increase增加到控制电机转速的pwm波上,从而实现对速度的控制。
4.4上位机调参以及观察电量
我们在调车过程中需要知道许多参数的情况,比如我们车子在实际跑的时候经常会有一顿一顿的时候,这时候我们就需要知道与找到灯的标志位的情况。
以及我们因为是节能组所以需要时刻关注电量消耗的情况,以此来优化车子路径,从而减少耗电行为。
当然在调车最重要的是调整pid的参数,从而使得车子能够及时响应且不会超调而产生震荡。
在以上这么多的情况中都是在车子运行的情况下需要知道的,而在车子运行的情况下实际上一个高速状况下,因此我们不可能通过屏幕来知道这些参数的情况,这种时候就需要我们的上位机来知道这些参数的具体情况从而找到车子的问题,以此对车子进行优化。
我们所使用的上位机为匿名上位机,再加上无限转串口的发射端以及接收端还有相应的代码我们就可以进行上位机就传输数据。
4.5用按键控制是否使用屏幕
在实际调车的过程中我们发现屏幕显示灰度图像实际上对cpu运行有很大的负担从而使得响应变慢,从而对车子产生很大的不好的影响。
因此我们使用按键对其进行控制,当其在车子跑的过程中不使用屏幕,而在车子不跑的时候使用屏幕对参数进行观察。其具体代码如下:
switch(key_flag_1[0])//按键高电平为1,低电平为0;
{
case 1:
ips200_displayimage032(mt9v03x_image[0], MT9V03X_W, MT9V03X_H);//显示灰度摄像头 图像
ips200_drawpoint(light_location[0],light_location1[0],RED);
ips200_showstr(0,201,"light_line="); ips200_showint16(100,201,light_location[0]);
ips200_showstr(0,202,"search_flag="); ips200_showint16(100,202,flag[0]);
ips200_showstr(0,203,"speed0"); ips200_showint32(150,203,speed[0],4);
ips200_showstr(0,204,"speed1"); ips200_showint32(150,204,speed[1],4);
ips200_showstr(0,205,"duty1"); ips200_showint32(150,205,duty1,10);
ips200_showstr(0,206,"duty2"); ips200_showint32(150,206,duty2,10);
ips200_showstr(0,207,"DISTANCE"); ips200_showint32(150,207,DISTANCE[0],10);
ips200_showstr(0,208,"key_flag[0]"); ips200_showint32(150,208,key_flag[0],10);
ips200_showstr(0,209,"key_flag1[0]"); ips200_showint32(150,209,key_flag_1[0],10);
ips200_showstr(0,210,"voltage"); ips200_showfloat(150,210,voltage,10,2);
break;
default:
break;
}
4.6车子运行过程中的补电
因为节能组的原因,因此我们并不像其他组使用电池有充足的电量储备,因此我们需要考虑车子在运行过程中以怎样的路径才是最省电的路径以及怎么样才能跑完全程。
一般有两种选择,一种是在跑前储存足够的电量,另一种是边跑边补电。
经过再三考虑我们选择了边跑边补电,因为这样能够节省很多充电的时间,但是这样对车子控制的要求都比较高。首先是车子本身的路径,一定要在亮灯之间走直线。这就要求pid算法控制的非常好,因此需要非常好的参数,并且最好使用分段pid。
其次是车子要在合适的位置减速,如果不减速的话,由于时间的限制,那么我们肯定选择很高的速度来跑,如果不在距离信号灯合适的地方停下,那么车子很大概率会冲过信号灯,而不能停在信号灯上,因此也不能达到中途补电的目的。也因此我们需要测得车子与信号灯之间的距离,其具体代码如下:
dy=light_line-Dy_center;
temp_uchar=MT9V03X_H-light_row-1;
temp_int16=dy*dy+temp_uchar*temp_uchar;
temp_float=(float)temp_int16;
temp_float=sqrt(temp_float);
distance=(int16)temp_float;
由于需要在距离灯合适的位置停下因此我们往往每换一个前进的速度,就要选择一个合适的距离以及一个合适的缓冲速度。
但是我们依旧害怕跑不完全程,因此我们增加了一个保障措施,即当电量低于5v并且找不到灯的时候(此时车刚好停在灯上)此时程序进入循环并不断检测电量,当电量大于9v跳出循环运行接下来的程序,其具体代码如下:
void car_stop()
{
a=adc_mean_filter(ADC_0,ADC0_CH8_A8,ADC_8BIT,5);
voltage=(a/20.0+0.3)*1.00;
if(voltage<5.00&&flag1==1)
{
while(1)
{
a=adc_mean_filter(ADC_0,ADC0_CH8_A8,ADC_8BIT,5);
voltage=(a/20.0+0.3)*1.00;
if(voltage>9.00)
{
flag1=0;
break;
}
}
}
}
第五章 组装调试
5.1三维建模软件
三维建模软件使用的是Solidworks 2016版本。Solidworks软件功能强大,组件繁多,是目前领先的、主流的三维CAD解决方案之一。SolidWorks能够提供不同的设计方案、减少设计过程中的错误以及提高产品质量。SolidWorks不仅提供如此强大的功能,而且对每个工程师和设计者来说,操作简单方便、易学易用。
5.2硬件开发工具
Altium Designer19 是 Protel 软件开发商 Altium 公司推出的一体化的电子产品开发系统,这套软件通过把原理图设计、电路仿真、PCB 绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,复杂的电路板布局 Altium Designer19 都可以非常容易地设计出有效无误的 PCB 板。同时可以进行文档输出与分享,凭借强大的布线技术,以及丰富的元件库,使用者很方便的完成硬件方面的制作.
。
5.3程序开发工具
本次节能信标组采用的单片机是英飞凌的TC264,英飞凌官方提供了免费的AURIX Development Studio软件进行软件的开发。该软件支持在线仿真,我使用最多的功能是表达式,调试程序的时候能够很方便地查看变量的值。库使用了逐飞提供的开源库,代码条理清晰,使用人性化,很方便。
第六章 技术指标
车模基本参数
- 长/mm 240
- 宽/mm 160
- 高/mm 400
- 重量/g 550
- 超级电容 数量/个 4
- 单节容量/F 25
- 单节耐压/V 2.7
- 总容量/F 6.25
- 总耐压/V 10.8
第七章 结语
上了赛场,就得拿成绩说话。这次比赛我们发挥良好,拿到了大家都满意的成绩,但同时也看到了和强队的差距。做车的日子无疑是辛苦的,但从中学到的知识,和这段调车的时光,相信会是每个人一生的瑰宝。一日智能车人,终身智能车人!
第八章 参考文献
[1] 谭浩强著.C 程序设计.北京:清华大学出版社,2003.
[2] MarkI. Montrose.电磁兼容的印制电路板设计.北京.机械工业出版2012.
[3] 余志生.汽车理论.北京.机械工业出版社.2012.
[4] 童诗白,华成英.模拟电子技术基础[M] .北京: 高等教育出版社,2001.
以上是关于智能车竞赛技术报告 | 节能信标组 - 安徽工业大学 - 摸鱼大队的主要内容,如果未能解决你的问题,请参考以下文章
智能车竞赛技术报告 | 节能信标组-哈尔滨工业大学紫丁香五队
智能车竞赛技术报告 | 节能信标组 - 太原工业学院 - 晋速-天槊星
智能车竞赛技术报告 | 节能信标组 - 北京科技大学节能信标组
智能车竞赛技术报告 | 节能信标组 - 华南理工大学 - 华工雨花队