【全国一等奖】F题:智能送药小车,2021年全国大学生电子设竞赛

2023-05-16

01 

 

前 言

大家好,我是张巧龙,今天给大家带来关于21年F题的分享:智能送药小车,出了这个题目之后,咋一看,好像比较简单。

不过大家慢慢做,越往后做越发现,坑越来越多。

第一个问题:数字识别率不高,我对识别率高低的看法:只要不到100%,哪怕出现1%的误识别率,我认为都不行,为什么?

因为,题目明显给出说明,每个项目只测试一次。也就是说,小车一旦出错,就0分,没有再测的机会。

第二个问题:小车巡线的问题,一谈到巡线,大家想到的肯定是,循迹模块(颜色识别传感器),这个没问题,可以用,也可以用摄像头来寻迹。

不知道大家是否有发现过,车运动的轨迹都是直线,转弯都是90度,循迹模块或者摄像头寻迹确实可以用。

但运动过程中,需要一直巡线,对摄像头或者是循迹模块的要求比较高,环境的光线要求比较稳定。

为了提高巡线的稳定性,我认为可以直接采用电机编码器来写闭环,将小车运动的路程直接固定死,每次都是走固定直线距离后再识别数字,拐弯也可以直接固定,毕竟都是90度。


当然,这个过程中,肯定需要颜色识别模块或者摄像头寻迹来做辅助。

来吧,看视频展示,文字内容在后文。

【全国一等奖】F题:智能送药小车

对了,由于是电机直接闭环,所以本视频中小车的运动速度还可以继续提升。

02

 

系统方案

2.0 摘要

以STM32单片机为核心、结合视觉识别技术,通过速度闭环来控制智能送药小车,并实现双车在预定轨道上送药,取药。

基本模块主要包括主控、摄像头、直流减速电机、驱动模块,无线传输模块,本设计主控选择STM32F103RCT6。

在摄像头识别中,采用双摄像头方案,K210用于识别数字和寻找对应数字并通过串口向主控发送识别信息,从而进入对应的病房,OpenMV用来寻迹,防止小车偏离预定轨道;

小车1,2通过ZiGBee来完成双车通信,实现双车协同运送的效果;通过电机编码器反馈的信息设计小车的速度闭环控制系统,实现运输距离的精准控制。

经过检测发现,本设计具有识别速度快,识别精准度高,运输稳定且效率高等优点。

4e2e4160049e71dcea4d7660d9f8b906.png

2.1 方案设计

2.1.1 控制方案设计

根据题目要求,将小车系统分为4个基本模块,包括主控模块、电机驱动模块、视觉检测和识别模块,无线通讯模块,主控选择STM32F103RCT6,通过速度闭环来实现电机驱动的精准控制。

视觉识别中,寻迹采用OpenMv摄像头,数字识别采用K210摄像头。

无线通信选择ZIGBEE实现两车之间的通讯,系统的总体设计框图如图1所示。

5ff7136151ae72bdb89030bbe569f730.png

图1  系统总体设计框图

2.1.2 机械结构方案

由于题目要求小车的长宽高不能超过25cm*20cm*25cm,再加上赛道的宽度只有30cm,为了保证转向的时候能够避免碰到黑实线,我们采用双驱动置于车身中间,车身前后分别装置牛眼轮便于转向。

根据设计要求和实际情况,两个摄像头安装于车头前端,OpenMv在下,K210在上,以便于识别和检测。

由于识别数字时数字宽度较大,K210无法全部识别到数字,所以搭配舵机,实时调整摄像头的位置来达到扩大视野范围的目的。

a7df3fa6eb322d2958d791905d12d1f8.png

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两组像素的个数在整体图像中所占百分比可得:

9044230b49f3ff9eb4cdd6ab66fc891b.png

362d0cdbf500dab4ed320f9ab4693e5c.png

紧接着,运用计算机视觉的线性回归(Linear Classification)算法进行寻线,线性回归能找到视野中任何的线,但是处理速度就会很慢。

为了能更快的寻到我们想要的轨迹,把颜色调为灰度,不去处理追踪颜色,图像大小设成QQVGA,缩小图像面积,来增加速度。

最后向STM32提供反馈信息,控制电机进行自动寻径。

2.4 小车电机运动闭环控制算法

依靠编码器反馈数值,通过速度闭环解决对小车行驶距离的把控,本小车所采用的PID算法是闭环控制系统中常用的控制算法之一,其全称为比例积分微分控制。

其传递函数如下:

