立创梁山派-21年电赛F题-智能送药小车-赛题分析

[复制链接]

10

主题

10

帖子

71

积分

一粒轻沙

Rank: 1

积分
71
楼主
查看: 2442回复: 0 发表于 2023-7-12 15:14:21   只看该作者
立创开源平台资料:https://oshwhub.com/li-chuang-kai-fa-ban/21-dian-sai-f-ti-zhi-neng-song-yao-xiao-che




代码仓库:https://gitee.com/lcsc/medical_car




题目分析结构相关
  • 小车长×宽×高不大于 25cm×20cm×25cm,只能使用普通车轮。在转弯时不能碰到走廊边缘,所以小车要尽可能小,越小越不容易碰到走廊边缘。
  • 药品重约 200g。

硬件相关
  • 两个小车均由电池供电。
  • 两车之间要能无线通讯。
  • 外界不能有任何附加电路与控制装置。
  • 要有一个 RGB 灯(通过不同的 PWM 值控制来切换颜色)或者直接三个红,黄,绿灯。
  • 作品应能适应无阳光直射的自然光照明及顶置多灯照明环境,测试时不得有特殊照明条件要求。

软件相关
  • 每次测试开始时,只允许按一次复位键,装载药品后即刻启动运送时间记时,卸载药品后即刻启动返回时间记时。不能人工干预,测试项目只能测试一次
  • 在药房处识别病房号的时间不超过 20s,发挥部分 1 中自选暂停点处的小车 2 与小车 1 的车头投影外沿中心点的红实线距离不小于 70cm。
  • 有任何一个指示灯处于点亮状态的小车必须处于停止状态,运送过程中不允许在同一走廊上错车或超车。

功能(得分)相关
  • 近端病房号位置固定不变,中部病房和远端病房号(3-8 号)在测试时随机设定。
  • 检测到药品装载完成后就开始自动运送。
  • 单个小车运送药品到指定的近端病房并返回到药房,运送时间和返回时间均小于 20s,超时扣分。

基本要求
  • 根据走廊上的标识信息自动识别,寻径将药品送到指定病房,投影要在门口区域内,
  • 到了指定病房后,点亮红色指示灯,等待卸载药品。
  • 人工卸掉药品后,小车自动熄灭红色指示灯,开始返回。
  • 自动返回药房,点亮绿色指示灯

发挥部分
  • 两个小车协同运送到同一指定的中部病房,小车 1 到达病房后等待卸载药品,小车 2 识别病房房号装载药品后启动运送,到达自选暂停点后暂停,点亮黄色指示灯,等待小车 1 卸载;小车 1 卸载药品后开始返回,同时控制小车 2 熄灭黄色指示灯,继续运送。(从小车 2 启动运送开始,到小车 1 返回药房且小车 2 到达病房的总时间越短越好,不计算小车 2 黄灯亮时的暂停时间,不超过 60s)
  • 两个小车协同运送到不同的远端病房送、取药品,小车 1 送药,小车 2 取药。小车 1 识别病房号装载药品后开始运送,小车 2 在药房处识别病房号等待小车 1 的取药开始指令;小车 1 到达病房后卸载药品,开始返回,同时向小车 2 发送启动取药指令;小车 2 收到取药指令后开始启动,到达病房后停止,亮红色指示灯(从小车 1 返回开始,到小车 1 返回到药房且小车 2 到达取药病房的总时间越短越好,不超过 60s)
  • 其他

