本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 树莓派 4B 的自主垃圾检测机器人

发布时间:2021-10-01
分享到:

基于 树莓派 4B 的自主垃圾检测机器人

发布时间:2021-10-01
分享到:

通过这款自动驾驶机器人,通过物体检测识别和监控垃圾。它还部署了视频流和跌倒检测系统。

用术语来说,乱扔垃圾是对废弃产品的不当处置。尽管乱扔垃圾可能有意或无意发生,但乱扔垃圾会对环境造成严重和有害的后果:

1) 垃圾造成水、土壤和空气污染。随着垃圾的降解,化学物质和微粒会被释放出来。这些化学物质对环境来说不是天然的,因此会导致一些问题。它们可以进入土壤和淡水源,无论如何都会影响人类和动物。此外,研究人员估计,世界上超过 40% 的垃圾在露天燃烧,导致有毒排放物。这些排放物会导致呼吸系统问题、其他健康问题,甚至酸雨。

2) 垃圾每天都会杀死无辜的动物。研究人员估计,每年有超过 100 万只动物在摄入或陷入不当丢弃的废物中后死亡。塑料垃圾是最常见的动物杀手,海洋动物受到的影响最为显着。

3) 垃圾通过直接和间接接触促进和加速疾病的传播。不当丢弃的废物是细菌、病毒、病菌和寄生虫的温床。细菌可以通过与垃圾的物理相互作用直接传播。细菌、寄生虫和传染性病原体可以通过受影响的载体间接传播给人类。媒介是接触受污染的垃圾然后将这些污染物传播给人类的动物或昆虫。

尽管明知提到了有害的后果,但不幸的是,我们用废物污染地球的速度比它恢复和补充的速度还要快。如果这种无休止和无休止的污染继续扩大,它最终将阻碍生态系统循环,并促使石化预兆的过程成为我们的日常现实。当地球被我们的废物淹没时,醒来发现一个不可恢复的世界的迫在眉睫的危险正在逼近。因此,在这个项目中,我重点考虑了一种避免浪费的解决方案。

检查景观以发现散落的垃圾需要不合理的工作量,甚至在开始清理之前在经济上也具有挑战性。由于对抗垃圾入侵的最大问题之一是在为时已晚之前找到垃圾的位置,以防止垃圾扩散,因此我决定开发这种自主(自动驾驶)机器人,通过物体检测跟踪和监控垃圾。在这个机器人的帮助下,可以毫不费力地以极小的工作量搜索和找到乱扔垃圾的区域。哪怕是一小步,也希望这个原型能够在对抗废物入侵中起到有益的和实用的作用。

我使用 Edge Impulse 构建了一个神经网络模型,用于在这三类下通过物体检测来检测垃圾:

  • 瓶子(玻璃和塑料)
  • 罐(金属)
  • 包装(塑料、纸、纸板等)

Edge Impulse 还可以在连接到 Raspberry Pi 后提供实时视频流。因此,我无需创建网络摄像头服务器 (Motion) 即可使用 Raspberry Pi 为该项目进行直播。

在训练模型并在 Raspberry Pi 上运行后,我设计并组装了我的自主垃圾检测机器人,其中包括 RPLIDAR A1M8 360 度激光扫描仪(激光雷达)、机器人底盘和 USB 网络摄像头。然后,我用 Arduino Nano 和一个 6 轴加速度计构建了一个跌倒检测系统,让机器人可以防止碰撞。

第 1 步:在 Edge Impulse 中构建平衡良好的数据集
Edge Impulse是一个免费的嵌入式机器学习开发平台,供开发人员(新手或专家)从学习到部署。它具有许多功能和内置神经网络模型,可满足各种要求,例如用于多目标检测的迁移学习。此外,该平台还提供来自连接设备摄像头的实时视频流。因此,我决定在这个项目中使用 Edge Impulse 来识别和监控垃圾。

在构建用于物体检测的神经网络模型之前,我需要创建一个平衡良好的数据集来检测多个垃圾类别:

瓶子(玻璃和塑料)
罐(金属)
包装(塑料、纸、纸板等)
通过精心挑选与上述垃圾类别相关的最合适的图像,我结合了废物和垃圾的两个不同数据集:

垃圾分类数据集 | 检查
TACO 垃圾数据集 | 检查
选择后,我每个类别大约有100张图像,总共292张。通常,像这样的小数据集无法在垃圾检测中得到准确的结果。然而,Edge Impulse 在训练模型时采用了迁移学习,所以我得到了相当不错的结果,而且准确率很高。

首先,注册Edge Impulse并创建一个新项目(垃圾检测机器人)。

为了能够使用对象检测模型,请转到仪表板 ➡ 项目信息 ➡ 标签方法并选择Bounding box (object detection) 。

然后,转到数据获取并选择上传数据(上传现有数据)。

最后,将每个垃圾类别的图像上传到 Edge Impulse 以创建数据集。它可以自动将它们拆分为训练集和测试集。