7bc27f36c1495d9b149393ebd653668d.png

再配合OpenMv二值化处理寻线辅助和K210数字识别并将相关数据通过串口反馈给主控板最终实现小车的精准控制。

通过配置串口的波特率便可以控制串口通讯的速率。

为保证数据接收正常,本设计通过对控制系统中的STM32F103RCT6单片机进行编写通信协议程序,以防止无线接收模块在受到干扰的情况下收到错误指令而使小车失控的情况发生。

03

 

程序设计

3.1  程序设计思路

3.1.1 小车1的程序设计思路

在识别目标病房号后,判断是否为近端,如果为近端则直接第一个十字路口转对应方向,否则直行至第二路口,判断是否为目标数字。

如果是,则转对应方向,否则直行至T型路口左转,判断判断是否为目标数字,如果否,则转至T型路口对面,识别目标数字方位并转弯。


识别虚线点后停车,发送位置信号给小车2,同时检测小车2回馈信号和药品是否卸载,在卸载药品完成条件下,如果检测到回馈信号则为双车模式,等待小车2,发送到达指定位置信号,则开始启动返回,否则为单车模式,直接按记忆路线返回。

8107b8057c24b7865d28746dfede67cd.png

图1  小车1程序设计流程图

3.1.2 小车2的程序设计思路

发送反馈信号给小车1,开始识别目标病房号,检测是否装药,如未装药且接收到小车1位置指令,则取药模式,运行到T型路口处小车1对面支路并识别是否为目标数字,如果否,则转至T型路口对面,识别目标数字方位并转弯,识别虚线点后停车。


如装药且接收到小车1位置指令,则送药模式,小车2运行到指定位置停车且发送反馈信号,当接收到小车1继续运行指令则倒车回十字路口识别目标数字方位并转弯,识别虚线点后停车。

9f61ce5f0c2ddd518a5d22b608e8d689.png

图2  小车2程序设计流程图

04

 

总结


此方案,可行性较高,关键点有3个,分别是电机编码器位置闭环、K210训练识别数字、OPENMV巡线,其实这些内容我在21年电赛开赛前就说过,不知道大家还有没有印象:

关于21年电赛,这些一定要熟悉!(点击即可跳转阅读)

关于2021年电赛的一些想法,看到就是赚到!(点击即可跳转阅读)

现在回过头来看看,确实有一些参考价值。


由于篇幅有限,过多的细节在此不放了,有需要详细设计报告以及代码的,请加微信:great_xiaolong,加好友记得备注。

对了,近期会陆陆续续开源电赛所有题目的方案,有兴趣的朋友们可以关注下。

当然,想来分享自己电赛心得体会的可以加我微信,进行投稿,一旦录用,有稿费哦~

811c03fb34c89f1f2a6acbeb4b929524.png


精彩推荐:点击图片即可跳转阅读

132e0c00e1e1507c8ebc31c665339165.png

带学生参加电赛,5个国一,2个国二!15个省奖!

402f194c93d198d1a73427cb84cf04c7.png

【STM32入门】这个项目绝了,用手势来产生波形!

1fc52b4f88d77d14362d15af5c72e12e.png

电烙铁焊锡到底有没有毒?

近期会近期会开源电赛所有题目的方案,欢迎大家关注公众号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【全国一等奖】F题:智能送药小车,2021年全国大学生电子设竞赛 的相关文章

