基于Arduino Mega 2560 DIY遥控车的项目:在车上实现机器学习模型
扫描二维码
随时随地手机看文章
我想和大家分享我的DIY遥控车的项目,在车上实现机器学习模型,这可能会给它带来自主功能。下一个生物就在这里,稍低一点。我受到了新技术,机器人,无人机的启发,并决定做一些与这个领域相关的事情。有一种想法是制造一种带有遥控器的东西,它可以飞行或驾驶,有可能播放视频和探测物体。我使用树莓板+摄像头作为图像处理单元,检测物体。Arduino Mega 2560以无线电模块为硬件核心来驱动汽车。此时通过SSH流建立视频传输。所以,让我们继续前进吧!
项目结构:
- openCV, ML模型和图像处理
-nRF24L01+无线电模块
-骑上车
- RPi4 Arduino通讯
OpenCV, ML模型和图像处理
一个很好的机会来处理图像,视频,流等等给了我们OpenCV库。我想每个人都注意到了一个绿色的框架,它会在我们的手机摄像头中寻找人脸。这是将其应用于移动软件的一个很好的例子。它从90年代开始,这些年来一直在进步。OpenCV与神经网络、机器学习模型一起工作,这取决于它的目标。从人脸识别系统到医学癌症检测模型。听起来很酷,不是吗?OpenCV库可用于大多数编程语言,并拥有强大的支持社区。它是如何工作的?简而言之,每个图像都可以表示为一个像素数组,其值从0到255,如果用rgb比例着色,则可以表示为多维数组。视频实际上是一组图像,这些图像是结构化的,每秒显示24次。OpenCV可以在迭代循环中处理它。关键时刻是在OpenCV中使用神经网络/ML模型。例如,在拥挤的地方的照片上数人。如果我们只有20个人,这可能很容易,但如果这是一张来自无人机的照片,而且有无数的照片呢?在这里,ML模型可以帮助您。Tensorflow, pythorch, utralistyolo模型已经有了训练好的对象识别和分类模型。
它可以以0.44的概率检测和分类右侧的人。
所有这些库的主要特点是有机会根据您的特定需求训练您自己的模型。
我尝试过使用TensorFlow、Ultralytics Yolo和Edge Impulse,但由于文档和软件包支持组织不佳,我无法推荐第一个。对于我这个初学这个领域的人来说,它看起来很乱。
Ultralytics Yolo看起来好多了。
这里有必要强调一下边缘实现的ML主题。这里有可能使我们的模型在边缘设备上工作,如微控制器,手机,嵌入式系统等,与我们的PC相比,它们具有极低的RAM内存和CPU性能。
首先,针对边缘设备,我尝试用TensorFlow训练一个自定义模型,因为它有一个专门设计的工具来提取边缘设备模型的精简版本,我遇到了很多障碍,与系统不兼容,依赖等。
Ultralytics有可能将ML模型转换为您希望的任何格式,更不用说。但在Raspberry Pi 4上部署它时,我使用USB网络摄像头每秒只能拍到1帧,看起来真的很慢。
Edge Impulse真的帮了我大忙。他们的方法为我提供了一个性能提高15倍的定制模型!
在他们的网站和YouTube上有组织良好的文档。
可能部署你的模型作为一个zip库在Arduino或构建它直接到你的RPi板从边缘脉冲web服务器!不可思议。
下载后,您将获得一个带有Python脚本的生成的Python SDK包,我们可以在项目中使用它。
有很多关于如何使用其他框架/库(如TensorFlow, Yolo等)训练自定义模型的资源。
nRF24L01无线电模块
它可能会给你的背部带来一点疼痛。如果你没有准备好,可能会多一点。
这是市场上最便宜的选择,但有几个时刻可能会让你发疯。
为了避免在模块之间建立通信的所有问题,我强烈建议您在这里学习nRF24文档:
如果你还在与困难作斗争,你必须:
•直接在模块上的VCC和GND引脚上焊接约50µF的电容器。
•检查模块是否工作,因为有很多模块是直接从生产线上坏掉的。
使用这段代码来检查你的模块是否可以扫描无线电环境:
如果你的模块处于工作状态,它必须在串行监视器中显示类似的东西:
每一行代表一个扫描循环。从左到右,数字对应于每个通道。0表示该频道不受家庭无线电发射器(如WiFi、手机等)的影响。
如果每一行都是零表示-这是坏消息。尽量选择一个免费的无线电频道,以减少噪音和干扰,例如WiFi。
车轮上的
在造车之前,我一直在琢磨如何把它变成现实。
我跟着这些想法走:
树莓派4从USB网络摄像头获取视频,对其进行处理,并将带有移动或不移动信息的数据发送到Arduino,等等。
同时,Arduino有2种模式:遥控模式和自主模式。
远程控制模式意味着等待来自nRF24L01模块的数据,如果来自发射器的数据处于中立位置,则保持移动值x和y为0(操纵杆未动,以数字表示输出1023中的512)。
如果无线电模块断电,Arduino会切换到自主模式,并尝试掉头。在摄像机视图中有可能捕捉到一个目标,然后如果它发生了,它将停止转身并向目标(球)移动。
预建的车辆平台可以在网络市场上找到。例如:
问题是,我不确定如何嵌入树莓派和arduino板与电池,如何使轮子驱动,因此决定建立它在我自己的几个细节从aliexpress和木制板
野马准备好了全副武装
要控制这个正在使用DIY的玩具遥控器:
这里使用了两个Arduino操纵杆,一个Arduino Nano板和一个NRFL01无线电模块。接线原理图如下:
发射机代码如下:
car的代码看起来不像以前那样简单。问题是我应该连接并结合raspberry pi4和arduino mega。其工作原理如下:RPI4使用usb网络摄像头来处理传入的视频与opencv库。然后,检测到的对象的坐标必须通过端口传递到arduino板。同时,2个伺服器直接连接到rpi4 gpio引脚上,目的是针对被检测对象。汽车配线如下:
据我们所知,RPI4板对功耗非常敏感,因此决定使用单独的电源。值得一提的是,rpi4和arduino板之间的逻辑电平移位器使用的是uart端口,因为电路板之间的逻辑电压不兼容会损坏rpi4。
Arduino scetch车辆如下:
在树莓派方面,代码正在python环境中使用opencv库以及预训练的机器学习模型执行。如上所述,在从边缘脉冲服务器下载机器学习模型时生成Python代码。需要注意的一点是,我们必须根据自己的需要对其进行修改。在我的情况下,我必须提取对象的x, y坐标值,通过art传递给arduino板。
Python脚本生成的边缘脉冲波纹。我只是添加了一个函数,传递值到伺服:
结论:
•在Raspberry Pi 4设备上部署用于对象识别的ML模型是可能的。
•与其他产品相比,Edge Impulse提供了最好的性能。缺点是它是为大型培训任务提供的付费服务。
•尽管我在RPi4上获得了相对较好的FPS分数,但对于较大的任务来说,它仍然很慢。
为了更好地开发项目,将平台转换为带有gpu或npu的平台是一个不错的选择。
本文编译自hackster.io