送药小车集训总结

在十一假期中做了2021年的国赛题送药小车,这道题看上去不难实则有点难度,即使在吸取前人的经验后仍然踩了不少的坑。我们采取的方案是双步进电机+万向轮作为车体,七路灰度模块循迹,并使用K210运行Tinyyolov2神经网络进行数字识别,我主要负责搭赛道和K210的程序编写。

赛道搭建

搭赛道

由于先前的赛道折叠放在实验室太久,只能撕了重新搭建赛道。在铺设赛道的过程中发现电工胶布会收缩使赛道进一步变皱,在四角用透明胶拉紧才勉强使赛道铺平。所以这道题有条件的话最好还是用CAD绘图和喷绘打印,不仅节省时间还能减小干扰。

视觉部分

这道题其实用Openmv的模板匹配也可以做,但是由于想要尝试一下神经网络,我还是选择了有硬件加速的K210。这里使用了MaixHub的云端训练,不用配置环境,比较方便,训练速度和效果也都不错。在结构确定后我花了半天时间采集了1800张数据集并进行打标(这是一个纯体力活,建议让没什么事情的人来搞定,在这段时间里我让负责控制的wsj先默认收到了一个数字开始调逻辑)。
采集完的识别率达到95%,但是数字1极其容易识别成7或者4,后续发现斜着放就有不错的识别率。
数据集采集
模型训练

然后再加入串口通信,可以把识别到的数字发给主控。

原本视觉部分到这里就结束了,但是还有一个问题没解决。由于行动中难以精确识别数字,并且画面中同时出现多个数字的时候并不能按预期那样的全识别到。讨论了一下决定通过视觉判断到数字附近停下,左右转分别识别单个数字(这里要是结构上装了舵机会更好一点,但是由于再改结构比较麻烦,只能采用整体左右转向的方案)。于是第一代方案便成了识别红线停车。

其实我一开始是拒绝的,因为让K210去做这种识别肯定是不如Openmv的,况且同时运行神经网络和色块识别的帧率低的可怜,后来因为实在没有其他代替方案,选择让主控芯片向K210发数据选择模式。

read_data = uart.read(3)
if read_data:
    read_data.decode('utf-8')
    if read_data[0] == 0x2c and read_data[2] == 0x5b:
        recFlag = read_data[1]

if recFlag == 0:  # 数字识别模式
    t = time.ticks_ms()
    objects = kpu.run_yolo2(task, img)
    t = time.ticks_ms() - t
    if objects:
        for obj in objects:
            pos = obj.rect()
            img.draw_rectangle(pos)
            img.draw_string(pos[0], pos[1], "%s : %.2f" % (labels[obj.classid()], obj.value()), scale=2,
                            color=(255, 0, 0))
            if obj.value() > 0.65:
                data1 = int(labels[obj.classid()])
        uart_data = bytearray([0x2c, data1, 0x5b])
        uart.write(uart_data)

elif recFlag == 1: # 红线识别模式
    t = time.ticks_ms()
    blobs = img.find_blobs([red_threshold], roi=roi1)
    t = time.ticks_ms() - t
    data2 = 0
    if blobs:
        maxb = find_max(blobs)
        img.draw_rectangle(maxb[0:4])
        if maxb.w() > 200:
            img.draw_cross(maxb[5], maxb[6])
            uart_data = bytearray([0x2c, 0xff,0xff, 0x5b])
            uart.write(uart_data)

大概思路是主控检测到数字识别完毕后把K210的模式切换为红线识别,识别到红线停车后再改为数字识别,这样就能利用K210有限的资源实现数字、红线的识别了。刚开始确实非常顺利,但是试验的次数多了就发现小车经常没有停下,或者是停的太晚识别不到数字。我觉得这就是K210的局限性所在,没有办法了,要不然就上Openmv算了。但是王世杰觉得可以识别黑色色块。

我听到这个直接就否决了,因为红线色块这么大都识别不到,更何况这么小的黑色色块,况且要识别这么小的色块还不好滤杂波,赛道上要是有一点脏东西就会误判。但事实是我被打脸了,在我极不情愿地修改完阈值、ROI和滤波再把代码烧一遍后,原以为小车会出各种BUG,但结果却是,一直到最后停车成功率都极高。好吧wsjnb。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年8月16日
下一篇 2023年8月16日

相关推荐