如何基于梁山派制作一个送药小车
从上面的题目我们可以分析出,完成题目的基础要求有这些:
  • 主控
    • 主控当然是用 立创·梁山派开发板 了,他用的芯片是 GD32F470ZGT6,主频 240、内部 SDRAM 512K。
    • 对于智能车比赛来说是足够用了。
      • 板载 4 个 led,可以用来做状态指示。
      • 核心板上有两个按键可以用来设置参数。
      • 一路 SDIO-TF 卡槽,如果需要记录调试数据,可以移植文件系统,把要记录的数据以 CSV 格式写入 sd 卡中,需要查看调试数据时把 sd 卡中的文件拷入到电脑里,用 EXCEl 或者 Python 做数据分析
      • 一路 SPI Flash,可以用来存储需要掉电保存的数据以及各种关键数据。
      • SWD+串口调试接口,可以通过这个接口直接烧录调试,并且带一个串口方便调试。

    • 更多信息可以去立创开发板官网查看
    • 航模电池需要给小车核心板供电,但用的航模 3S 电池是不能直接供给开发版的,开发版需要的电压是 5V,所以需要一个降压芯片。常用的降压模块可就多了去了,比如 MP1584EN,LM2596,TPS5430 等。这里我们为了全国产化就选用国产 SGMICRO(圣邦微)的 SGM6132,最大电流 3A,输入范围 4.5V-28.5V。

  • 驱动小车前进和转弯的动力装置(只能用普通车轮)
    • 驱动方式选择
      • 后驱+前置舵机转向方式(就是平常路上开的那种小轿车的结构,适用于路线直角转弯比较少的地方,相信大家也知道汽车过直角弯有多麻烦,这种对转弯半径要求较高,并且还需要考虑后两轮差速问题)
      • 四轮驱动+差速转弯(比如最近比亚迪新出的仰望 U8,他的轮子由四个电机**控制,每一个电机可以单独控制轮子实现正转和反转,当左侧两个轮子和右侧两个轮子以相反的方向转动时,就可以实现原地转向)
      • 两轮驱动+万向轮||牛眼轮(对于这个比赛我认为用两个轮子+一个或两个从动轮就够用了,而且轮子电机少,做出来的小车尺寸也更小,不容易压到题目中说的走廊边缘。这个的转弯就是给两个电机不同的转动方向就行了)

    • 电机选择
      • 直流减速有刷电机
        • 优点
          • 转速范围广,转速高,扭矩大。
          • 控制简单,使用方便。
          • 价格低廉。

        • 缺点
          • 需要外接减速器,体积较大。
          • 转速波动较大,精度不高。
          • 不适合高精度运动控制。


      • 步进电机
        • 优点
          • 转动精度高,不需要编码器。
          • 可以实现高精度定位和运动控制。
          • 适合低速高精度运动。

        • 缺点
          • 转矩小,转速慢。
          • 需要驱动器,控制复杂。
          • 价格相对较高。


      • FOC无刷电机
        • 优点
          • 转速范围广,转速高,扭矩大。
          • 转速精度高,控制精度高。
          • 能够实现高效能、低噪音的运行。

        • 缺点
          • 硬件成本相对较高。
          • 控制复杂,需要配合专门的控制器使用。
          • 对控制算法的要求较高。



      那我就选择普通的直流减速有刷电机了,要自带编码器,因为编码器可以提供电机转速和位置信息,这些信息对于小车的控制非常重要。可以帮助智能车更加精确地控制电机的旋转速度和位置,可以提供反馈,提高小车的可靠性和稳定性。
      用步进电机也是不错的选择,适合中低速,只要电流足够并且扭矩不超过额定值,设置好细分,你给一个脉冲他就转一定的角度,甚至可以不用编码器就可以稳定转速,相对来说步进电机的驱动器一般都比较大,要注意布局。
      用 FOC 电机就更好了,高中低速都适合,但是对控制算法要求很高,对驱动电路要求也高,大佬可以用。

    针对直流电机的选型,要注意转速和额定电压。可以确定了轮子直径后再来确定电机的转速。
    轮胎直径为6.5cm,周长=0.065*3.14=0.2041米,走1米的距离需要转4.90圈,也就是如果每秒转4.90圈,全速1m/s需要 300转/分钟,全速2m/s需要 600转/分钟,全速3m/s需要 900转/分钟
    轮胎直径为8.5cm,周长=0.085*3.14=0.2669米,走1米的距离需要转3.75圈,也就是如果每秒转3.75圈,全速1m/s需要 225转/分钟,全速2m/s需要 450转/分钟,全速3m/s需要 675转/分钟

    • 直流电机电机驱动选择
      用直流减速电机的话电机驱动就比较简单了,常用的直流电机驱动有以下这些:
      • L298N,经久不衰,相信每一个刚开始接触智能车比赛或者循迹小车的人都知道。它可以 5V 和 12V 供电,是一个双 H 桥电机驱动,可以控制两个直流电机或者一个步进电机。他有一个非常大的散热片,当 12V 供电时,他还可以对外输出 5V 给外部设备供电。
      • 自己搭建 H 桥驱动电路,一般都是要驱动的电机功率很高以及制作者水平很高。对于这个送药小车比赛来说,用成品的电机驱动芯片就够了
      • TB6612,体积小巧,市面上有很多基于这个芯片的模块,用的人多,不容易出问题
      • RZ7899,国产电机驱动,主要用在玩具,阀门电机驱动,电磁门锁驱动等。在网上搜索相关资料时发现有些帖子说在使用过程中会出现芯片烧毁的现象,有可能是其内部没有做死区控制引起的。而且查询其 datasheet 也没有发现对输入 PWM 频率的限制和说明,网友一般都建议在 1khz 以下。
      • AT8870,这款的 datasheet 已说明有死区控制,网上评价比较高,且其最大 PWM 输入频率可以高达 100Khz,这就意味着电机控制会很顺滑,不会出现异常的噪音。对于一般的电机控制速度来说,PWM 信号最少也得来个 1Khz 以上吧。

    • 轮子选择
      尽量选择轮子的外部材料为软质橡胶,接触面积越大越不容易打滑,在小车启动和停止的时候更不容偏移。不过考虑到小车尺寸 25cm×20cm×25cm 的要求,在满足抓地力的情况下小车轮子与地面接触面越小越不容易压到走廊黑线。轮子的直径越小对电机扭矩的要求就越小。在选择的时候自由取舍。


  • 检测地图中红线以及检测门口区域(黑色)
    • 视觉识别
      • Openmv(现在最火的嵌入式机器视觉模块,使用 MicroPython 驱动,可以把它当成一个可编程摄像头)
      • K210(是国内厂家勘智研发的一款采用 RISC-V 处理器架构,典型设备功耗 1w,算力1TOPS 的 AI 芯片,自带 SRAM,可以在本地完成数据的处理和存储,国内厂家也根据 openmv 的 IDE 重新制作了 Canmv IDE 和 Maixpy IDE)
      • 树莓派,卡片个人电脑,可以在上面直接运行 OpenCV,进行循迹和数字识别,性能比上面两个都强得多,但是开发难度也是最大的,它可以用很高清的摄像头,用它来参赛简直可以说是降维打击。
      • 这几个都可以使用 Python 编程,前两个上手比较容易,这第一个和第二个文档资料比较丰富。
      • 针对巡线,一般来说就是要找到图像区域中想要的色块,不管是灰度阈值还是 LAB 阈值,都需要提前获取你想要找到的对应颜色的阈值,尽量选取能和比赛时环境差多不的情况下的阈值。这个阈值的调节可以参考他们对应 IDE 里面的机器视觉中的阈值编辑器,可以很方便的更改阈值。
      • 初学的话可以先运行一下他们各自的找色块例程,熟悉一下如何使用,然后学习怎么划分 ROI,感兴趣区,让处理器只在你要求的区域寻找色块。
      • 这里我们就选择国产的 K210 了,他在性能上比 openmv 强,但是他的软件库要比 openmv 落后不少,有些能在 openmv 上执行的语句在 K210 上是执行不了的,不对对于找色块对它来说就是小菜一碟。了解了如何获取到色块中心坐标后,就再运行一下他提供的串口例程然后修改它让他可以传输色块的中心坐标,可以用串口助手在电脑上收到 k210 发送过来的色块坐标信息后基本就可以了。

    • 光电二极管灰度传感器(主要是利用光电二极管对光线的敏感性,通过测量物体表面反射的光线强度来确定物体表面的灰度值,探测到不同颜色地面时会产生不同的电压值,电压值会随被测面的颜色变化而变化,所以理论上可以识别任意颜色)
      • 模拟式(模拟式需要单片机自带 AD 采集(模拟量采集),采集到的信息更准确,需要在单片机端自己设置阈值来进行判断当前识别的颜色)
      • 数字式(他就是基于模拟式,一般会自带一个处理芯片或者比较器,通过手动调整电路板上的旋转电阻器来设置灵敏度,针脚直接输出的就是高低电平)

    • 红外反射传感器(只适用于黑线识别,调整非常麻烦,基本上是不能用,虽然他简单,不易受光线影响,但是他是无法区分白和红的,而本次题目中是红线)
    • 线性CCD,可以说他是只有一个像素的摄像头,是一个一维的摄像头,他可以很容易识别红色与白色。

  • 小车底板和固定药品装置,固定摄像头机构,供电电池,紧急开关
    • 小车底板一般常用的板材有
      • 亚克力板
      • 碳纤板
      • 玻纤板
      • 电木板
      • 铝合金板
      • 我们普通的电路板都是 FR-4 玻纤板,1.6mm 板厚对于做这种小车来说强度是足够的,而且加工也挺方便的,画个电路板板框,里面再加一些孔位和一些导线,直接发到嘉立创等收货就行了,如果想用亚克力板的话也可以用嘉立创 EDA 专业版画面板,然后去立创商城下单,把面板当成小车底板用。在设计的时候可以多打一些孔,方便后面调整各个部件的位置。如果你的预算充足的话,也可以用铝合金板,现在三维猴可以接 CNC 订单。

    • 固定药品装置
      • 题目中要求是一次性装置约 200g 药品,但没有要求测量药品重量,所以只要能检测到药品有没有装上就行了。可以使用接近开关传感器或者直接用轻触开关,不怕麻烦的话也可以直接用称重传感器。
      • 既然选了用砝码来替代药品,就得设计一个装载砝码的打印结构,防止小车运动时造成砝码脱落。设计时要注意 3D 文件的壁厚不要太薄,强度不够容易破裂,画完后导出 STL 文件后直接到三维猴下单就行了,一般这种不长时间在太阳下使用的结构件,直接选最便宜的树脂材料就行。

    • 固定摄像头装置
      • 这个一般也是用 3D 打印来制作,考虑到远端病房有四个数字并排放置的情况,如果摄像头不动的话很有可能是识别不全的。所以还需要加一个舵机使得摄像头可以左右偏转。为了小车运行的稳定,小车的重心应该尽量靠近两个驱动轮中间,所以 k210 主板和摄像头是分开的,摄像头架子上就是一个单独的 OV2640 摄像头和 FPC 延长板。对于这个重量,用 5V 供电的塑料齿银燕舵机 ES08A II 也就够了。
      • 因为提前也不清楚摄像头哪个角度跟合适,所以需要这个固定摄像头的装置也可以上下手动调节,一般我们可以在 3d 模型上开出圆弧形状的槽或者圆弧阵列防止的螺丝孔。这个对于精准角度的要求不高,但是固定好确定好角度之后就应该是不变的,方便后续数字识别的采集和选线。

    • 供电电池
      • 考虑到要驱动直流减速电机,所以除了要考虑容量也要考虑放电倍率,一般选用航模电池就足够了,一般常用的电机都是 12v 驱动,所以这里可以选择一个 3s 航模锂电池。

    • 紧急开关
      • 为了防止调试小车时出现参数设置错误导致失控从而造成伤车伤人,可以加一个急停开关,出现异常的情况时拍一下急停开关让小车断电。


  • 用来识别任务目标房号和走廊上房号的数字识别模块
    因为题中是确定的印刷体,所以比较简单的方法是模板匹配,他是将采集到的数字与模板的像素点做对比运算来计算相似率的。
    我们上面已经选取了 K210 来做巡线,它自带 KPU(通用的神经网络处理器),也非常适合用来作数字识别。我使用的 IDE 是 MaixPy,要采集的数据集图像尺寸为 224*224(这是目前最常用的网络数据大小),为了让结果更准确,所以要训练的数据集要尽可能多,每种数字的数据量尽可能相等。但 k210 的算力也是有限的,他所能运行的模型也是有限的,对于 k210:运行 c 代码时最大可以加载 6MB 左右的模型,运行 maixpy 的最小固件时,能加载 3MB 左右的模型,运行 maixpy 的最大固件时,能够加载约 2MB 左右的模型。
    • 采集数据集

      因为我们运算是在 K210 本地的,图像来源也是 K210 自带的摄像头,为了让结果更准确,可以用 python 编写一个 K210 的拍照程序,采集固定的 224*224 图像并保存到 TF 卡里面。最好是搭好小车框架后,选好摄像头的安装位置和角度,将拍照程序保存到 K210 的运行 sd 卡里面。当按下按钮的时候就进行当前图像的保存。
    • 对数据集进行标注

      用读卡器把 TF 卡里面采集到的训练集保存到电脑上,设置好标签,在这里标签就是 1,2,3,4,5,6,7,8。用 labellmg 进行图像的标注,每种标签最少得来 100 张。
    • 开始训练
      • 训练可以选在线的也可以用本地的,但是如果像是电赛这种时间很紧张的比赛,为了防止到时候千军万马过独木桥,导致你的训练任务一直在排队,最好先设置好自己的本地环境。已经有一个开源的大佬只做了一个免安装环境的 Mx-yolo,安装好后,选好训练图片文件夹地址训练标签文件夹地址,设置训练次数,Alpha,Batch Size,是否开启数据增强。
      • 模型训练的次数需要在保证模型收敛的前提下进行合理的选择。如果训练次数过少,可能会导致模型欠拟合,无法很好地拟合训练数据。如果训练次数过多,可能会导致模型过拟合,无法很好地泛化到新的数据。因此,需要根据具体的问题和数据集进行调整。一般来说,可以通过观察模型在训练集和验证集上的表现来确定合适的训练次数。当模型在验证集上的表现不再提升时,可以停止训练,以避免过拟合。
      • Alpha 主要影响所生成模型的大小,选 0.25 模型大小约 219k,选 0.5 模型大小约 831k,选 0.75 模型大小约 1.85M,选 1.0 模型大小约 3.24M。当运行 maixpy 的最大固件时,k210 最大只能加载约 2MB 左右的模型,所以选 0.75 就行了。
      • Batch Size 一般选 8 就行了。这个参数是指每次迭代训练时,所选取的样本数。Batch Size 的大小会影响模型训练的速度和稳定性。较大的 Batch Size 可以加快模型训练的速度,因为每次迭代处理的样本数量更多。但是,如果 Batch Size 过大,可能会导致内存不足或显存不足的问题。此外,较大的 Batch Size 还可能导致模型过度拟合训练数据。较小的 Batch Size 可以提高模型训练的稳定性,因为每次迭代处理的样本数量较少,可以更好地避免过拟合。但是,较小的 Batch Size 也会导致训练时间变长,因为需要更多次迭代才能处理完所有样本。
      • 数据增强建议开启,他主要是做了一些随机裁剪,随机旋转,缩放,翻转等。
      • 查看结果报告和测试结果
      • 训练完之后看一下测试结果,测试样例是否已经被正确识别了。它还会给一张测试报告,确保模型损失已经到了0.1以下。在测试报告中,epoch代表训练次数,model loss是模型损失,train代表训练集,是用来训练模型的数据集。valid代表验证集,是用来评估模型性能和调整超参数的数据集。这两条线越来越往下就是越来越好了。
      • 在k210上面运行
      • 用mx-yoloV4训练出来的数据会自动转化为K210的Kmodel,也会给出测试程序。把boot.py,lables.txt,mx.kmodel一起放到K210的sd卡里,重新上电就可以运行了。


  • 用来指示小车工作状态的的 LED 灯
    题目中要求能显示红,绿,黄灯,那就直接去立创商城找一个 RGY 三色 LED 灯,我找了一个,编号:C2897364。查询手册我们可以知道以下信息:
    Reverse Voltage: 5V(最大反向电压,超过这个就会坏)
    Forward Current: (正向电流)
    • R: 25mA
    • G: 25mA
    • Y: 25mA

    Forward Voltage: (正向电压)
    • R: 2.0V
    • G: 3.3V
    • Y: 2.0V

    为了让每种颜色的灯的最高亮度基本保持一致,我们需要确定限流电阻,计算公式为 R=(供电电压-正向电压)/正向电流。
    限流电阻用贴片电阻,0402 电阻功率为 1/16W,即 0.0625W,0603 电阻功率为 1/10W,即 0.1W。不能小马拉大车,容易把马累死。
    计算之后可以知道要选择下面这几个电阻:
    R:电阻值:120Ω,功率 0.075 -贴片电阻 0603 以上-立创商城编号:C22787
    G:电阻值:68Ω,功率 0.0425 -贴片电阻 0402 以上-立创商城编号:C25254
    Y:电阻值:120Ω,功率 0.075 -贴片电阻 0603 以上-立创商城编号:C22787
  • 用于双车通讯的无线模块
    常用的无线通讯模块有以下几种:
    • WiFi 模块:WiFi 模块可以实现高速无线网络连接,但是其功耗较高,不适合低功耗应用。
    • 蓝牙模块:蓝牙模块具有低功耗、短距离通信等特点,但是其传输速率较慢,适用于数据量较小的场景。
    • Zigbee 模块:Zigbee 模块具有低功耗、低成本、自组网等特点,适用于物联网应用。
    • LoRa 模块:LoRa 模块具有长距离、低功耗、低成本等特点,适用于物联网应用。
    • NB-IoT 模块:NB-IoT 模块具有低功耗、广覆盖等特点,适用于物联网应用。
      在室内使用的话,wifi 和蓝牙都不错,而且这个智能小车比赛过程中两个小车的距离也不会太远,对于数据量的要求也不高,只需要简单传输一些数字识别结果和指令就够了。
      我就选蓝牙模块了,国内沁恒的蓝牙芯片都挺不错的,CH9143 是一个主从一体的蓝牙芯片,他支持蓝牙-串口-USB 三通,也就是说在连个小车上各放一个,他们配对连接上之后你就把他正常当串口用就行了。它的配对方式也挺方便的,只需要把两个芯片同时上电,他们就可以进行配对了。
      在调试的时候也可以把一个模块连到电脑上,小车上那个可以就可以通过串口输出数据到电脑上了,远程串口挺方便调试的。

  • 其他附加
    • 可以加一个无源蜂鸣器来进行提示和报警,当电池电压过低或者出现错误时进行蜂鸣器报警。
    • 可以加一个六轴或者九轴的姿态传感器,通过姿态解算可以得到当前航向角,可以让小车在一定时间内保持车头朝向不变,这样就算车轮打滑小车的车头朝向也不会大变。但是这个方法对姿态传感器的数据要求和算法处理的要求也很高。
    • 预留灰度传感器的接口,别万一识别巡线效果拉了,硬着头皮也走不下去就G了,多给自己留条后路。
    • 加一个 CAN 芯片,如果你想用 can 芯片控制电机的话就可以用了,大疆的 robomaster 系列电机和市面上的一些高性能电机都是可以用 CAN 通讯来控制的
    • 加一个 sbus 电路,参加完比赛做个小遥控车也不错。



快速回复 返回顶部 返回列表