0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用 NVIDIA Isaac Transport for ROS 提升自定义 ROS 图形性能

NVIDIA英伟达企业解决方案 来源:未知 2023-11-30 19:35 次阅读

NVIDIA Isaac Transport for ROS(NITROS)是随 ROS 2 Humble 加入的两项硬件加速功能——类型适配和类型协商。

类型适配使 ROS 节点能够使用针对特定硬件加速器优化的数据格式进行工作。经过适配的类型用于处理图形,以消除 CPU 和内存加速器之间的内存拷贝。

通过类型协商,处理图中的不同 ROS 节点可以公布其支持的类型,ROS 框架也可以选择数据格式,从而实现理想的性能。

wKgZomVodJWAeXJdAAkJ84lYbsg408.gif

图 1. NITROS 通过减少 CPU 和

GPU之间的内存拷贝,实现高效加速

当两个支持 NITROS 的 ROS 节点在图中相邻时,它们可以通过类型协商发现对方,然后使用类型适配共享数据。通过消除不必要的内存拷贝,类型适配和类型协商可共同显著提高基于 ROS 的应用中的 AI计算机视觉任务性能。

这不仅减少了 CPU 开销,还优化了底层硬件的性能。图 1 显示了使用 NITROS 的高效硬件加速。数据可以从 GPU 内存中访问,而不需要频繁地复制 CPU。

由于 ROS 框架与不支持协商的传统节点保持兼容,因此可在处理图中结合使用基于 NITROS 的 Isaac ROS 节点和其他 ROS 节点。支持 NITROS 的节点在与非 NITROS 节点通信时,其功能与典型的 ROS 2 节点相同。大多数 Isaac ROS GEM 都是通过 NITROS 加速的。

请通过NVIDIA NITROS 文档进一步了解关于 NITROS 和系统假设的更多信息https://nvidia-isaac-ros.github.io/concepts/nitros/index.html

搭载 NITROS 的 NVIDIA CUDA

NVIDIA CUDA是一种并行计算编程模型,可大幅提高搭载 GPU 的机器人系统的运行速度。自定义 ROS 2 节点可通过代管式 NITROS 发布器和代管式 NITROS 订阅器,使用搭载 NITROS 的 CUDA。

wKgZomVodJWAKAtyAACvuMpL7mo501.png

图 2. 搭载 NITROS 的 CUDA 概览

ROS 节点中的 CUDA 代码可以使用代管式 NITROS 发布器,并与支持 NITROS 的 Isaac ROS 节点共享 GPU 内存中的输出缓冲区。这样就省去了昂贵的 CPU 内存拷贝步骤,从而提高了性能。NITROS 还能通过发布与普通 ROS 2 消息相同的数据,来保持与非 NITROS 节点的兼容性。

wKgZomVodJWAYk7KAABS6gN1uac064.png

图 3. ROS 2 节点中的 NITROS 发布器

在订阅器方面,ROS 节点中的 CUDA 代码可以使用代管式 NITROS 订阅器来接收 GPU 内存中的输入。输入既可以来自于支持 NITROS 的 Isaac ROS 节点,也可以来自于使用 NITROS 发布器的其他支持 CUDA 的 ROS 节点。与代管式 NITROS 发布器一样,这也能通过增加 GPU 和 CPU 之间的并行计算来提高性能。

wKgZomVodJWAEGNfAAAixdRscCw562.png

图 4.ROS 2 节点中的 NITROS 订阅器

为了更好地理解这一点,让我们来看一个基于 DNN 的点云分割示例图。总的来说,有三个主要的组件使用搭载 NITROS 的 CUDA:

  1. 搭载代管式 NITROS 发布器的编码器节点:可将 sensor_msgs/PointCloud2 消息转换为 NitrosTensorList

  2. Isaac ROS TensorRT 节点:可执行 DNN 推理,接收输入 NitrosTensorList 并生成输出 NitrosTensorList

  3. 搭载代管式 NITROS 订阅器的解码器节点:可将输出的 NitrosTensorList 转换为分段的 sensor_msgs/PointCloud2 消息

代管式 NITROS 发布器和订阅器提供了一个可与标准的 rclcpp::Publisher 和 rclcpp::Subscriber API 相媲美的熟悉界面,使与现有 ROS 2 节点的集成更加直观。搭载 NITROS 的 CUDA 还能实现更加模块化的软件设计。借助代管式 NITROS 发布器和订阅器,CUDA 节点可以在图中的任何位置与 Isaac ROS 节点和其他 CUDA 节点一起使用,从而在每个节点上获得加速计算的优势。

