01
前 言
大家好,我是张巧龙,今天给大家带来关于21年F题的分享:智能送药小车,出了这个题目之后,咋一看,好像比较简单。
不过大家慢慢做,越往后做越发现,坑越来越多。
第一个问题:数字识别率不高,我对识别率高低的看法:只要不到100%,哪怕出现1%的误识别率,我认为都不行,为什么?
因为,题目明显给出说明,每个项目只测试一次。也就是说,小车一旦出错,就0分,没有再测的机会。
第二个问题:小车巡线的问题,一谈到巡线,大家想到的肯定是,循迹模块(颜色识别传感器),这个没问题,可以用,也可以用摄像头来寻迹。
不知道大家是否有发现过,车运动的轨迹都是直线,转弯都是90度,循迹模块或者摄像头寻迹确实可以用。
但运动过程中,需要一直巡线,对摄像头或者是循迹模块的要求比较高,环境的光线要求比较稳定。
为了提高巡线的稳定性,我认为可以直接采用电机编码器来写闭环,将小车运动的路程直接固定死,每次都是走固定直线距离后再识别数字,拐弯也可以直接固定,毕竟都是90度。
当然,这个过程中,肯定需要颜色识别模块或者摄像头寻迹来做辅助。
来吧,看视频展示,文字内容在后文。
【全国一等奖】F题:智能送药小车
对了,由于是电机直接闭环,所以本视频中小车的运动速度还可以继续提升。
02
系统方案
2.0 摘要
以STM32单片机为核心、结合视觉识别技术,通过速度闭环来控制智能送药小车,并实现双车在预定轨道上送药,取药。
基本模块主要包括主控、摄像头、直流减速电机、驱动模块,无线传输模块,本设计主控选择STM32F103RCT6。
在摄像头识别中,采用双摄像头方案,K210用于识别数字和寻找对应数字并通过串口向主控发送识别信息,从而进入对应的病房,OpenMV用来寻迹,防止小车偏离预定轨道;
小车1,2通过ZiGBee来完成双车通信,实现双车协同运送的效果;通过电机编码器反馈的信息设计小车的速度闭环控制系统,实现运输距离的精准控制。
经过检测发现,本设计具有识别速度快,识别精准度高,运输稳定且效率高等优点。
2.1 方案设计
2.1.1 控制方案设计
根据题目要求,将小车系统分为4个基本模块,包括主控模块、电机驱动模块、视觉检测和识别模块,无线通讯模块,主控选择STM32F103RCT6,通过速度闭环来实现电机驱动的精准控制。
视觉识别中,寻迹采用OpenMv摄像头,数字识别采用K210摄像头。
无线通信选择ZIGBEE实现两车之间的通讯,系统的总体设计框图如图1所示。
图1 系统总体设计框图
2.1.2 机械结构方案
由于题目要求小车的长宽高不能超过25cm*20cm*25cm,再加上赛道的宽度只有30cm,为了保证转向的时候能够避免碰到黑实线,我们采用双驱动置于车身中间,车身前后分别装置牛眼轮便于转向。
根据设计要求和实际情况,两个摄像头安装于车头前端,OpenMv在下,K210在上,以便于识别和检测。
由于识别数字时数字宽度较大,K210无法全部识别到数字,所以搭配舵机,实时调整摄像头的位置来达到扩大视野范围的目的。
2.2 数字识别方法
首先将1-8字模原比例打印出来,然后用K210进行模型训练,模型训练了几千张模型,生成训练样本矩阵,一般样本是以二维矩阵的方式存在文件当中,现在要将它们读出来,进行适当的预处理,然后生成OpenCV能理解的数据结构。
其中包含了分别从不同的视角对图像进行采集入库,在通过NCC模板匹配训练产生数字分类器,训练样本中的数字位置形态各异,因此读入时需要进行规整化。
主要方法是先找到数字的边界框,然后以宽和高中大的一边为基准进行缩放和拉伸,从而使得其可以占满整个表示单个样本的矩阵。
再将其图像二值化,进行腐蚀分割,前面通过学习产生了分类器,但我们输入图像中的数字并不能直接作为测试输入。图像中的数字笔画有时并不规整,还可能相互重叠。
接下来,就可以对图像进行分割了。由于我们的分类器只能对数字一个一个地识别,所以首先要把每个数字分割出来。分割完后就可以应用我们前面训练好的分类器对分割结果进行识别。
2.3 自动寻径方法
首先对图像进行相关预处理,图像采集和传输过程中可能产生噪点,通过图像灰度化和图像滤波减小对图像处理的干扰。
其次摄像头采集跑道上的红线,通过硬件二值化处理,这里用到最大类间方差法(Otsu)来实现图像二值化阈值选取:
Otsu算法的基本思想是用某一假定灰度值t将图像的灰度分成两组,当两组的类间方差最大时,此灰度值t就是图像二值化的最佳阈值。
设图像有L个灰度值,取值范围在0~L-1,在此范围内选取灰度值T,将图像分成两组G0和G1,GO包含的像素的灰度值在0~T,G1的灰度值在T+1~L-1,用N表示图像像素总数,n, 表示灰度值为i的像素的个数。
已知:
每一个灰度值i出现的概率为p=n/ N;假设GO和G1两组像素的个数在整体图像中所占百分比可得:
紧接着,运用计算机视觉的线性回归(Linear Classification)算法进行寻线,线性回归能找到视野中任何的线,但是处理速度就会很慢。
为了能更快的寻到我们想要的轨迹,把颜色调为灰度,不去处理追踪颜色,图像大小设成QQVGA,缩小图像面积,来增加速度。
最后向STM32提供反馈信息,控制电机进行自动寻径。
2.4 小车电机运动闭环控制算法
依靠编码器反馈数值,通过速度闭环解决对小车行驶距离的把控,本小车所采用的PID算法是闭环控制系统中常用的控制算法之一,其全称为比例积分微分控制。
其传递函数如下:
再配合OpenMv二值化处理寻线辅助和K210数字识别并将相关数据通过串口反馈给主控板最终实现小车的精准控制。
通过配置串口的波特率便可以控制串口通讯的速率。
为保证数据接收正常,本设计通过对控制系统中的STM32F103RCT6单片机进行编写通信协议程序,以防止无线接收模块在受到干扰的情况下收到错误指令而使小车失控的情况发生。
03
程序设计
3.1 程序设计思路
3.1.1 小车1的程序设计思路
在识别目标病房号后,判断是否为近端,如果为近端则直接第一个十字路口转对应方向,否则直行至第二路口,判断是否为目标数字。
如果是,则转对应方向,否则直行至T型路口左转,判断判断是否为目标数字,如果否,则转至T型路口对面,识别目标数字方位并转弯。
识别虚线点后停车,发送位置信号给小车2,同时检测小车2回馈信号和药品是否卸载,在卸载药品完成条件下,如果检测到回馈信号则为双车模式,等待小车2,发送到达指定位置信号,则开始启动返回,否则为单车模式,直接按记忆路线返回。
图1 小车1程序设计流程图
3.1.2 小车2的程序设计思路
发送反馈信号给小车1,开始识别目标病房号,检测是否装药,如未装药且接收到小车1位置指令,则取药模式,运行到T型路口处小车1对面支路并识别是否为目标数字,如果否,则转至T型路口对面,识别目标数字方位并转弯,识别虚线点后停车。
如装药且接收到小车1位置指令,则送药模式,小车2运行到指定位置停车且发送反馈信号,当接收到小车1继续运行指令则倒车回十字路口识别目标数字方位并转弯,识别虚线点后停车。
图2 小车2程序设计流程图
04
总结
此方案,可行性较高,关键点有3个,分别是电机编码器位置闭环、K210训练识别数字、OPENMV巡线,其实这些内容我在21年电赛开赛前就说过,不知道大家还有没有印象:
关于21年电赛,这些一定要熟悉!(点击即可跳转阅读)
关于2021年电赛的一些想法,看到就是赚到!(点击即可跳转阅读)
现在回过头来看看,确实有一些参考价值。
由于篇幅有限,过多的细节在此不放了,有需要详细设计报告以及代码的,请加微信:great_xiaolong,加好友记得备注。
对了,近期会陆陆续续开源电赛所有题目的方案,有兴趣的朋友们可以关注下。
当然,想来分享自己电赛心得体会的可以加我微信,进行投稿,一旦录用,有稿费哦~
精彩推荐:点击图片即可跳转阅读
带学生参加电赛,5个国一,2个国二!15个省奖!
【STM32入门】这个项目绝了,用手势来产生波形!
电烙铁焊锡到底有没有毒?
近期会近期会开源电赛所有题目的方案,欢迎大家关注公众号。