1.前言
智能送药小车是我在备战2023年电赛时做的训练题。通过研究,我发现网上大多数方案将巡线与数字识别分开实现。然而,我的想法是将这两者结合在一个OpenMV系统中,来模拟在比赛期间缺少了灰度传感器(因为巡线是循红线)的解决方案。(我是使用STC32作为小车的主控来控制其电机的运动,通信就是STC32和openmv的,实际上将串口接收和发送处理好所有单片机都可以使用这个方案)
(训练题目——比较简陋“擦汗emoji”)
2.题目任务
设计并制作一款智能送药小车,模拟完成在医院药房与病房间药品的送取作业。以下是院区结构的示意图(图1),走廊两侧的墙体用黑色实线表示,走廊地面上有一条居中的红色实线,并且放置了标识病房号的黑色数字纸张。药房和近端病房号(1、2号)位置固定不变,而中部病房和远端病房号(3-8号)在测试时会随机设定。
工作过程
-
初始状态:
- 参赛者将小车手动摆放在药房处,使车头的投影位于门口区域内,并使车头面向病房。
-
药品装载:
- 手持数字标号纸张,由小车识别病房号。小车识别后,将约200克药品一次性装载到送药小车上。
-
自动送药:
- 小车在检测到药品装载完成后,自动开始运送。
- 小车根据走廊上的标识信息自动识别病房号,并沿着标识路径寻径,将药品送到指定的病房(车头的投影位于门口区域内)。
-
卸药操作:
- 在病房处,点亮红色指示灯以指示药品送达。
- 病房人员人工卸载药品后,小车会自动熄灭红色指示灯,并开始返回药房。
-
返回药房:
- 小车在返回药房时,确保车头的投影位于门口区域内并面向药房。
- 返回到药房后,小车点亮绿色指示灯,表示药品送取任务完成
3.实现原理
手持数字标号纸张,由小车识别病房号。小车识别后,将约200克药品一次性装载到送药小车上。然后去找到这个指定的数字病房(就好像是一只小狗,我扔出去一个球,然后跑过去捡回来,哈哈哈!!!)。言归正传,我是通过根据不同的任务模式(Find_Task
),执行相应的图像处理任务,例如目标模板的匹配、目标病房的寻找。
-
图像处理与目标检测:
- 通过摄像头获取图像。
- 识别和处理图像中的特定颜色块和模板。
- 根据识别的结果计算偏转角度,控制系统的运动方向。
- 检测十字路口并发送信号。
-
串口通信:
- 通过串口与其他设备进行数据传输,例如发送转向角度或其他控制指令。
-
任务模式处理:
- 根据不同的任务模式(
Find_Task
),执行相应的图像处理任务,例如目标模板的匹配。
- 根据不同的任务模式(
-
巡线功能:
- 实现对图像中预定义路径的跟踪。
主要功能模块
-
UartReceiveDate()
函数:- 处理串口数据接收。
- 解析串口接收到的数据,并根据数据执行不同的操作(如检测十字路口)。
-
FirstFindTemplate(template)
和FindTemplate(template)
函数:- 这些函数用于查找特定的模板图像并返回匹配结果。
- 模板匹配是图像识别中的一种常见技术,通过对比预定义的模板图像与当前图像中的区域来确定匹配程度。
-
xunji()
函数:- 执行巡线功能,检测图像中的颜色块、计算偏转角度,并发送控制信号以调整方向。
ROI
(Region of Interest)区域的定义用于限制搜索范围,提升检测效率。
-
FirstFindedNum()
函数:- 识别手持的数字标号纸张,上传病房号到小车主控。
5.FindedNum()
函数:
1.在小车运动的过程中,不