文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

2021年电赛F题智能送药小车(国二)开源分享

2023-09-07 05:52

关注

文章目录


设计并制作智能送药小车,模拟完成在医院药房与病房间药品的送取作业。 院区结构示意如图1所示。院区走廊两侧的墙体由黑实线表示。走廊地面上画有 居中的红实线,并放置标识病房号的黑色数字可移动纸张。药房和近端病房号(1、2 号)如图1所示位置固定不变,中部病房和远端病房号(3-8号)测试时随机设定。
工作过程:参赛者手动将小车摆放在药房处(车头投影在门口区域内,面向 病房),手持数字标号纸张由小车识别病房号,将约 200g 药品一次性装载到送药小车上;小车检测到药品装载完成后自动开始运送;小车根据走廊上的标识信 息自动识别、寻径将药品送到指定病房(车头投影在门口区域内),点亮红色指示灯,等待卸载药品;病房处人工卸载药品后,小车自动熄灭红色指示灯,开始返回;小车自动返回到药房(车头投影在门口区域内,面向药房)后,点亮绿色指示灯。
在这里插入图片描述


这次比赛因为疫情延期了,给了我们更多的准备(摸鱼)时间,比赛四天三夜,占用了有课的周五(刚好碰上了实习,打铁贼累 还得熬夜。。。)
因为太过摸鱼本以为能那个省三就不错了,没想到冲了个国二,圆梦电赛了,打破了学校十年的记录。所以说竞赛这方面还得坚持,万一破纪录了呢。
我本人是负责视觉方面的,将详细写实现方法,保姆级教程,包括神经网络训练。


由队长赵嘉辉(电控编程)、队员陈为骞(视觉识别)和吴金颖(机械设计)组成,其中两个大四,一个大三。

//两位光电专业、一位机械的hhh

1.要点分析

任务可简单分为3个:
(1)巡线移动。完成最基础的移动功能,是所有功能的基础。本作品采用灰度传感器循迹步进电机的巡线移动方案。
(2)识别病房号数字。可采用openmv、k210、树莓派等视觉单片机识别。由于没有提前准备k210,且树莓派大小、功耗较大,因此采用最常见的openmv。为保证性能足够,采用openmv4plus
(3)双机通信。本作品采用蓝牙双机通信,实现数据共享。
完成以上3个任务后,就是对小车代码逻辑的构思和想法。后面的就是多调试代码,修bug即可。

2.系统方案

电控部分已在立创开源平台发布!比赛准备的全部工程都有!点这里!!
也可以访问:https://oshwhub.com/AngleLeon/gong-ke-sai-xin-hao-zheng-ge-ban_copy
电控代码也在里面。

1、主控拓展电路

主控拓展板

2、步进电机驱动信号整合板

两个步进电机需要两个驱动板,需要较多信号线和电源线,会导致接线较乱、易松。为了稳定性更好,制作了这块信号整合板,并使用了XH2.54红白排插线,连接不易松,且易拔插。

在这里插入图片描述

PCB设计分析

由于主要难度在电控编程上,因此对于PCB的布线难度较小,有一定基础即可,没有需要特别注意的地方。

很多人觉得视觉难,是因为没办法搭建深度学习的训练环境,巧合的是,本人主持的大创项目正好的关于视觉神经网络的,对于懂的人识别数字十分简单,但是要在嵌入式上载入模型,对于小白来说还是有难度的。我这里只介绍一种极简方法,不需要懂神经网络内涵,手把手小白入门教学。
本人比赛使用的是OpenMv4 Plus,这是支持神经网络最低配的一款,当然K210、树莓派等都可以吊打Openmv,但是由于比赛没有准备其他两款,只能选择普普通通的Openmv了。
先上结果:
在这里插入图片描述
在这里插入图片描述

神经网络的训练:

//大神请忽略此部分~~~
在线端训练网站:https://studio.edgeimpulse.com/
在这里插入图片描述

