在NVIDIA Jetson上使用ROS 2构建机器人应用程序

描述

机器人技术正在采用深度学习技术来精确导航室内环境,检测并跟踪感兴趣的物体,以及在没有碰撞的情况下进行移动。然而,深度学习的复杂性日益增加,使得在嵌入式系统上适应这些工作负载具有挑战性。虽然您可以在精度和深度学习模型大小之间进行权衡,但在大多数机器人应用程序中,为了满足实时需求而牺牲精度通常会适得其反。

易于使用和部署使得 NVIDIA Jetson 平台 成为开发人员、研究人员和制造商制造和部署机器人(如 JetBot 、 MuSHR 和 MITRaceCar )的合理选择。在这篇文章中,我们在 Jetson 上提出了用于分类、目标检测和人体姿势估计的深度学习模型。我们还提供了一个 ROS2 节点,用于在部署中监控 Jetson 的各种资源和操作参数。 ros2 提供了轻量级实现,因为它消除了网桥节点的依赖性,并在嵌入式系统中提供了各种优势。

我们利用现有的 NVIDIA 框架进行深度学习模型部署,如 TensorRT ,以提高模型推理性能。我们还集成了 NVIDIA DeepStream SDK 和 ROS 2 ,以便您可以执行流聚合和批处理,并部署各种 AI 模型用于分类和对象检测,包括 ResNet18 、 MobileNetV1 / V2 、 SSD 、 YOLO 、 FasterRCNN 。此外,我们还为世界各地的开发者基于 Jetson 的流行项目(如 trt_pose 和 jetson_stats )实现 ros2 节点。最后,我们为上面提到的每个应用程序提供了一个 GitHub 存储库,包括 ros2 节点和 Docker 文件 ,这样您就可以轻松地在 Jetson 平台上部署节点。有关每个项目的详细信息,请参阅以下部分。

用于人体姿态估计的 ROS2 节点

ros2_trt_pose 包是基于 trt_pose 实现的,它可以在 Jetson 平台上进行姿态估计。存储库使用 resnet18 和 densenet121 为姿势估计提供了两个经过训练的模型。为了了解人体姿势,预训练模型根据 COCO 数据集的类别推断出 17 个身体部位。

机器人

图 1  ros2 \ u trt _ pose 软件包的描述和输出。

以下是 ros2_trt_pose package 的主要功能:

发布 pose_msgs ,如 count of person 和 person_id 。对于每个 person_id ,它发布 17 个身体部位。

提供启动文件以便于 Rviz2 上的使用和可视化:

图像消息

视觉标记: body_joints , body_skeleton

包含基于 Jetson 的 Docker 映像,便于安装和使用。

PyTorch 和 TensorRT 的 ROS 2 包

机器人

图 2 。 ros2 trt _分类和 trt _检测节点的包描述。

使用 PyTorch 有两个用于分类和检测的包,每个包都实现了相应的 TRT 版本。这四个软件包是使用 ros2 的机器人专家开始使用 PyTorch 进行深度学习的良好起点。

TensorRT 已经在 torch2trt 的帮助下集成到包中,以加速推断。它生成一个运行时引擎,该引擎根据网络架构和部署设备进行优化。

这些软件包的主要特点如下:

对于分类,您可以从各种 ImageNet 预训练模型中进行选择,包括 Resnet18 、 AlexNet 、 squezenet 和 Resnet50 。

对于检测,目前支持基于 MobileNetV1 的 SSD ,在 COCO 数据集上进行训练。

相对于直接在 GPU 上执行推理的 PyTorch 模型, TRT 包在执行推理方面提供了显著的加速。

推理结果以视觉图形的形式公布。

在运行该节点时,还将显示一个窗口,其中可视化了推理结果。

提供了基于 Jetson 的 Docker 映像和启动文件,以便于使用。

用于 DeepStream SDK 的 ROS 2 节点

机器人

图 3  ROS 2 DeepStream 发布服务器节点的包说明。

DeepStream SDK 提供了一个完整的流分析工具包,用于使用多传感器处理、视频和图像理解构建端到端基于人工智能的解决方案。它支持流行的对象检测和分割模型,如最先进的 SSD 、 YOLO 、 FasterRCNN 和 MaskRCNN 。

NVIDIA 根据 DeepStream Python Apps 项目提供执行两个推理任务的 ROS 2 节点,如下所示:

目标检测: 检测到四类对象: Vehicle 、 Person 、 RoadSign 和 TwoWheeler 。

属性分类: 车辆类的对象有三种类型的属性: Color 、 Make 和 Type 。

这些发布服务器节点从摄像机或文件接收单个或多个视频流作为输入。它们执行推理,并将检测和分类的结果发布到不同的主题。我们还提供了订阅这些主题并以 vision_msgs 格式显示结果的 ros2 订户节点示例。每个推理任务还生成一个可视化窗口,在检测到的对象周围有边界框和标签。附加的推理任务和定制模型可以与本项目中提供的 DeepStream 软件架构集成。

在视频中,底部的控制台显示了多流发布节点发布分类输出的平均速率(以Hz为单位)。

vision_msgs Classification2D 格式的示例分类输出:

[vision_msgs.msg.ObjectHypothesis(id=’silver’, score=0.7280375957489014), vision_msgs.msg.ObjectHypothesis(id=’toyota’, score=0.7242303490638733), vision_msgs.msg.ObjectHypothesis(id=’sedan’, score=0.6891725063323975)]