再深入一点来看,NITROS 是基于 NVIDIA 图执行框架(GXF)开发的,它是一个用于构建高性能计算图的可扩展框架。NITROS 利用 GXF 实现了高效的 ROS 应用图。通过搭载 NITROS 的 CUDA,开发者无需了解使其节点支持 NITROS 的前提条件——GXF 的底层工作原理。GXF 层已被抽象化,用户只需进行简单的调整就能启用 NITROS,从而像往常一样轻松、快速地编写 ROS 2 节点。

访问网址进一步了解搭载 NITROS 的 CUDA 的核心概念:https://nvidia-isaac-ros.github.io/concepts/nitros/cuda_with_nitros.html#core-concepts

目前,代管式 NITROS 发布器和订阅器仅与 Isaac ROS NitrosTensorList 消息类型兼容。请访问isaac_ros_nitros_type,查看完整的 NITROS 数据类型列表:https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_nitros/tree/main/isaac_ros_nitros_type

使用搭载 NITROS 的 CUDA

和 YOLOv8 进行对象检测

Isaac ROS 提供了一个YOLOv8 示例:https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_object_detection/tree/main/isaac_ros_yolov8,展示了如何使用代管式 NITROS 实用程序和自定义 ROS 解码器来充分运用 NITROS。该示例使用来自 Isaac ROS DNN Inference 的软件包,通过 YOLOv8 来执行 TensorRT 加速的对象检测。代管式 NITROS 发布器和订阅器使用 NITROS 类型的消息,目前只与 Isaac ROS NitrosTensorList 消息类型兼容。这种消息类型用于在节点和 Isaac ROS DNN Inference 节点之间共享张量。

wKgZomVodJaAeQLEAA93AQWEHPU502.png

图 5. 使用 Isaac ROS DNN Inference

检测 YOLOv8 对象

假设您想使用由 Isaac ROS DNN Inference 和 CUDA NITROS 加速的自定义对象检测模型,检测流程涉及输入图像编码、DNN 推理以及输出解码三个主要步骤。Isaac ROS DNN Inference 实现了前两个步骤。

在解码步骤中,必须从推理结果(即张量)中提取相关信息。对于像 2D 物体检测这样的任务,相关信息包括边界框以及图像中每个检测到的输出的类别得分。

下面让我们来详细了解各个步骤。

第 1 步:编码

在输入方面,Isaac ROS 提供了一个由 NITROS 加速的 DNN 图像编码器。它会对输入图像进行预处理,并将其转换为张量,然后通过 isaac_ros_tensor_list 类型将张量传递给 TensorRT 或 Triton 节点进行推理。

您可以为各种预处理功能(如调整大小等)指定图像大小和网络期望的输入大小等参数。请注意,根据任务的不同,您需要使用不同的编码器。例如,由于网络期望的输入编码不同,您不能在语言模型中使用这种图像编码器。

wKgZomVodJaAVvPgAADREc7WRe0517.png

图 6. Isaac ROS DNN 图像编码器节点概览

第 2 步:推理

Isaac ROS 为 DNN 推理提供两个 ROS 节点——TensorRT 节点和 Triton 节点。YOLOv8 样本目前使用其中的 TensorRT 节点。将训练好的模型提供给 TensorRT 节点,它就能执行推理并输出包含检测结果的张量。

输出的张量列表将传递给解码器节点。您可以指定网络所期望的维度和张量名称等参数,并且可以使用 Netron 等工具在 ONNX 模型中轻松找到这些信息。

wKgZomVodJaAa-FQAAA1vagN2WE365.png

图 7. Isaac ROS TensorRT 推理节点概览

第 3 步:解码

从 TensorRT 或 Triton 节点推理出的输出张量必须解析为所需的边界框和类信息。比方说,您把模型的解码器写成了 ROS 2 节点(而且还不支持 NITROS)。

解码器节点并不支持 NITROS 类型的信息,而是期望从推理节点获得典型的 ROS 2 信息。由于 NITROS 保持了与非 NITROS 节点的兼容性,因此这种方法仍然有效。

不过在这种情况下,推理节点(位于 GPU 内存中)输出的 NITROS 类型消息会被转换成 ROS 2 消息,并被传送到 CPU 内存中供解码器使用。这将带来一些开销,因为数据现在位于 CPU 内存中,导致在与下游 ROS 节点协同工作时需要复制 CPU 内存。

现在,假设您想升级解码器,以便通过 NITROS 与推理节点(以及其他 NITROS 加速节点)进行通信,而不需要承担 CPU 内存复制的成本。在这种情况下,所有数据都会保留在 GPU 内存中。

在解码器节点中使用代管式 NITROS 订阅器就能轻松实现这一需求。该订阅器能够订阅来自推理节点的 NITROS 类型输出消息,并使用 NITROS 视图获取包含检测输出的 CUDA 缓冲区。然后,您就可以对这些数据执行解码逻辑,并通过适当的 ROS 消息类型发布结果。

