人工智能/深度学习

在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 映像,便于安装和使用。

视频 1 。从 ros2 _ trt _ pose 包输出;视频显示带有身体关节和骨骼的实时图像,而 pose _ msgs 记录在屏幕上,在 Jetson NX 上执行人体姿势估计任务的平均每秒 42

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

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 映像和启动文件,以便于使用。

视频 2 。基于 NVIDIA TensorRT 的目标检测任务的 ros2 _ torch _ trt 包的输出

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

用于 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 软件架构集成。

视频 3 。使用 NVIDIA deepstream SDK ros2 deepstream 包输出多流,用于对象检测任务。日志屏幕上的平均速率显示, ros2 _ deepstream 节点可以在 Jetson Xavier 上以 164 FPS 的速度运行

在视频中,底部的控制台显示了多流发布节点发布分类输出的平均速率(以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)]

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

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

有关详细信息,请参阅 dusty-nv/jetson-containers GitHub repo 。

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

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

  • 它利用了 Omniverse 高度精确的物理模拟和逼真的光线跟踪图形,直接与业界领先的物理框架集成,如用于刚体动力学的 NVIDIA PhysX SDK 。
  • 它重新关注互操作性、与 NVIDIA ISAAC SDK 的深度集成以及 ROS 的扩展。
  • 它很容易扩展。通过其基于 Python 的脚本接口,它允许您适应自己独特的用例。
  • 它是为可部署而构建的,其体系结构支持本地工作站上的工作流,并通过云与 NVIDIA NGC 一起工作。

下一步行动

作为 ROS 开发人员,您现在可以利用 ISAAC 软件开发工具包 的功能,同时保留您的软件投资。使用 ISAAC -ROS bridge,您可以在 ROS 实现中使用 ISAAC GEMS 。

我们在 NVIDIA Jetson 平台上为 ROS 2 提供易于使用的软件包,以构建和部署机器人领域的关键应用程序。对于更多人工智能物联网和机器人技术项目,您可以利用以下资源:

 

Tags