步骤 1.1:为多目标检测标记数据(废品)
成功上传我的垃圾数据集后,我用提到的三个垃圾类别标记每个图像 -瓶子、罐头、包装。在 Edge Impulse 中,标记一个对象就像在它周围拖动一个框并输入一个标签一样简单。此外,Edge Impulse 在标记对象时在后台运行跟踪算法,因此它会自动为不同图像中的相同对象移动框。

⭐转至数据获取➡标签队列(Object detection labeling)。它显示了数据集中剩余的所有未标记图像。

⭐然后,选择一个未标记的图像,拖动框,单击Save labels ,然后重复此操作,直到整个数据集都被标记。

完成标记后,我在数据采集下列出了一个平衡良好的数据集,用于垃圾检测。

第 2 步:在 Edge Impulse 中设计脉冲(神经网络模型)
脉冲是边缘脉冲中的自定义神经网络模型。在这个项目中,我设计了一个脉冲,它获取原始图像数据,调整图像大小,使用预处理块来处理图像,然后利用学习块对新数据进行分类:

图像预处理块 ➡ 取彩色图像中的数据,可选地使图像灰度化,然后将数据转化为特征数组。
迁移学习学习块 -对象检测(图像)➡ 接收所有图像并学习区分三种(瓶子、罐子、包装)垃圾类别。
预处理块总是为相同的输入返回相同的值(例如,将彩色图像转换为灰度图像),而学习块则从过去的经验中学习。除了内置的预处理块,Edge Impulse 还允许用户创建自定义预处理块(步骤)。

⭐进入创建脉冲,设置图像宽度和图像高度为320,调整大小模式为适合最短轴。然后,添加图像和对象检测(图像)块。最后,单击Save Impulse 。

步骤 2.1:配置处理块和功能
⭐ 要配置处理块,请转到Impulse design下的Image ,选择颜色深度为RGB ,然后单击Save parameters 。处理块为模型适当地格式化原始图像数据。

然后,在特征生成屏幕上,单击生成特征以:

  • 调整图像数据大小,
  • 将处理块应用于图像数据,
  • 并创建完整的垃圾数据集的 3D 可视化。

第 3 步:使用迁移学习训练神经网络模型(脉冲)
它正在努力从头开始构建准确的计算机视觉模型,因为该模型需要各种各样的输入数据才能很好地泛化,并且在 GPU 上训练此类模型可能需要数天时间。然而,Edge Impulse 在训练用于对象检测的神经网络模型时采用了迁移学习。转移学习方法重新训练训练有素的神经网络模型的上层以进行对象检测,从而产生更可靠的模型,这些模型可以在很短的时间内进行训练并使用更小的数据集。

尽管迁移学习使训练对象检测模型变得轻松,但使用机器学习识别和监控垃圾仍然具有挑战性。由于垃圾种类的颜色、形状和材料各不相同,因此我从两个不同的数据集中精心挑选了 292 张最合适的图像,如前面的步骤所述。处理完我的数据集后,我用整个数据集训练模型以区分三种不同的垃圾类别(瓶子、罐头、包装)。

使用我的数据集训练模型后,Edge Impulse 将精度分数(准确度)评估为60.2% 。

⭐ 进入Impulse design下的Object detection ,选择默认的基础模型,并设置:

  • 训练周期数➡ 40
  • 学习率➡ 0.01

步骤 3.1:验证神经网络模型
由于我使用整个数据集来训练模型,因此我上传了新图像作为测试数据集来验证模型。

在验证模型后,我推断它区分瓶子(塑料和玻璃)和罐子(金属)的准确率超过 88%。然而,它很难检测包装(塑料、纸、纸板等),因为包装在很多方面都不同——形状、颜色、材料等。由于收集的种类繁多,包装的准确度在 45% 到 55% 之间。因此,我仍在收集数据以改进我的数据集和包装的准确性。

使用测试数据集(大约 50 张图像),Edge Impulse 评估模型精度为84.11% 。

⭐ 要验证模型,请转到模型测试并选择Classify all 。

第 4 步:将 Raspberry Pi 4 连接到 Edge Impulse
经过设计、训练、验证和验证后,我将我的模型部署到了树莓派 4。由于 Edge Impulse 官方支持树莓派 4,因此使用此开发板部署和运行模型非常简单。

⭐首先,打开终端,运行以下命令安装依赖和模块:

安装依赖项后,将USB网络摄像头连接到Raspberry Pi 4并运行以下命令:边缘脉冲Linux

然后,登录并使用终端向导选择一个Edge Impulse项目(垃圾检测机器人)。

要验证树莓派 4 是否成功连接到所选 Edge Impulse 项目,请转到项目页面并单击Devices 。

第 5 步:在 Raspberry Pi 4 上部署和运行模型
⭐ 要在 Raspberry Pi 4 本地部署和运行模型,请打开终端并在下面输入以下命令:

edge-impulse-linux-runner

⭐ 然后,Edge Impulse 会自动编译具有完整硬件加速的模型并将其下载到 Raspberry Pi 4。在这方面,该模型以最小的延迟和功耗运行。

