Irrigator是一种自主、可持续发展的智能机器人,可以照料室内和室外植物。本演示的重点是给植物浇水,但设计和实现可以扩展到执行其他任务,例如分配肥料和杀虫剂、检测土壤中的水位、检测生病的植物。
广泛的设计目标:
自主- 它在没有(或最少的)人为交互的情况下完成工作。
可持续发展——它使用太阳能为电池充电,使用雨水为水箱注水,并且尽可能使用回收材料制成(例如,我使用回收木材、金属和螺丝制作底盘)。
智能- 它使用计算机视觉和机器学习来执行复杂的任务。
具体设计目标:
Nvidia Jetson Nano - 用作可以运行高级机器学习推理的中央控制单元。
Nvidia Isaac SDK - 用作机器人的编程平台。
机器人整体图及其主要模块如图1所示,实际实现如图2所示。
下面(也在这里)是这个项目中使用的材料的详细清单(木头、螺丝、胶水、电线、胶带等除外)。价格以新加坡元为单位,链接仅供参考。对于我从当地五金店购买的某些组件,我找不到链接。但是,我在下面提供了详细信息和照片。
该项目的估计成本为 459 新元(约合 330 美元)。
我没有某些组件的网络参考,因为我是从我所在地区的五金店购买的。
在图 3 中,我展示了 (1) 一块 20W 太阳能电池板,(2) 一块 7Ah 可充电铅酸电池,(3) 2 个带齿轮箱的电机,(4) 2 个轮子,(5) 2 个电机支架,以及(6)太阳能电池板充电器一个。如果你打算建造这个机器人的复制品,你可以使用不同规格的组件,但你需要注意设计目标。例如,电机应能承载至少 10kg 的负载(主要是水箱)。电池可以具有更高的容量。我不建议使用容量低于 7Ah 的电池。太阳能电池板的功率应该足以给电池充电。
图 4 和图 5 显示了带有齿轮箱的电机。这些是 12V、5000 转/分的电机,而齿轮箱将转速降低到 30 转,并使电机能够拉动超过 10 公斤。图 4 还显示了轮子。确保支撑轮(未连接到电机的)可以左右旋转。如果它们是固定的,您的机器人可能会由于高摩擦力而无法左转或右转。
控制单元是机器人的“大脑”。图6是控制单元的原理图,图7是控制单元的接线图(我附上了Fritzing做的原理图),图8是实际实现。Irrigator的“大脑皮层”是一块Jetson Nano板,运行主控制回路和 AI 算法来检测植物和花盆。附加到它的是 Raspberry Pi Camera v2.1。
为了控制电机和读取所有传感器,我使用了两个Arduino Uno板。这些板代表灌溉器的“小脑”。Jetson Nano 和 Arduino Uno 之间的通信是通过SPI完成的。我使用 Jetson 的J41 连接器的 SPI1 和 SPI2 引脚以及对应于其SPI 接口的 Arduino Uno 的引脚 10 (SS)、11 (MOSI)、12 (MISO)、13 (SCK) 。
要在 Jetson 上启用 SPI ,您需要运行:
sudo /opt/nvidia/jetson-io/jetson-io.py
完成此步骤后,您可以使用/dev/spidev0.0和/dev/spidev1.0与两个 Arduino 板进行通信。我使用 Linux 源代码中的SPI 测试程序作为我在 Jetson Nano 上的驱动程序的起点(请参阅Github上的更多详细信息)。
控制单元读取以下传感器:
控制单元命令:
为了分配和测量这些模块使用的能量,我创建了一个自定义配电单元。请注意,某些组件使用 12V:
一些组件使用 5V:
Irrigator的代码托管在 Github 上。您可以在README.md中找到有关设置的更多详细信息。
该代码有两个主要层,(1) 机器人控制和 (2) 使用 AI 进行植物检测。对于第一层,您需要使用 Arduino IDE 和 USB-B 电缆对 Arduino 板进行编程。两块板的代码在src/arduino文件夹中。
接下来,您需要在 Jetson Nano 上运行驱动程序。控制单元的主循环用C代码表示如下:
while (run_flag) {
go_forward();
if (dist1 < 100 || dist2 < 100) {
stop();
usleep(250000);
on_light();
int ret = run_ai();
if ((ret >> 8) == 1) {
printf("Plant detected!\n");
go_forward();
sleep(2);
stop();
usleep(250000);
on_pump();
sleep(5);
off_pump();
usleep(250000);
go_backwards();
sleep(2);
stop();
usleep(250000);
}
off_light();
usleep(250000);
go_left_90();
}
sleep(1);
}
上面的代码告诉机器人只要声纳没有检测到障碍物(1m 以内)就向前移动。如果检测到某些障碍物,机器人将执行以下任务:
请注意,需要一些延迟(usleep() )以避免 Arduino 上的 SPI 消息丢失。
控制器可以通过两种方式实现。首先,编写 C 或 Python 程序来控制机器人的经典整体方式。这是在irrigator_spi.c中实现的。要运行它,请在 Jetson 上执行这些 shell 命令:
$ cd git/irrigator/src/jetson/driver
$ make
$ ./irrigator_spi
第二种方式,模块化且灵活,是使用 Nvidia 的Isaac SDK。对于这个版本的 Irrigator,我在 Github 上的src/jetson/isaac文件夹中的两个小代码 Driver 和 Detector 中实现了我的代码。Driver 处理机器人的硬件和运动,而 Detector 处理 AI 部分。他们使用 Isaac Messaging API 进行通信。
该软件的第二层包括使用 AI 对象检测的植物和盆栽检测。由于代码在 Jetson Nano 上运行,我首先考虑使用jetson-inference存储库中的教程。但是,我使用 TensorFlow Lite (TFLite) 模型获得了最佳结果。特别是,我正在使用coco_ssd_mobilenet_v1_1.0_quant_2018_06_29和 inception_resnet_v2_2018_04_27。有关更多 TFLite 模型,请参阅TFLite 托管模型。我从每个模型中获取前 3 个检测结果并搜索plant of pot关键字(参见run-all-models.sh). 目前,检测(包括拍照)需要 10-11 秒。光是拍照就需要 4 秒。
我计划在不久的将来进行这些优化:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !