本帖最后由 LCKFB 于 2023-7-12 16:42 编辑
送药小车立创开源平台资料: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
题目分析结构相关硬件相关软件相关每次测试开始时,只允许按一次复位键,装载药品后即刻启动运送时间记时,卸载药品后即刻启动返回时间记时。不能人工干预,测试项目只能测试一次。 在药房处识别病房号的时间不超过 20s,发挥部分 1 中自选暂停点处的小车 2 与小车 1 的车头投影外沿中心点的红实线距离不小于 70cm。 有任何一个指示灯处于点亮状态的小车必须处于停止状态,运送过程中不允许在同一走廊上错车或超车。
功能(得分)相关基本要求file:///D:/1_file/4_public_medical_car/4_Docs/images/1687679565818-1.png?lastModify=1689151171 发挥部分两个小车协同运送到同一指定的中部病房,小车 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转/分钟
检测地图中红线以及检测门口区域(黑色)
视觉识别
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 发送过来的色块坐标信息后基本就可以了。
光电二极管灰度传感器(主要是利用光电二极管对光线的敏感性,通过测量物体表面反射的光线强度来确定物体表面的灰度值,探测到不同颜色地面时会产生不同的电压值,电压值会随被测面的颜色变化而变化,所以理论上可以识别任意颜色)
红外反射传感器(只适用于黑线识别,调整非常麻烦,基本上是不能用,虽然他简单,不易受光线影响,但是他是无法区分白和红的,而本次题目中是红线) 线性CCD,可以说他是只有一个像素的摄像头,是一个一维的摄像头,他可以很容易识别红色与白色。
小车底板和固定药品装置,固定摄像头机构,供电电池,紧急开关
小车底板一般常用的板材有
固定药品装置
题目中要求是一次性装置约 200g 药品,但没有要求测量药品重量,所以只要能检测到药品有没有装上就行了。可以使用接近开关传感器或者直接用轻触开关,不怕麻烦的话也可以直接用称重传感器。 既然选了用砝码来替代药品,就得设计一个装载砝码的打印结构,防止小车运动时造成砝码脱落。设计时要注意 3D 文件的壁厚不要太薄,强度不够容易破裂,画完后导出 STL 文件后直接到三维猴下单就行了,一般这种不长时间在太阳下使用的结构件,直接选最便宜的树脂材料就行。
固定摄像头装置
这个一般也是用 3D 打印来制作,考虑到远端病房有四个数字并排放置的情况,如果摄像头不动的话很有可能是识别不全的。所以还需要加一个舵机使得摄像头可以左右偏转。为了小车运行的稳定,小车的重心应该尽量靠近两个驱动轮中间,所以 k210 主板和摄像头是分开的,摄像头架子上就是一个单独的 OV2640 摄像头和 FPC 延长板。对于这个重量,用 5V 供电的塑料齿银燕舵机 ES08A II 也就够了。 因为提前也不清楚摄像头哪个角度跟合适,所以需要这个固定摄像头的装置也可以上下手动调节,一般我们可以在 3d 模型上开出圆弧形状的槽或者圆弧阵列防止的螺丝孔。这个对于精准角度的要求不高,但是固定好确定好角度之后就应该是不变的,方便后续数字识别的采集和选线。
供电电池
紧急开关
用来识别任务目标房号和走廊上房号的数字识别模块 因为题中是确定的印刷体,所以比较简单的方法是模板匹配,他是将采集到的数字与模板的像素点做对比运算来计算相似率的。 我们上面已经选取了 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: (正向电流)
Forward Voltage: (正向电压) 为了让每种颜色的灯的最高亮度基本保持一致,我们需要确定限流电阻,计算公式为 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 电路,参加完比赛做个小遥控车也不错。
|