在 Raspberry Pi 4 上部署我的模型后,我将它和 USB 网络摄像头连接到机器人底盘。然后,我运行了模型,它立即开始在三个垃圾类别之间进行分类。

  • 瓶子(玻璃和塑料)
  • 罐(金属)
  • 包装(塑料、纸、纸板等)

由于 Edge Impulse 在模型运行时提供带有来自连接的网络摄像头的分类结果的实时视频流,因此当垃圾检测机器人运行时,我不需要创建带有 Motion 或其他模块的网络摄像头服务器来显示分类结果。

⭐ 要显示实时视频流和分类结果,请在运行模型后转到终端中给定的 URL:

第 6 步:在 Raspberry Pi 4 上设置 RPLIDAR A1M8 360 度激光雷达
为了让垃圾检测机器人自主移动,我使用了 RPLIDAR A1M8-R6 - 360 度激光扫描仪(激光雷达)。该激光雷达可以在 12 米范围内执行 360 度扫描,每秒生成多达 8000 个样本。

我没有绘制环境来导航机器人(SLAM),而是使用激光雷达来检测三个不同方向(右、左和前)的障碍物,因为我想让机器人在不受环境(室内或室外)任何限制的情况下运行)。

为了获得 RPLIDAR A1M8 和 Raspberry Pi 生成的 360 度扫描数据,我使用了Adafruit CircuitPython RPLIDAR库。

在使用库收集数据之前,我将 RPLIDAR A1M8 连接到我的计算机 (Windows) 并运行Frame Grabber应用程序以在扫描周围环境的同时检查角度方向和距离测量值。

第 7 步:使用RPLIDAR A1M8检测障碍物并控制机器人底盘
RPLIDAR A1M8 不是采用步进读取方法,而是通过直流电机驱动旋转扫描仪,并根据扫描仪获得的角度生成距离读数。这样,单次旋转不能保证为每个可能的角度(从 0 到 360)产生距离值。只需旋转几次,即可使用此激光雷达进行完整的 360 度扫描。因此,在不调试生成的扫描数据点的情况下,使用 RPLIDAR A1M8 进行避障可能会非常棘手和困难。

在设置好RPLIDAR A1M8并包括所需的模块后,我对扫描仪每转产生的不完整的360度扫描数据进行调试和处理,以检测三个不同方向的障碍物。对于每个方向,我定义了一个起始角和一个终止角(顺时针):

右 ➡ 开始:60 ,结束:120
左 ➡ 开始:240 ,结束:300
前 ➡ 开始:340结束:20
在每个方向范围内,代码搜索准确的距离测量作为起点和终点:

起点 ➡ 从起始角到起始角 + 15 ,
终点 ➡ 从终点角度到终点角度 - 15 .
这样,代码覆盖每个方向的 30 度范围,以得出准确的距离测量值(起点和终点),不会出现错误或遗漏。然后,如果引出的方向起点和终点小于给定阈值(40 cm),则代码激活机器人底盘(L298N)以避开该方向检测到的障碍物。

 

在完成代码并将激光雷达(RPLIDAR A1M8)安装到机器人底盘上后,我在外壳上测试了垃圾检测机器人的避障系统。

第 8 步:使用 Arduino 为机器人构建跌倒检测系统
完成上述步骤后,我决定为垃圾检测机器人添加一个 6 轴加速度计作为跌倒检测系统,以防止碰撞。跌倒检测系统还显示 X、Y 和 Z 轴的加速度测量值。

下载所需的库以从 DFRobot 串行 6 轴加速度计获取数据:

DFRobot_WT61PC |

下载控制 SSD1306 OLED 屏幕所需的库:

Adafruit_SSD1306 |

Adafruit_GFX |

连接和调整

首先,我组装了 DFRobot Black Gladiator(履带式机器人底盘)并将 L298N 电机驱动模块连接到机器人底盘,以使用 Raspberry Pi GPIO 引脚轻松控制其直流电机。

然后,我将 RPLIDAR A1M8 360 度激光扫描仪(激光雷达)和 USB 网络摄像头连接到 Raspberry Pi 4。

通过使用公母黄铜六角 PCB 垫片(支架),我将 RPLIDAR A1M8 连接到机器人底盘上。然后,我通过其 GPIO 引脚将 L298N 电机驱动器模块连接到 Raspberry Pi 4。

为Raspberry Pi 4和L298N电机驱动模块供电,我使用了小米20000 mAh 3 Pro Type-C移动电源。我将USB升降压转换器板连接到小米移动电源,为机器人底盘的直流电机提供稳定的12V电压。

为了构建机器人的跌倒检测系统,我将 DFRobot 串行 6 轴加速度计、SSD1306 OLED 屏幕(128x32)和蜂鸣器连接到 Arduino Nano。为了提供 Arduino Nano,我将它连接到 Raspberry Pi 4:

  • Arduino Nano ➡ 树莓派 4
  • VIN ➡ 5V
  • 地 ➡ 地

最后,我将 USB 网络摄像头连接到 Raspberry Pi 4,并用热胶枪将所有组件固定到机器人底盘上。

如果您对此项目有任何想法、意见或问题,请在下方留言。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论