智能汽车竞赛AI视觉组别,要求采用第十六届全国大学智能汽车竞赛的C型车模,采用恩智浦32位微控制器MIMXRT1064最小系统板作为核心控制单元,主频为600MHZ。我们对小车的机械结构,硬件设计,软件编程方面进行了深入的研究。多次尝试改变小车的机械结构,深入考虑衡量硬件PCB的布局,走线等。软件采用多种算法结合,核心为摄像头循迹与电磁PID控制结合的算法,实现小车鲁棒性较强的寻迹。我们独立完成了控制方案及系统设计,包括电磁信号采集处理、赛道图像信号采集处理、循迹控制算法及执行、动力电机驱动、十分类神经网络训练、靶标图片识别、单片机之间通信等,最终实现了具有AI视觉功能的基于电磁与摄像头的快速寻迹智能车控制系统。
四轮智能车出现直线走偏、转弯费力、轮胎磨损快等情况时大多与轮胎安装角度有关,涉及到一个非常重要的转向轮位置角度定位问题,叫做“前轮定位”。它的作用是保障智能车直线运行时的稳定性,使其转向轻便并减少轮胎的磨损。前轮是转向轮,它的安装位置由主销内倾、主销后倾、前轮内倾和前轮前束等四个项目决定,反映了转向轮、主销和前轴等三者在车架上的位置关系。
从车前后方向看轮胎时,主销轴向车身内侧倾斜,该角度称为主销内倾角。当车轮以主销为中心回转时,车轮的最低点将陷入路面以下,但实际上车轮下边缘不可能陷入路面以下,而是将转向车轮连同整个车模前部向上抬起一个相应的高度,这样车模本身的重力有使转向车轮回复到原来中间位置的效应,因而车模容易回正。
▲图1主销内倾角
从前后方向看车轮时,轮胎并非垂直安装,而是稍微倾倒呈现“八”字形张开,称为负外倾,而朝反方向张开时称正外倾。车模一般将外倾角设定得很小,接近垂直。若设定大外倾角会使轮胎磨偏,降低轮胎摩擦力。
四轮定位前束值脚尖向内,所谓“内八字脚”的意思,指的是左右前轮分别向内。采用这种结构目的是修正上述前轮外倾角引起的车轮向外侧转动。如前所述,由于有外倾,转向变得容易。另一方面,由于车轮倾斜,左右前轮分别向外侧转动,为了修正这个问题,如果左右两轮带有向内的角度,则正负为零,左右两轮可保持直线行进,减少轮胎磨损。在智能车程序基本完整,可以完成各类赛道元素后,根据实际情况对前轮定位进行调整。通过改变上横梁垫片的数目,增大后倾角。在智能车长期调试后,发现适当增大内倾角,可使转弯时车轮和地面有更大的接触面积,继而增大车与地面的摩擦程度,使车转向更灵活,减小因摩擦不够而引起的转向不足的情况。
本车模采用MT9V032摄像头采集赛道信息。摄像头的安装方式是否稳固合理,是其能否采集到优质图像的关键。经过多次尝试调整,最终使用一根碳素杆搭架摄像头的方式,以减轻可能产生的不必要的重量。使用螺母将摄像头支撑杆底部固定在车模中轴线上,保证与车身保持垂直。同时,碳素杆固定在车身左右中心位置,使车模转向时不存在水平分量,保证图像的稳定性。
▲图2摄像头安装效果图
▲图3编码器安装效果图
▲图4电感安装效果图
▲图5智能视觉模块安装效果图
▲图6整车效果图
▲图7主控板
▲图8主控芯片
总钻风摄像头3.3v单独供电,使其电压稳定充足,响应更快。
▲图105V稳压电路
▲图11总钻风摄像头3.3v稳压电路
▲图12蜂鸣器电路
▲图14驱动电路驱动部分
▲图15驱动板
采用opa4377芯片放大四路信号,通过调节电位器来改变放大倍数。
▲图17运放板
将五个电感的走线集成在电感板中,使车模更加美观,信号更不易干扰。
▲图18电磁模块
▲图19电感采集板正面
▲图20电感采集板背面
在单片机采集图像信号后需要对其进行处理以提取主要的赛道信息,同时,由于交叉道、起点线的存在,光线、杂点、赛道远处图像不清楚的干扰,图像效果会大打折扣。因此,在软件上必须排除干扰因素,对赛道进行有效识别,并提供尽可能多的赛道信息供决策使用。
▲图21摄像头采集回传图像
中心线提取算法的基本思想如下:
??1)直接逐行扫描原始图像,根据硬件二值化结果直接提取出边界坐标;
??3)根据采集到的赛道宽度,判断是否采集为真正赛道,滤除噪点造成的影响;
??4)图像是远处小近处大,所以赛道宽度范围和前后行赛道中心的位置差别都要动态调整;
??5)比较左右赛道边界坐标的大小,判断赛道的有效性;
坡道在扫描到特征的那几行,赛道宽度都会突变得特别明显,坡道的赛道宽度突变后不会突变回来,起跑线只是2-3行有明显的赛道宽度变小。据这个特征,当检测到坡道时,目标速度降低,使得小车不会因为速度太快而飞起来,小车通过PID控制,快速通过坡道。
▲图22坡道图
在道路中遇到大弯时需要转弯,转向角只受弯道的弯曲程度影响,但是距离大弯多远就开始转弯却需要受到当前速度的影响,因为舵机在转向时有一定的延时,舵机转60度大约需要140毫秒,而智能车的最快速度可以达到10米/秒,如果智能车当时运行的速度就是10米/秒,那么当舵机转过60度时智能车已经走过1米多了,所以不能等到了弯道才开始转弯,而是需要提前转弯,而且速度越快,越是要提前得多,所以智能车转弯提前多少就由速度控制,用比例控制就能收到很好的效果,而转弯时转多少却仅仅受弯道的弯曲程度控制,弯曲程度越大,转向角就也越大,弯曲程度越小,转向角也就越小。具体的对应关系通过实验获得,在此没有列举出具体的数据。
急弯的方向控制算法与大弯的方向控制算法相似,也是需要提前转弯,而且提前多少转弯也要受当前速度的控制,速度越大,越要提前转弯,转向角也是用弯道的弯道程度来决定的,急弯比大弯的弯曲程度更加大,因此需要的转向角也要相应增大。急弯的方向控制比大弯更难,很可能出线,因此在急弯的方向控制时更应多加注意。
▲图23智能车程序流程图
▲图24单位反馈的PID控制原理框图
单位反馈e代表理想输入与实际输出的误差,这个误差信号被送到控制器,控制器算出误差信号的积分值和微分值,并将它们与原误差信号进行线性组合,得到输出量u。
u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt]
G(s)=U(s)/E(s)=kp[1+1/(TI*s)+TD*s]
其中,
??KP为比例增益,KP与比例带δ成倒数关系即KP=1/δ,TI为积
增量式PID是指数字控制器的输出只是控制量的增量Δu(k)。采用增量式算法时,计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量,而不是对应执行机构的实际位置,因此要求执行机构必须具有对控制量增量的累积功能,才能完成对被控对象的控制操作。执行机构的累积功能可以采用硬件的方法实现;也可以采用软件来实现,如利用算式程序化来完成。由式可得增量式PID控制算式
??u(k)=u(k-1)+u(k)
??Δu(k)=u(k)-u(k-1)=Kp[Δe(k)-e(k-1)]+Kie(k)+Kd[Δe(k)-2Δe(k-1)-e(k-2)]代码实现:
??motor_duty=last_motor_duty+motor_kp*(speed_pc[0]-speed_pc[1])+motor_kispeed_pc[0]+motor_kp(speed_pc[0]+speed_pc[2]?2*speed_pc[1]);
增量式PID具有以下优点:
??1)由于计算机输出增量,所以误动作时影响小,必要时可用逻辑判断的方法关掉。
??2)自动切换时冲击小,便于实现无扰动切换。此外,当计算机发生故障时,由于输出通道或执行装置具有信号的锁存作用,故能保持原值。
??3)算式中不需要累加。控制增量△u(k)的确定仅与最近k次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。在使用过程中我们发现传统的增量式PID,车速控制不及时,容易超调,积分饱和。最终我们选择的是增量式的PID,能够很好的满足智能车的加减速以及停车问题。
在三岔路口需要对路口处的数字进行识别,并根据数字的奇偶性,来决策应该走左边还是走右边。
在赛题中AprilTag码也代表着数字,依然通过识别其所代表的数字,并判断奇偶性来得知靶标牌是在赛道的哪一侧。
赛题中包含动物图案和水果图案,动物类包含狗、猫、马、猪、牛五个子类别,水果类包含苹果、橘子、葡萄、香蕉、榴莲五个子类别,图案对象均为全身或整体照片。
待检测图片内部只包含其中一种物体,不涉及多物体检测。其次待检测图片背景不复杂,全图只有待检物体本身,降低背景噪声的引入对分类模型的影响。待检测物体及其靶标如图25所示。
根据任务分别设计两个十分类的模型,用来实现数字和水果/动物的分类。实现流程相似,主要包括制作数据集,搭建神经网络,模型训练,模型量化,硬件实现五个模块,实现流程如图26所示。
▲图25靶标正面照
到的模块和包的版本如表1:
??用到的包版本号
训练模型之前,我们需要先采集数据然后才能开始训练模型.需要安装任务分别采集数字与动物水果的照片。采集数据共有三种方法。
??1.通过爬虫程序网上下载需要的图片,爬虫程序虽然能很快下载大量的图片,但是存在图片质量低的问题,会下载很多错误的图片,需要手动删除掉。
??2.在网站上人工筛选符合要求的图片,然后一张一张的下载下来,比较费时费力。
??3.OpenARTmini模块拍照并保存图片在SD卡,这种方法图片质量高,符合实际情况。
针对数据集不够的问题,主要解决方法是数据增广。用于增加训练数据集,使得训练的模型具有更强的泛化能力。需要根据自己的数据集特征来确定应该使用哪几种数据增广方式,主要包括:水平翻转,旋转,缩放,噪声等。图27是根据要求制作的原图,图28是数据增广后的数据集部分截图,图29是拍摄的部分图片。
▲图27原始图像
▲图28原始图像数据增强部分后样本
▲图29摄像头拍摄图像数据增强后部分样本
▲图30文件夹分类命名为0-9
使用以上方法生成的图片保存在十个文件夹,命名为0-9。编写脚本从Picture文件夹读取图片并转换为数据集,生成x.npy和y.npy两个文件。部分代码图27所示。
▲图31读取图片转换为npy文件
设计模型进行训练之前,要进行数据预处理。在进行深度神经网络训练时,一般要求输入的数据范围在(-1,1)或(0,1)之间。对数据拆分,将其划分为80%的训练集与20%测试集,训练集用于模型自身迭代,测试集用于诊断模型能力。然后,对数据进行归一化处理,并通过to_categorical函数将标签数据转换为one-hot码.本设计要训练一个10分类的网络,那么要将标签(图片所对应的类别号)转换为长度为10,并且仅有其所对应的类别号的位置的数据为1,其余均为0,这样一组n维向量就被称为one-hot码,以方便网络进行迭代学习。
表2用到的库、模块和函数Keras有两种排布的方式,一种是Sequential方式,一种是Function方式。前者像是串冰糖葫芦,每一个都是一个单独的个体,小兵之间是顺序排列的,不能前后颠倒,不能互通有无。而Function方式,像是各自组队,可以一起也可以分开,但是最终还是一个整体,简单的说,Sequential方式使用简单,但是,只能搭建那些串行网络。而Function方式,则可以根据不同需求,进行排列布阵,形成各种各样的阵型,搭配到一起使用,就像是编程时候用到的函数。
本设计将主要采用Sequential模型构建模式,相对来说,0-9数字数据集颜色特征很少,数据集数目小,因此搭建一个具有3层卷积和1层全连接的简单卷积神经网络3Conv+1Dense的CNN。如图30所示,该卷积神经网络的中间层采用rule激活函数,输出层采用softmax激活函数。
在动物/水果十分类任务中,每一类原始图片分别有100张左右,经过数据集增广至每类2000张左右,总共2万张左右。同样搭建一个具有3层卷积和1层全连接的简单卷积神经网络,该卷积神经网络的中间层采用rule激活函数,输出层采用softmax激活函数。与数字分类不同的是,如图31所示,每个激活层前面添加BatchNormalization层,使训练过程更加稳定,提高训练速度,并且减少过拟合。在池化层后面加dropout层,随机丢弃一部分中间特征,防止模型过拟合。
优化器负责模型的调优,学习率(lr)的设置有讲究,过大的学习率会提高模型的学习速度,但是太大了可能反而适得其反,还可能会导致模型无法得到最优解;而过小的学习率,会导致训练速度过慢,陷入局部最优不能自拔,选择上要进行试错调整,这里选择opt=Adam(lr=0.001)。这里的评价标准,选择categorical_crossentropy,这也是专门适用于多分类问题的损失函数。这里的epochs代表总共迭代遍历数据集多少多少次,batch_size为一次迭代需要使用多少数据。小了能让模型迭代快,但是训练效果容易震荡,还妨碍学到全局特征;大了能让学习过程更平稳,但模型收敛效率会下降,还可能陷入局部最优。回调函数ModelCheckpoint负责模型的保存,会将训练过程中遇到的最好结果即时保存下来。数字分类模型训练部分代码如图32所示。
▲图323*Conv+1*Dense的CNN(数字任务)
▲图33模型训练
训练好的模型用可视化模型结构工具Netron进行查看。本设计搭建的网络模型如图34、图35所示。
▲图34Netron可视化数字分类网络模型结构
▲图35可视化动物/水果分类网络模型结构
▲图36NNCU模型转换器
模型文件已经量化完毕,接下来我们量化之后的模型文件放入OpenARTmini中跑起来。实现步骤的流程图如下图37。
▲图37模型载入流程图
运行模型进行模型预测,识别到带黑框的图片后可通过串行终端界面看到提示数据。实现结果表明,识别准确度较高与实时性较好,模型运行效果良好。实现结果如图38至图42图像所示。
▲图38水果识别正确示例-葡萄
▲图39水果识别正确示例-香蕉
▲图40动物识别正确示例-猪
▲图41动物识别正确示例-马
图42分类错误,结果正确示例本设计分别对0-9数字图片和十种水果动物进行识别,实际测试中调整合适光照以及图片大小,识别的准确率如下表3所示。
▲表3数据集及其识别准确率
利用上文提到的openmvIDE,采用python编程控制openartmini模块及其外设。任务实现流程图如图43所示。
▲图43任务实现流程图
AprilTag的家族为TAG25H9,包含0-34共35个数字,只需识别0-9。首先制作AprilTag,直接从OpenMV的IDE里生成。如图所示。
▲图44TAG25H90-9
由于openartmini模块自带识别AprilTag库函数,调用函数即可识别。
我们使用了两个数字舵机,设定舵机频率均为200HZ,控制信号来自openartmini模块给出的两个PWM信号。下方舵机实际控制角度范围为180°,用于改变摄像头方向,以便寻找待识别图像。上方舵机的控制信号保持不变,作用是稳定摄像头支架。
▲图46按键液晶调试
实际测试时,先使用串口转TTL模块在电脑端进行测试,使用串口助手界面如下,简单大方,满足测试需求。后续测试与主控单片机能够进行正常通信。
▲图47串口助手调试界面
报名参加“恩智浦杯”智能汽车竞赛,我们遵循学习知识第一,志同道合友谊第一,比赛获奖第二的原则。
在控制方面,我们使用比赛推荐的开发工具调试程序,充分利用上位机等工具以提高效率经过小组成员不断研讨、争论、改进,终于设计出三套适用于不同情况下的,稳定的程序。
这段历程,我们一同熬过无数个日夜,熟悉了彼此也成长了自己。从走时关灯到天亮了记得把灯,关上实验室就像我们另一个家。这段经历将永伴我们一生。比赛很艰辛,但我们享受其中的快乐,受益匪浅,智能车竞赛的历程会成为我们最珍贵的回忆。
公众号TsinghuaJoking主笔。清华大学自动化系教师,研究兴趣范围包括自动控制、智能信息处理、嵌入式电子系统等。全国大学生智能汽车竞赛秘书处主任,技术组组长,网称“卓大大”。