机器人技术正在采用深度学习技术来精确导航室内环境,检测并跟踪感兴趣的物体,以及在没有碰撞的情况下进行移动。然而,深度学习的复杂性日益增加,使得在嵌入式系统上适应这些工作负载具有挑战性。虽然您可以在精度和深度学习模型大小之间进行权衡,但在大多数机器人应用程序中,为了满足实时需求而牺牲精度通常会适得其反。
易于使用和部署使得NVIDIAJetson平台成为开发人员、研究人员和制造商制造和部署机器人(如JetBot、MuSHR和MITRaceCar)的合理选择。在这篇文章中,我们在Jetson上提出了用于分类、目标检测和人体姿势估计的深度学习模型。我们还提供了一个ROS2节点,用于在部署中监控Jetson的各种资源和操作参数。ros2提供了轻量级实现,因为它消除了网桥节点的依赖性,并在嵌入式系统中提供了各种优势。
我们利用现有的NVIDIA框架进行深度学习模型部署,如TensorRT,以提高模型推理性能。我们还集成了NVIDIADeepStreamSDK和ROS2,以便您可以执行流聚合和批处理,并部署各种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个身体部位。
图1ros2\utrt_pose软件包的描述和输出。
以下是ros2_trt_posepackage的主要功能:
发布pose_msgs,如countofperson和person_id。对于每个person_id,它发布17个身体部位。
提供启动文件以便于Rviz2上的使用和可视化:
图像消息
视觉标记:body_joints,body_skeleton
包含基于Jetson的Docker映像,便于安装和使用。
PyTorch和TensorRT的ROS2包
图2。ros2trt_分类和trt_检测节点的包描述。
使用PyTorch有两个用于分类和检测的包,每个包都实现了相应的TRT版本。这四个软件包是使用ros2的机器人专家开始使用PyTorch进行深度学习的良好起点。
TensorRT已经在torch2trt的帮助下集成到包中,以加速推断。它生成一个运行时引擎,该引擎根据网络架构和部署设备进行优化。
这些软件包的主要特点如下:
对于分类,您可以从各种ImageNet预训练模型中进行选择,包括Resnet18、AlexNet、squezenet和Resnet50。
对于检测,目前支持基于MobileNetV1的SSD,在COCO数据集上进行训练。
相对于直接在GPU上执行推理的PyTorch模型,TRT包在执行推理方面提供了显著的加速。
推理结果以视觉图形的形式公布。
在运行该节点时,还将显示一个窗口,其中可视化了推理结果。
提供了基于Jetson的Docker映像和启动文件,以便于使用。
用于DeepStreamSDK的ROS2节点
图3ROS2DeepStream发布服务器节点的包说明。
DeepStreamSDK提供了一个完整的流分析工具包,用于使用多传感器处理、视频和图像理解构建端到端基于人工智能的解决方案。它支持流行的对象检测和分割模型,如最先进的SSD、YOLO、FasterRCNN和MaskRCNN。
NVIDIA根据DeepStreamPythonApps项目提供执行两个推理任务的ROS2节点,如下所示:
目标检测:检测到四类对象:Vehicle、Person、RoadSign和TwoWheeler。
属性分类:车辆类的对象有三种类型的属性:Color、Make和Type。
这些发布服务器节点从摄像机或文件接收单个或多个视频流作为输入。它们执行推理,并将检测和分类的结果发布到不同的主题。我们还提供了订阅这些主题并以vision_msgs格式显示结果的ros2订户节点示例。每个推理任务还生成一个可视化窗口,在检测到的对象周围有边界框和标签。附加的推理任务和定制模型可以与本项目中提供的DeepStream软件架构集成。
vision_msgsClassification2D格式的示例分类输出:
[vision_(id=’silver’,score=0.14),vision_(id=’toyota’,score=0.33),vision_(id=’sedan’,score=0.75)]
ROS2Jetson统计
ros2_jetson_stats包是一个社区构建包,用于监视和控制您的Jetson设备。它可以在您的终端上运行,并提供一个Python包,以便于在Python脚本中集成。利用ros2_jetson_stats库,构建ROS2诊断消息和服务。
ros2_jetson_stats软件包具有以下ROS2诊断消息:
GPU/CPU使用百分比
EMC/交换/内存状态
SoC的功率和温度
现在您可以通过ROS2命令行控制以下内容:
(EZX29和Speed:
电源型号
jetson_clocks
您还可以提供一个参数来设置读取诊断消息的频率。
有关详细信息,请参阅NVIDIA-AI-IOT/ros2_jetson_statsGitHubrepo。
用于Jetson的ROS2容器
为了在Jetson上轻松运行ROS2的不同版本,NVIDIA发布了各种dockerfile,并为ROS2Eloquent和Foxy构建了脚本,此外还有ROSMelodic和Noetic。这些容器提供了在Jetson上安装ROS或ROS2并构建自己的基于ROS的应用程序的自动化和可靠的方法。
因为Elocquent和Melodic已经为Ubuntu18。04提供了预构建的包,所以这些版本的ROS被Dockerfiles安装到容器中。另一方面,Foxy和Noetic是从容器内部的源代码构建的,因为这些版本都是为ubuntu20。04预构建的。对于容器,使用这些版本的ROS或ROS2是相同的,不管底层的OS发行版如何。
要构建容器,请在运行Jetpack4。4或更新版本的Jetson设备上克隆repo,然后启动ROS构建脚本:
此命令创建具有以下标记的容器:
ros:
ros:
ros:
ros:
例如,要启动ROS2Foxy容器,请运行以下命令:
$sudodockerrun–runtimenvidia-it–rm–networkhostros:
除了Jetson设备上的其他硬件加速器,使用–runtimenvidia标志会自动启用容器中的GPU直通。要在容器中传输MIPICSI摄影机,请包含以下标志:
–volume/tmp/argus_socket:/tmp/argus_socket
要在容器中传输V4L2USB摄像头,请在启动容器时安装所需的/dev/video*设备:
–device/dev/video0
NVIDIAOmniverseISAAC面向ROS开发者的仿真平台
在OmniverseNVIDIA平台上构建的NVIDIAISAAC模拟仿真工具包比现有的机器人工作流程带来了一些有用的改进:
它利用了Omniverse高度精确的物理模拟和逼真的光线跟踪图形,直接与业界领先的物理框架集成,如用于刚体动力学的NVIDIAPhysXSDK。
它重新关注互操作性、与NVIDIAISAACSDK的深度集成以及ROS的扩展。
它很容易扩展。通过其基于Python的脚本接口,它允许您适应自己独特的用例。
它是为可部署而构建的,其体系结构支持本地工作站上的工作流,并通过云与NVIDIANGC一起工作。
AmeyKulkarni是NVIDIA的开发技术工程师,专注于将深度学习解决方案有效地部署到边缘。在2019年加入NVIDIA之前,他完成了马里兰大学计算机工程博士学位。他的研究兴趣是在嵌入式平台上部署数字信号处理、计算机视觉和深度学习系统。
RishabhChadha是NVIDIA的嵌入式工程实习生——AI,他专注于为NVIDIAJetson平台集成深度学习和机器人技术框架。他将于2021年毕业于伍斯特理工学院,获得机器人学硕士学位。他的兴趣主要包括深度学习、医学成像和机器人感知。
AsawareeBhide是NVIDIA的AI嵌入式工程实习生,致力于优化和部署边缘设备上的深度学习模型。她目前正在乔治亚理工学院攻读计算机科学硕士学位,她对解决由具体代理自主导航的复杂感知任务感兴趣。TomaszLewicki是NVIDIA的嵌入式工程实习生。他拥有圣何塞州立大学计算机工程硕士学位,华沙工业大学华沙工业大学机器人工程学学士学位。他的兴趣集中在计算机视觉和机器人应用的深度学习上。
审核