ROS 2 Jetson 统计

ros2_jetson_stats 包是一个社区构建包,用于监视和控制您的 Jetson 设备。它可以在您的终端上运行,并提供一个 Python 包,以便于在 Python 脚本中集成。利用 ros2_jetson_stats 库,构建 ROS 2 诊断消息和服务。

ros2_jetson_stats 软件包具有以下 ROS 2 诊断消息:

GPU / CPU 使用百分比

EMC /交换/内存状态(使用率 % )

SoC 的功率和温度

现在您可以通过 ROS 2 命令行控制以下内容:

( EZX29 和 Speed :

电源型号( nvpmodel )

jetson_clocks

您还可以提供一个参数来设置读取诊断消息的频率。

有关详细信息,请参阅 NVIDIA-AI-IOT/ros2_jetson_stats GitHub repo 。

用于 Jetson 的 ROS 2 容器

为了在 Jetson 上轻松运行 ROS 2 的不同版本, NVIDIA 发布了各种 dockerfile ,并为 ROS 2 Eloquent和 Foxy 构建了脚本,此外还有 ROS Melodic 和 Noetic 。这些容器提供了在 Jetson 上安装 ROS 或 ROS 2 并构建自己的基于 ROS 的应用程序的自动化和可靠的方法。

因为 Elocquent 和 Melodic 已经为 Ubuntu18 。 04 提供了预构建的包,所以这些版本的 ROS 被 Dockerfiles 安装到容器中。另一方面, Foxy 和 Noetic 是从容器内部的源代码构建的,因为这些版本都是为 ubuntu20 。 04 预构建的。对于容器,使用这些版本的 ROS 或 ROS 2 是相同的,不管底层的 OS 发行版如何。

要构建容器,请在运行 Jetpack4 。 4 或更新版本的 Jetson 设备上克隆 repo ,然后启动 ROS 构建脚本 :

$ git clone https://github.com/dusty-nv/jetson-containers $ cd jetson-containers $ 。/scripts/docker_build_ros.sh all # build all: melodic, noetic, eloquent, foxy $ 。/scripts/docker_build_ros.sh melodic # build only melodic $ 。/scripts/docker_build_ros.sh noetic # build only noetic $ 。/scripts/docker_build_ros.sh eloquent # build only eloquent $ 。/scripts/docker_build_ros.sh foxy # build only foxy

此命令创建具有以下标记的容器:

ros:melodic-ros-base-l4t-r32.4.4

ros:noetic-ros-base-l4t-r32.4.4

ros:eloquent-ros-base-l4t-r32.4.4

ros:foxy-ros-base-l4t-r32.4.4

例如,要启动 ROS 2 Foxy 容器,请运行以下命令:

$ sudo docker run –runtime nvidia -it –rm –network host ros:foxy-ros-base-l4t-r32.4.4

除了 Jetson 设备上的其他硬件加速器(如视频编码器和解码器),使用 –runtime nvidia 标志会自动启用容器中的 GPU 直通。要在容器中传输 MIPI CSI 摄影机,请包含以下标志:

–volume /tmp/argus_socket:/tmp/argus_socket

要在容器中传输 V4L2 USB 摄像头,请在启动容器时安装所需的 /dev/video* 设备:

–device /dev/video0

NVIDIA Omniverse ISAAC 面向 ROS 开发者的仿真平台

在 Omniverse NVIDIA 平台上构建的 NVIDIA ISAAC 模拟仿真工具包 比现有的机器人工作流程带来了一些有用的改进:

它利用了 Omniverse 高度精确的物理模拟和逼真的光线跟踪图形,直接与业界领先的物理框架集成,如用于刚体动力学的 NVIDIA PhysX SDK 。

它重新关注互操作性、与 NVIDIA ISAAC SDK 的深度集成以及 ROS 的扩展。

它很容易扩展。通过其基于 Python 的脚本接口,它允许您适应自己独特的用例。

它是为可部署而构建的,其体系结构支持本地工作站上的工作流,并通过云与 NVIDIA NGC 一起工作。

关于作者

Amey Kulkarni 是 NVIDIA 的开发技术工程师,专注于将深度学习解决方案有效地部署到边缘。在 2019 年加入 NVIDIA 之前,他完成了马里兰大学计算机工程博士学位。他的研究兴趣是在嵌入式平台上部署数字信号处理、计算机视觉和深度学习系统。

Rishabh Chadha 是 NVIDIA 的嵌入式工程实习生—— AI ,他专注于为 NVIDIA Jetson 平台集成深度学习和机器人技术框架。他将于 2021 年毕业于伍斯特理工学院,获得机器人学硕士学位。他的兴趣主要包括深度学习、医学成像和机器人感知。

Asawaree Bhide 是 NVIDIA 的 AI 嵌入式工程实习生,致力于优化和部署边缘设备上的深度学习模型。她目前正在乔治亚理工学院攻读计算机科学硕士学位,她对解决由具体代理自主导航的复杂感知任务感兴趣。Tomasz Lewicki 是 NVIDIA 的嵌入式工程实习生。他拥有圣何塞州立大学计算机工程硕士学位,华沙工业大学华沙工业大学机器人工程学学士学位。他的兴趣集中在计算机视觉和机器人应用的深度学习上。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分