YOLOv8 解码器可设置 NMS 阈值和置信阈值等参数以过滤候选检测结果。可使用一个简单的可视化节点订阅产生的 ROS 消息,并在输入图像上绘制边界框。请注意,代管式 NITROS 只能与 CPP ROS 2 节点集成。

wKgZomVodJaAMNyrAADoOpPuEvY556.png

图 8. YOLOv8 解码器节点概览

Isaac ROS NITROS 桥接器

如果您的机器人应用目前基于 ROS 1,仍可以使用新发布的 Isaac ROS NITROS 桥接器来获得加速计算的红利。这对使用 ROS 2 版本(Humble 之前的版本)的开发者来说也很有帮助,因为 ROS 2 版本不提供类型适配和协商功能。

NITROS 桥接器在 ROS 1 Noetic 和 NITROS 软件包之间传输 1080p 图像的速度比 ROS 1 桥接器快 2.5 倍,充分凸显了所实现的提速效果。

ROS 桥接器会产生基于 CPU 的内存复制成本,而 Isaac ROS NITROS 桥接器通过将数据从 CPU 转移到 GPU 消除了这一成本。这些数据可以在 GPU 内存中就地使用。

NITROS 桥接器由两个转换器节点组成。一个用于 ROS(例如 Noetic)一侧,另一个用于 ROS 2(例如 Humble)一侧。在不使用 NITROS 转换器的情况下,使用 ROS 桥接器会导致图像从 Noetic 发送到 Humble,然后再通过 CPU 内存中的 ROS 进程副本发送回来,从而增加延迟。这个问题在发送大量数据(如分割点云)的节点之间尤为明显。

wKgZomVodJaAFm_1AABWwSk1FFE841.png

图 9. 不使用 NITROS 转换器情况下的 ROS 桥接器

NITROS 桥接器的设计目标是减少跨 ROS 版本的端到端延迟。请看同一个例子,这次使用的是 NITROS 转换器。Noetic 一侧的转换器(图 10)将图像移至 GPU 内存,避免了通过桥接器复制 CPU 内存。Humble 侧的转换器(图 10)将 GPU 内存中的图像转换为 NITROS 图像类型,该类型与其他 NITROS 加速节点兼容。

反之亦然——图像数据作为 NITROS 图像通过两侧中任何一侧的转换器从 Humble 发送到位于 Noetic 的 CPU 可访问内存中的图像。

更多关于性能提升的信息,请访问NITROS 桥接器:https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/scripts/isaac_ros_nitros_bridge.py和 ros1 桥接器的Isaac ROS 基准:https://nvidia-isaac-ros.github.io/repositories_and_packages/isaac_ros_benchmark/index.html。请注意,Isaac ROS NITROS 桥接器尚不支持 NVIDIA Jetson 平台。

wKgZomVodJaAGVigAABrYrFUbxk913.png

图 10. NITROS 桥接器概览

将 ROS 2 节点与 NITROS 集成的益处

下面总结了将 ROS 2 节点与 NITROS 集成的诸多益处:

  • 通过减少 CPU 内存拷贝以提高性能。

  • 与 RViz 等其他非 NITROS ROS 节点兼容。

  • 通过代管式 NITROS 发布器和订阅器,可轻松将自定义的 ROS 2 节点与硬件加速的 Isaac ROS 节点集成。

  • 使用搭载 NITROS 的 CUDA 进行模块化软件设计

  • 使用 NITROS 桥接器提高基于早期 ROS 版本的应用程序的性能。

尝试使用 Isaac ROS NITROS 和 YOLOv8 对象检测样本,加速您的 ROS 节点吧!

访问NVIDIA Isaac ROS 文档页面了解有关我们硬件加速软件包的更多信息:https://nvidia-isaac-ros.github.io/index.html

您还可以登陆开发者论坛了解更多有关 Isaac ROS 的最新信息:https://forums.developer.nvidia.com/c/agx-autonomous-machines/isaac/isaac-ros/600

GTC 2024 将于 2024 年 3 月 18 至 21 日在美国加州圣何塞会议中心举行,线上大会也将同期开放。点击“阅读原文”扫描下方海报二维码,立即注册 GTC 大会


原文标题:利用 NVIDIA Isaac Transport for ROS 提升自定义 ROS 图形性能

文章出处:【微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。


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

    关注

    22

    文章

    3791

    浏览量

    91313