import sensor, image, timesensor.reset()                      # Reset and initialize the sensor.sensor.set_pixformat(sensor.GRAYSCALE) # Set pixel format to RGB565 (or GRAYSCALE)sensor.set_framesize(sensor.QQVGA)   # Set frame size to QVGA (320x240)sensor.set_windowing(20,76,40,40)   #框选位置自己修改成合适的sensor.skip_frames(time = 2000)     # Wait for settings take effect.clock = time.clock()                # Create a clock object to track the FPS.while(True):    clock.tick()                    # Update the FPS clock.    img = sensor.snapshot()         # Take a picture and return the image.    print(clock.fps())              # Note: OpenMV Cam runs about half as fast when connected        # to the IDE. The FPS should increase once disconnected.

然后开始采集,将数字放在左右两边,两边都要采集大概几十到一百张。

在这里插入图片描述下载神经网络后解压导入Openmv,完成。

运行代码:

下面是Openmv端运行代码,代码含模板匹配,移步星瞳官网文档,写得比我好。
Openmv端程序框图:
在这里插入图片描述

主程序:

import time, sensor, image,os,tffrom image import SEARCH_EX, SEARCH_DSfrom pyb import UART#从imgae模块引入SEARCH_EX和SEARCH_DS。使用from import仅仅引入SEARCH_EX,#SEARCH_DS两个需要的部分,而不把image模块全部引入。uart = UART(3, 9600)# Reset sensorsensor.reset()# Set sensor settings# Max resolution for template matching with SEARCH_EX is QQVGAsensor.set_framesize(sensor.QQVGA) #推荐QQVGA,能提高识别速度# You can set windowing to reduce the search image.#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))sensor.set_pixformat(sensor.GRAYSCALE)net = "trained.tflite"          #导入神经网络labels = [line.rstrip('\n') for line in open("labels.txt")] #导入模板# Load template.# Template should be a small (eg. 32x32 pixels) grayscale image.template1 = ["/1.pgm"]template2 = ["/2.pgm"]template3 = ["/3.pgm","/3a.pgm","/3b.pgm"]template4 = ["/4.pgm","/4a.pgm","/4b.pgm"]template5 = ["/5.pgm","/5a.pgm","/5b.pgm"]template6 = ["/6.pgm","/6a.pgm","/6b.pgm"]template7 = ["/7.pgm","/7a.pgm","/7b.pgm"]template8 = ["/8.pgm","/8a.pgm","/8b.pgm"]A0=1A9=1B0=1A1=0A2=0A3=0A4=0A5=0A6=0A7=0A8=0B0=1C0=1C1=0C2=1D0=1D1=1#加载模板图片clock = time.clock()# Run template matchingwhile (True):        clock.tick()        img = sensor.snapshot()        while(A0):                          #开始模板匹配识别手持数字            clock.tick()            img = sensor.snapshot()            t1 = image.Image(template1[0])            r1 = img.find_template(t1, 0.80, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r1:                img.draw_rectangle(r1)                A1=1                A0=0            t2 = image.Image(template2[0])            r2 = img.find_template(t2, 0.80, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r2:                img.draw_rectangle(r2)                A2=1                A0=0            t3 = image.Image(template3[0])            r3 = img.find_template(t3, 0.85, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r3:                img.draw_rectangle(r3)                print('3') #打印模板名字                A3=1                A0=0            t4 = image.Image(template4[0])            r4 = img.find_template(t4, 0.80, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r4:                img.draw_rectangle(r4)                print('4') #打印模板名字                A4=1                A0=0            t5 = image.Image(template5[0])            r5 = img.find_template(t5, 0.80, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r5:                img.draw_rectangle(r5)                print('5') #打印模板名字                A5=1                A0=0            t6 = image.Image(template6[0])            r6 = img.find_template(t6, 0.80, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r6:                img.draw_rectangle(r6)                print('6') #打印模板名字                A6=1                A0=0            t7 = image.Image(template7[0])            r7 = img.find_template(t7, 0.80, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r7:                img.draw_rectangle(r7)                print('7') #打印模板名字                A7=1                A0=0            t8 = image.Image(template8[0])            r8 = img.find_template(t8, 0.85, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))            if r8:                img.draw_rectangle(r8)                print('8') #打印模板名字                A8=1                A0=0        while(A9):#识别到数字,发送指令给主控            if A1==1:                uart.write('1')                print('1') #打印模板名字                num=1                A9=0            if A2==1:                uart.write('2')                print('2') #打印模板名字                num=2                A9=0            if A3==1:                uart.write('3')                print('3')                num=3                A9=0            if A4==1:                uart.write('4')                print('4')                num=4                A9=0            if A5==1:                uart.write('5')                print('5')                num=5                A9=0            if A6==1:                uart.write('6')                print('6')                num=6                A9=0            if A7==1:                uart.write('7')                print('7')                num=7                A9=0            if A8==1:                uart.write('8')                print('8')                num=8                A9=0        while(True):                        #接受到主控指令,可以进行识别数字            while(B0):                    if (uart.any()):                        B = uart.read()                        print(B)                        if B==b'1':print("1")B0=0C0=1            while(C0):                img = sensor.snapshot()         #神经网络识别右边数字                roiL=(20,76,40,40)                for obj in tf.classify(net, img, roiL,min_scale=1, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):                    print("**********\nPredictions at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())                    img.draw_rectangle(obj.rect())                    predictions_list = list(zip(labels, obj.output()))                for i in range(len(predictions_list)):                    print("%s = %f" % (predictions_list[i][0], predictions_list[i][1]))                    num1=ord(predictions_list[i][0])-48                    if predictions_list[i][1]>0.7 and num1==num:                        uart.write('1')                        print('11')                        C1=1                        C0=0                roiR=(89,77,40,40)              #神经网络识别左边数字                for obj in tf.classify(net, img, roiR,min_scale=1, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):                    print("**********\nPredictions2 at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())                    img.draw_rectangle(obj.rect())                    predictions_list2 = list(zip(labels, obj.output()))                for p in range(len(predictions_list2)):                    print("%s = %f" % (predictions_list2[p][0], predictions_list2[p][1]))                    num2=ord(predictions_list2[p][0])-48                    if predictions_list2[p][1]>0.7 and num2 == num:                        uart.write('2')                        print("22")                        C1=1                        C0=0                if C1==0:                    uart.write('0')                    print("00")            print(clock.fps(), "fps")