随机推荐

  • slambook2+ch7+orb_self 源码的一点小问题

    slambook2 43 ch7 43 orb self 源码的一点小问题 43 解读 源码详细解读小错误调试 xff0c 有的真的属实自己菜运行结果 源码详细解读 下面是一些个人的见解内联代码片 span class token comm
  • 运行相机与vins_Fusion

    安装相机的SDK git clone https github com slightech MYNT EYE D SDK git cd MYNT EYE D SDK make init make all 这里由于没有添加依赖 xff0c O
  • 无刷无霍尔BLCD电机控制

    声明 xff1a 本文出自百度文库无刷无霍尔电机控制 xff0c 因为该文为繁体 xff0c 看起来特别别扭 xff0c 特此翻译 文库网址 xff1a https wenku baidu com view b99217dca0116c17
  • stl的中常用几个容器的介绍与特点。

    lt 1 gt vector容器 vector容器是一个动态数组的结构 xff0c 在内存中有一个指针指向一块连续的内存 类似数组结构一样 它的特点支持随机访问数据 xff0c 因为其在内存中的单元是连续 如此之外 xff0c 还可以vec
  • 关闭优化选项

    这里没有调用拷贝构造函数 xff0c 按照C 43 43 机制 xff0c 应该是会调用的 想起来 xff0c 以前最初写拷贝构造函数的时候也是跟预想的调用不一致 记得编译器会自动优化掉临时对象的 比如 在一个函数中 return list
  • WIFI学习一(socket介绍)

    一 什么是socket socket译为 插座 xff0c 在计算机通信领域 xff0c socket被翻译为 套接字 xff0c 它是计算机之间进行通信的一种约定或一种方式 通过这种方式 xff0c 一台计算机可以接受其他计算机的数据 x
  • 两台电脑实现串口通信

    本文主要介绍串口传输文件的练习 将两台笔记本电脑 xff0c 借助 usb转rs232 模块和杜邦线 xff0c 建立起串口连接 然后用串口助手等工具软件 xff08 带文件传输功能 xff09 将一台笔记本上的一个大文件 xff08 图片
  • VScode前进和后退按钮,非快捷键

    在网上找了半天 xff0c 不喜欢用快捷键 xff0c 喜欢鼠标点击 xff0c 费了好长时间发现这个插件 Back amp Forth xff0c 安装后可以在右上角出现前进和后退按钮 xff0c 如下图
  • Nonce验证

    验证可能会涉及 span class token keyword def span span class token function getNonce span span class token punctuation span span
  • DJI飞行器 精准降落功能测试

    概述 xff1a 该功能仅在自动返航至起飞点 Auto RTL 时生效 xff0c 飞行器降落环境需要足够的照明和没有障碍物的区域 使用该功能后 xff0c 飞行器将使用底部的两个视觉传感器记录起飞时的地形纹理信息 xff0c 并根据记录的
  • 带学生参加电赛,5个国一,2个国二!15个省奖!

    大家好 xff0c 我是张巧龙 xff0c 转眼21年的各省电赛就结束了 xff0c 今年的电赛确实让人难忘 xff0c 不管是题目还是比赛形式 xff0c 亦或是比赛时间一拖再拖 国赛结果也在前段时间公示了 xff0c 参与人数再次增长
  • 【JAVA基础篇】内部类

    定义在一个类内部的类称为内部类 内部类访问权限可以是public protected default或private xff0c 可以声明为abstract供其他内部类或外部类继承 xff0c 可以声明为static final xff0c
  • CURL 是什么

    cURL是一个利用URL语法在命令行下工作的文件传输工具 xff0c 1997年首次发行 它支持文件上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称cURL为下载工具 cURL还包含了用于程序开发的lib
  • STM32F103C8T6 gps串口数据处理

    基于stm32f10x系列单片机demo程序修改 配置串口 void USART1 Config void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitSt
  • RS-485总线布线规则及方法

    摘要 xff1a 本文阐述了RS 485双向串行总线的特点 RS 485总线在实际应用中的布线规则 拓扑结构和匹配电阻的连接方法 可供有关技术人员在RS 485总线设计和施工时做参考 关键词 xff1a RS 485 总线 规则 方法 前言
  • jetson nano 基础设置

    关闭图像界面 span class token function sudo span systemctl set default multi user target 开启图像界面 span class token function sudo
  • Android JNI Java/C++互相调用

    一 xff0c Java 调用 C 1 xff0c 首先我们创建一个文件名字叫做 xff0c JNI 其实你不创建也行 看自己 public class JNI 加载本地C语言文件库 库名字为你写的C语言文件名 static System
  • STM32串口空闲中断,中断标志位无法清除

    本节目录 今天想使用STM32的串口空闲中断作接收 xff0c 调了1个小时 xff0c 发现串口空闲中断无法被清除 xff0c 网上搜索半天发现 xff0c 能用清除的库函数清除该中断 我又回头看了一下手册 果真如此 xff0c 问题已解
  • CMake系列(八) CMake 多级目录

    CMake系列 xff08 八 xff09 CMake 多级目录 文章目录 CMake系列 xff08 八 xff09 CMake 多级目录目录结构结构说明调用关系 源文件CMakeLists txt最外层CMakeListsmain的CM
  • 【全国一等奖】F题:智能送药小车,2021年全国大学生电子设竞赛

    01 前 言 大家好 xff0c 我是张巧龙 xff0c 今天给大家带来关于21年F题的分享 xff1a 智能送药小车 xff0c 出了这个题目之后 xff0c 咋一看 xff0c 好像比较简单 不过大家慢慢做 xff0c 越往后做越发现