原文标题:利用 NVIDIA Isaac Transport for ROS 提升自定义 ROS 图形性能

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    think-cell;自定义think-cell(一)

    本章介绍如何自定义 think-cell,即如何更改默认颜色和其他默认属性;这是通过 think-cell 的样式文件完成的,这些文件将在前四个部分中进行讨论。 第五部分 C.5 设置默认议程幻灯片
    的头像 发表于 01-08 11:31 65次阅读
    think-cell;<b class='flag-5'>自定义</b>think-cell(一)

    开放式激光振镜运动控制器在Ubuntu+Qt下自定义图形标刻

    开放式激光振镜运动控制器在Ubuntu+Qt下自定义图形标刻
    的头像 发表于 10-08 10:45 674次阅读
    开放式激光振镜运动控制器在Ubuntu+Qt下<b class='flag-5'>自定义</b><b class='flag-5'>图形</b>标刻

    创建自定义的基于闪存的引导加载程序(BSL)

    电子发烧友网站提供《创建自定义的基于闪存的引导加载程序(BSL).pdf》资料免费下载
    发表于 09-19 10:50 0次下载
    创建<b class='flag-5'>自定义</b>的基于闪存的引导加载程序(BSL)

    NVIDIA NeMo加速并简化自定义模型开发

    如果企业希望充分发挥出 AI 的力量,就需要根据其行业需求量身定制的自定义模型。
    的头像 发表于 07-26 11:17 772次阅读
    <b class='flag-5'>NVIDIA</b> NeMo加速并简化<b class='flag-5'>自定义</b>模型开发

    NVIDIA AI Foundry 为全球企业打造自定义 Llama 3.1 生成式 AI 模型

    Foundry 提供从数据策管、合成数据生成、微调、检索、防护到评估的全方位生成式 AI 模型服务,以便部署自定义 Llama 3.1 NVIDIA NIM 微服务和新的 NVIDIA NeMo
    发表于 07-24 09:39 721次阅读
    <b class='flag-5'>NVIDIA</b> AI Foundry 为全球企业打造<b class='flag-5'>自定义</b> Llama 3.1 生成式 AI 模型

    Labview实现自定义四维云图(三维曲面图像)可视化显示

    函数基础上,对其中的数据与程序进行修改,实现了曲面云图颜色效果的自定义配置,提升了Labview的可视化应用性。本文以Labview自带的“绘图帮助(向量)”vi作为对象,详细说明具体配置方法,并基于“三维曲面图形”范例对配置前
    发表于 07-16 10:52 55次下载

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    本帖最后由 Tronlong创龙科技 于 2024-7-19 17:18 编辑 ROS系统是什么 ROS(Robot Operating System)是一个适用于机器人的开源的元操作系统。它
    发表于 07-09 11:38

    如何在ROS中调用.so文件

    ,可以不用,其他的包都是必须的。 ROS的写法 现在要写一个.h文件,定义一些变量。之前cmake已经有了对QT的引用,因此直接用QT函数就行。 # ifndef DAQ_READ_H # define
    发表于 07-02 14:44

    HarmonyOS开发案例:【 自定义弹窗】

    基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗
    的头像 发表于 05-16 18:18 1391次阅读
    HarmonyOS开发案例:【 <b class='flag-5'>自定义</b>弹窗】

    TSMaster 自定义 LIN 调度表编程指导

    LIN(LocalInterconnectNetwork)协议调度表是用于LIN总线通信中的消息调度的一种机制,我们收到越来越多来自不同用户希望能够通过接口实现自定义LIN调度表的需求。所以在
    的头像 发表于 05-11 08:21 702次阅读
    TSMaster <b class='flag-5'>自定义</b> LIN 调度表编程指导

    用悟空派全志H3开发板做一个基于ROS系统的全向轮小车

    派H3和ROS系统的协同工作,我们能够远程操控小车,实时获取行驶里程数据,并在复杂的环境中灵活导航。 在接下来的视频中,我将详细展示这款全向轮小车的详细设计和性能表现,以及如何利用悟空派H3和
    发表于 05-06 11:15

    HarmonyOS开发实例:【自定义Emitter】

    使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
    的头像 发表于 04-14 11:37 1018次阅读
    HarmonyOS开发实例:【<b class='flag-5'>自定义</b>Emitter】

    鸿蒙ArkUI实例:【自定义组件】

    组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下自定义组件的语法规范。
    的头像 发表于 04-08 10:17 658次阅读

    SLAMWARE ROS SDK的基础架构、部署方法和应用示例介绍

    ROS作为机器人william hill官网 最广泛的基础架构之一,是很多用户开发机器人应用的首选框架,如果要在基于ROS开发的系统中集成思岚科技的机器人底盘或者SLAMKit建图定位解决方案,有什么最便捷的方法呢?ROS SDK就是为此而生。
    的头像 发表于 03-21 10:44 942次阅读
    SLAMWARE <b class='flag-5'>ROS</b> SDK的基础架构、部署方法和应用示例介绍

    系统镜像Ubuntu_ROS2中ROS2是什么意思,带有ROS2开发环境吗?

    请问一下,百度文库资料里面,下图所示的系统镜像Ubuntu_ROS2中ROS2是什么意思,带有ROS2开发环境吗?与前面4GB版本的镜像有什么区别?
    发表于 03-01 23:06