在这里插入图片描述

如图为车底盘CAD图,使用激光切割亚克力制成。厚度4mm左右。

最终成品图:
在这里插入图片描述

选择自己最擅长的方案。不要去尝试其他不熟悉的方案,因为4天3页时间真的很紧急。打算做控制类一定要把通用代码准备好,如PID,视觉双机通信等。

作为队长要根据每个队员的优势长处设定任务,队长要担任起进度规划的重任,经常是“单核多线程”工作。每个队员都要有强烈的责任感,在选队员上是关键。例如我们队伍有一个机械,负责车组装和3d建模打印等操作,效率极高,半天时间就设计完,一天不到就组装出第一台车,为我们队伍节省了非常多宝贵的调试时间。

运气也是实力的一部分。本次比赛的题目非常符合我们队伍阵容,车控电控、神经网络、机械,完美适配我们三人的优势,也许这些都是命中注定。

颁奖典礼时听王越院士说到:建议电赛以后的题目越来越多的人工智能,现在机器学习、深度学习实在太火了,掌握深度学习这项技能十分重要,如果不懂视觉,这次的电赛可能就没办法打了。

附件

B站演示视频:https://www.bilibili.com/video/BV1Qb4y1i7Sn/

主控电路工程:https://oshwhub.com/AngleLeon/gong-ke-sai-xin-hao-zheng-ge-ban_copy#P5

主控代码:https://download.csdn.net/download/weixin_45902201/76727241

Openmv端代码:https://download.csdn.net/download/weixin_45902201/76727631

想白嫖代码请访问立创开源平台,不想麻烦可以直接下载

来源地址:https://blog.csdn.net/weixin_45902201/article/details/122557717

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