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

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

3天内不再提示

用NVIDIA ISAAC-SDK开发机器人应用程序

星星科技指导员 来源:NVIDIA 作者:Yang Liu 2022-04-28 11:48 次阅读

NVIDIA ISAAC 软件开发工具包 的模块化和易于使用的感知堆栈继续加速各种移动机器人的发展。 ISAAC sdk2020.1 引入了 Python API ,使那些熟悉 Python 的人更容易构建机器人应用程序。

在这篇文章中,我们将探讨这个特性,并分享如何使用 Python 构建您自己的 ISAAC 应用程序的分步指南。我们在 ISAAC SDK 中介绍 Python 编程,并举例说明如何创建应用程序;如何使用代码、模块和数据流;以及如何处理不同的数据类型。我们用示例来总结文章,将子图添加到同一个应用程序中,并将其部署到 Jetson 上。我们还将向您展示如何使用 Jupyter 笔记本电脑,这是一个面向 Python 开发人员的强大 UI 工具。对于更高级的 Python 开发人员,我们还提供了在移动机器人上部署 ISAAC 应用程序以及在 ISAAC Sim 中部署协作机器人手臂的例子。

Controlling-a-virtual-robot-in-IsaacSim-625x348.png

图 1 。使用 Jupyter 笔记本和 ISAAC SDK Python API 在 ISAAC Sim 中控制虚拟机器人。

ISAAC SDK 中 Python 编程入门

为了指导您使用 Python 创建一个 ISAAC 应用程序,请创建一个 mybot.py 应用程序文件。从 apps 文件夹下的新文件夹开始, //apps/mybot 。用下面的代码创建一个构建文件,并将其保存在 //apps/mybot/BUILD 下,以便 Bazel 能够识别它。

ISAAC SDK 中 Python 编程入门

为了指导您使用 Python 创建一个 ISAAC 应用程序,请创建一个mybot.py应用程序文件。从 apps 文件夹下的新文件夹开始,//apps/mybot。用下面的代码创建一个构建文件,并将其保存在//apps/mybot/BUILD下,以便 Bazel 能够识别它。

load("//engine/build:isaac.bzl", "isaac_py_app")
isaac_py_app( name = "mybot", srcs = ["mybot.py"], data = [], modules=[], deps = [ "//engine/pyalice", ],
)

在构建文件中,//engine/pyalice是 Python API 的支持代码,mybot.py是用 Python 编写的 robot 应用程序。将下面的代码放入//apps/mybot/mybot.py并用bazel run apps/mybot:mybot运行它。您可以通过控制台 spew 判断它正在运行,您可以使用经典的 CTR L-C 随时停止它。

from engine.pyalice import Application app = Application(name="mybot")
app.run()

当应用程序运行时,将浏览器指向http://localhost:3000,您将在视力中看不到任何内容,这是 ISAAC SDK 中的可视化工具。

了解代码、模块和数据流

ISAAC SDK 为机器人应用程序提供了许多构建块,称为代码

其中一些代码可以按原样提供,比如录音机。其他模块打包为模块,必须在代码集可用之前显式加载这些模块。将以下模块添加到刚刚创建的 Bazel 构建文件中,以便加载它们。

 modules = [ "message_generators", "viewers", ],

现在可以使用在app.run之前创建的应用程序实例从 Python 加载它们:

app.load_module('message_generators')
app.load_module('viewers')

在 ISAAC SDK 中,数据由传感器生成,并在代码实例之间流动,直到它们被执行器消耗。要从加载的 codelet 创建实例,请在调用之前将以下代码添加到 Python 应用程序应用程序运行.

node_src = app.add('src')
component_src = \ node_src.add(app.registry.isaac.message_generators.ImageLoader, 'ImageLoader')

这里创建了一个名为src的节点。消息生成器模块提供的ImageLoader的组件以ImageLoader的名称创建,并附加到src的节点上。它将指定 PNG 文件中的图像数据作为ColorCameraProto消息发布,就像它们来自真实的相机一样。您可以指定要从中加载数据的图像以及其他几个参数(尽管在本示例中这些参数并不重要)以及消息发布的频率。有关详细信息,请参阅ISAAC 消息_ generators . ImageLoader

component_src.config['color_filename'] = '/home/bob/Pictures/panda.png'
component_src.config['focal_length'] = [35.0, 35.0]
component_src.config['optical_center'] = [300.0, 400.0]
component_src.config['tick_period'] = '1hz'

为了可视化摄像机图像,彩色摄影机代码将有所帮助。类似地,您可以使用以下代码创建它的实例:

node_sink = app.add('sink')
component_sink = \ node_sink.add(app.registry.isaac.viewers.ColorCameraViewer, 'ColorCameraViewer')

数据应该在代码之间流动。但是,必须在它们之间建立连接才能使数据流动。从文档中可以看出,CameraGenerator有三个输出通道。选择ColorCameraProto消息发布到的 color _ left 频道。类似地,您可以看到ColorCameraViewer代码从color_listener通道读取消息。连接它们(称为“边缘”):

app.connect(component_src, 'color', component_sink, 'color_listener')

再次运行应用程序(mybot.py),并检查 Sight 是否有图像。

在 Python 中使用不同的 ISAAC 图像数据类型

ISAAC SDK 允许您在应用程序中使用多个数据源:

  • 记录的传感器数据(容器)
  • 真实传感器数据(摄像机)
  • 模拟传感器数据

在本节中,我们将解释如何在 Python 应用程序中使用这些数据类型。

使用摄像头

ISAAC SDK 支持许多带有V4L2Cameracodelet 的 USB 摄像头。

在本节中,您将使用 Realsense 摄像头,它由realsense模块中的RealsenseCamera代码集支持。类似地,你可以从视线中看到摄像机镜头,就像之前的图像一样。因为这是对ImageLoader的直接替换,所以可以使用命令行参数在它们之间进行切换。有关如何在 Python 中处理命令行参数的更多信息,argparse- 命令行选项、参数和子命令的解析器。您将得到如下代码示例:

parser = argparse.ArgumentParser(description='Sample Python API app')
parser.add_argument('--source',
                   type=str,
                   dest='source',
                   help='The source to get data from',
                   choices=['camera', 'image'],
                   default='camera')
args, _ = parser.parse_known_args()
if args.source == 'image':
   app.load_module('message_generators')
   component_src = \
     node_src.add(app.registry.isaac.message_generators.ImageLoader, 'src')
   component_src.config['color_filename'] = '/home/bob/Pictures/panda.png'
   component_src.config['focal_length'] = [35.0, 35.0]
   component_src.config['optical_center'] = [300.0, 400.0]
   component_src.config['tick_period'] = '1hz'
   app.connect(component_src, 'color', viewer_component, 'color_listener')
elif args.source == 'camera':
   app.load_module('realsense')
   camera = app.add("cam").add(app.registry.isaac.RealsenseCamera)
   camera.config.rows = 480
   camera.config.cols = 640
   camera.config.color_framerate = 30
   camera.config.depth_framerate = 30
   app.connect(camera, 'color', viewer_component, 'color_listener')
app.run()

如前所示, PythonAPI 提供了处理不同环境的灵活性。

使用木桶

使用真实的传感器数据是直观的,但是这样做并不总是实际可行的。木桶能帮上忙。 Cask 是用于记录 ISAAC SDK 中的消息的格式。在 ISAAC SDK 中,可以记录一个消息流,并在以后回放以用于调试或分析。要从 Realsense 摄像头录制图像流,请尝试在//apps/samples/camera:record_realsense运行示例应用程序。

有了录音桶,你可以在没有真正的传感器的情况下随时随地重放和播放消息流。假设记录的容器位于/home/bob/cask/的文件夹中。您可以使用Replay代码来检索消息:

   player_node = app.add('player')
   player_component = player_node.add(app.registry.isaac.alice.Replay)
   player_component.config['cask_directory'] = '/home/bob/cask'
   app.connect(player_component, 'color', viewer_component, 'color_listener')

类似地,您可以向 Python 应用程序添加一个 cask 作为一个可能的选项,就像您使用 realseness camera 一样。这里,名称color是用于记录彩色相机图像流的通道名称。然后你就可以查看视频流,就好像它来自真实的摄像机一样。

使用模拟传感器

如前所述,您已经有了一个 Python 应用程序,可以在记录的传感器数据( cask )和真实传感器数据( camera )之间切换。现在再添加一个可能的数据源:来自 ISAAC Sim Unity3D 的模拟传感器。将 Sim 选项添加到命令行参数源,并将模拟相机消息流连接到查看器以进行可视化,如以下代码示例所示:

parser.add_argument('--source', type=str, dest='source', help='The source to get data from', choices=['cask', 'camera', 'image', 'sim'], default='sim')
… if args.source == 'image': ...
elif args.source == 'cask': ...
elif args.source == 'camera': ...
elif args.source == 'sim': app.load('packages/navsim/apps/navsim_tcp.subgraph.json') app.connect('interface/output', 'color', 'viewer/ColorCameraViewer', 'color_listener') app.run()

检索 ISAAC 是 Unity3D。有关详细信息,请参阅ISAAC Sim Unity3D

启动 ISAAC 是 Unity3D :

./build/sample.x86_64 --scene medium_warehouse

默认情况下, Python 应用程序尝试与同一主机上的模拟对话。如果应用程序正在另一台主机上运行,请为组件interface/output配置相应的主机参数。有关详细信息,请参阅isaac.alice.TcpSubscriber。运行该应用程序,模拟摄像机的镜头可以看到。

镜头来自安装在模拟机器人上的模拟摄像机。试着在模拟图形用户界面( GUI )上玩一些可移动的物体,比如纳米盒子,看看模拟相机的工作原理和真相机一样。

用子图把它拉到一起

正如您所注意到的,组件(从代码创建的实例)和连接它们的边组成了一个图形。这样的图可以从 JSON 文件加载,也可以根据需要从 Python 应用程序加载。有关详细信息,请参阅 MIG 。

例如,模拟通信子图packages/navsim/apps/navsim_tcp.subgraph.json封装了用于使用 TCP 与 ISAAC Sim Unity3D 或 NVIDIA Omniverse 通信的节点、组件和边。要使其对应用程序可用,请将以下 Bazel 数据依赖项添加到您先前创建的生成文件中:

 data = [ "//packages/navsim/apps:navsim_tcp_subgraph", ],

在 Python 应用程序中,可以使用以下命令加载它:

app.load('packages/navsim/apps/navsim_tcp.subgraph.json')

子图组件更像是由一组节点组成的配方,而不是容器。加载子图更像是按照配方创建节点和组件。在视图中,您可以看到从子图(图 4 )创建的所有节点(场景管理器、接口)。通过将它们与其他节点连接,可以使用app.connect创建更复杂的应用程序。

图 4 。显示各种子图使用情况的计算图。

当加载多个子图时,命名冲突 MIG ht 会发生,因为在任何应用程序中,节点都需要具有唯一的名称。若要避免此类冲突,请使用另一个参数加载子图:

app.load( 'packages/navsim/apps/navsim_tcp.subgraph.json', 'simulation',
)

这里,第二个参数是 JSON 文件中指定的所有节点的“ node name prefix ”。例如,packages/navsim/apps/navsim_tcp.subgraph.json文件指定一个名为interface的节点。前面的语句将创建一个名为simulation.interface的节点,而不是interface

在 Jetson 上部署应用程序

现在有了一个 Python 应用程序。在真正的 Jetson 板上运行只需要一个命令:

./engine/build/deploy.sh -h -p //apps/mybot:mybot-pkg -d jetpack43

有关将应用程序部署到 Jetson 的更多信息,请参阅入门在 Jetson 上部署和运行

使用 SSH 连接到您的 Jetson 板或从 GUI 打开一个终端并检查文件夹/home/nvidia/deploy/bob/mybot-pkg。如果您在 Jetson 和开发设置上使用不同的用户名,请将nvidia替换为 Jetson 板上的用户名,将 bob 替换为开发设置上的用户名。

使用以下命令在 Jetson 上运行应用程序:

nvidia@Jetson:~/deploy/bob/mybot-pkg$ ./run apps/mybot/mybot.py

如果您正在使用存储库之外的资源,请考虑将它们添加到应用程序的 Bazel 依赖项中,以便可以使用deploy.sh将它们与应用程序一起自动部署到deploy.sh

如果您在 PC 机上使用 ISAAC Sim Unity3D ,则可以正常通信。

使用 Jupyter 笔记本

因为这里有 pythonapi ,所以 Jupyter 笔记本肯定可以工作。将以下生成文件与空的mybot.ipynb一起使用:

isaac_jupyter_app(
   name = "mybot",
   modules = [
       "message_generators",
       "viewers",
   ],
   notebook = "mybot.ipynb",
)

以类似于 Jetson 板或 X86 工作站的方式部署应用程序,并使用以下命令启动 Jupyter :

jupyter notebook apps/mybot/mybot.ipynb

你现在可以走了。 run 函数被阻塞,只有在 robotic 应用程序停止时才返回。要以交互方式使用 robotics 应用程序,请相应地使用 start 和 stop 函数。

Python 在模拟移动机器人中的应用

在使用模拟传感器工作的部分,有一个模拟机器人,上面安装了模拟摄像机。 ISAAC Sim Unity3D 是用来模拟移动机器人的。对于在 ISAAC Sim Unity3D 中控制带有差分基座的模拟机器人的示例 robot 应用程序,请检查//apps/navsim:navsim_navigate中的应用程序。组件和子图可以在 JSON 文件apps/navsim/navsim_navigate.app.json中找到。有关详细信息,请参见ISAAC Sim Unity3D

用 Python 模拟机器人手臂

除了移动机器人,用 Jupyter 笔记本电脑进行简单的联合控制SDK 也可以用于构建机器人手臂的应用程序。有了Omniverse ISAAC ,你可以在没有真正硬件的情况下使用模拟机械手臂。有关更多信息,请按照用 Jupyter 笔记本电脑进行简单的联合控制上的“ UR10 in用 Jupyter 笔记本电脑进行简单的联合控制用 Jupyter 笔记本电脑进行简单的联合控制Sim ”会话说明操作。应用程序将在模拟中控制机械臂,如图 5 所示。

图 5 。通用机器人的 UR10 正在使用 Jupyter 笔记本电脑进行模拟控制。

以下是应用程序中发生的情况。第一件事是加载一个子图,允许通过 TCP 与模拟器通信。

app.load(filename="packages/navsim/apps/navsim_tcp.subgraph.json", prefix="simulation")

若要为关节生成平滑运动,请为节点加载另一个子图:

app.load( filename="packages/planner/apps/multi_joint_lqr_control.subgraph.json", prefix="lqr")

该子图封装 LQR 规划器的节点,生成当前关节状态和目标关节位置的命令。将仿真节点与规划器的节点连接起来,以使机械臂关节状态消息和命令消息在它们之间流动:

app.connect(simulation_node["output"], "joint_state", lqr_interface, "joint_state")
app.connect(lqr_interface, "joint_command", simulation_node["input"], "joint_position")

用 Python 编码的代码集 PyCodeletJointPositionControl从滑块读取目标关节位置值,并将这些值作为CompositeProto消息发布:

class JointPositionControl(Codelet):
    def start(self):
        self.tx = self.isaac_proto_tx("CompositeProto", "command")
      self._widget = CompositeWidget(self.config.joints "position", self.config.limits)
    def tick(self):
        self.tx._msg = self._widget.composite
      self.tx.publish()

有关详细信息,请参见创建 Python 代码

然后,JointPositionControl代码集连接到一个节点,并连接到 LQR planner 的目标输入通道:

widget_node = app.add("command_generator")
joint_commander = widget_node.add(JointPositionControl)
app.connect(joint_commander, "command", lqr_interface, "joint_target")

启动应用程序应用程序启动你可以随意使用手臂。

带模拟摄像机的模拟机械臂

在 Omniverse ISAAC Sim 中,要有一个带摄像头的机械臂,请加载 stageomni:/Isaac/Samples/Isaac_SDK/Scenario/sortbot_sim.usd。在 Omniverse ISAAC Sim 中启动仿真和机器人引擎桥,并将视口从透视切换到腕部摄影机,如图 6 和 7 所示。

图 6 。 ISAAC Sim 中机器人的透视图。

与之前的应用程序一样,您可以将模拟摄影机通道连接到ColorCameraViewer代码板以可视化画面,并将DepthCameraViewer连接到可视化模拟深度传感器数据。

app.load_module("viewers")
viewers = app.add("viewers")
color_viewer = viewers.add(app.registry.isaac.viewers.ColorCameraViewer, "ColorViewer")
app.connect(simulation_node["output"], "color", color_viewer, "color_listener")
depth_viewer = viewers.add(app.registry.isaac.viewers.DepthCameraViewer, "DepthViewer")
app.connect(simulation_node["output"], "depth", depth_viewer, "depth_listener")
depth_viewer.config.max_visualization_depth = 3

启动应用程序,模拟的摄像机镜头应该会出现在眼前:

图 7 。 ISAAC 模拟中机器人的手腕视图。

总结

在本文中,您使用 pythonapi 从头创建了一个机器人应用程序。您使应用程序可以使用真实的摄影机、录制的摄影机数据和模拟摄影机。我们还向您展示了如何使用 pythonapi 处理模拟移动机器人和模拟机械臂。做机器人玩得开心!

关于作者

Yang Liu 是一名软件工程师,负责开发 NVIDIA ISAAC SDK 的各个部分。他获得了达拉斯德克萨斯大学计算机科学博士学位。

审核编辑:郭婷

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

    关注

    2

    文章

    1499

    浏览量

    61975
  • 应用程序
    +关注

    关注

    37

    文章

    3267

    浏览量

    57684
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84634
收藏 人收藏

    评论

    相关推荐

    NVIDIA通过加速AWS上的机器人仿真推进物理AI的发展

    NVIDIA Isaac Sim 现在可在 Amazon EC2 G6e 实例中的 NVIDIA GPU 云实例上使用,将机器人仿真的扩展速度提高了 2 倍并加快了 AI 模型的训练速
    的头像 发表于 12-09 11:50 291次阅读

    利用NVIDIA Isaac平台构建、设计并部署机器人应用

    任务等功能。 AI 在这一变革中发挥着关键作用,提高了机器人的性能。通过集成 NVIDIA AI 加速,机器人可以更高的精度和效率处理复杂的任务,在各种应用中充分发挥自己的潜力。
    的头像 发表于 11-09 11:41 704次阅读
    利用<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b>平台构建、设计并部署<b class='flag-5'>机器人</b>应用

    NVIDIA助力Figure发布新一代对话式人形机器人

    该初创公司展示了新型机器人,其使用 NVIDIA Isaac Sim 处理合成数据,并使用基于 NVIDIA 加速计算进行实时推理训练的生成式 AI 模型。
    的头像 发表于 11-04 10:10 256次阅读

    NVIDIA与学术研究人员联合开发手术机器人

    利用 NVIDIA Isaac Sim 和 NVIDIA Omniverse 开发的 ORBIT-Surgical 正在 ICRA 机器人
    的头像 发表于 10-10 10:00 441次阅读

    NVIDIA提供一套服务、模型以及计算平台 加速人形机器人发展

    开发者可以访问新的 NVIDIA NIM 微服务,用于 Isaac Lab 和 Isaac Sim 中的机器人仿真、OSMO
    的头像 发表于 07-31 10:41 651次阅读

    NVIDIA 加速人形机器人发展

    开发者可以访问新的 NVIDIA NIM 微服务,用于 Isaac Lab 和 Isaac Sim 中的机器人仿真、OSMO
    发表于 07-30 09:15 739次阅读
    <b class='flag-5'>NVIDIA</b> 加速人形<b class='flag-5'>机器人</b>发展

    逐际动力携手英伟达Isaac平台, 助力通用机器人研发

    在近日举行的年度计算机视觉与模式识别会议(CVPR)上,英伟达发布了其最新版本的NVIDIA Isaac Sim。与此同时,逐际动力也宣布将采用这一升级版的Isaac平台,以强化学习和提升通用
    的头像 发表于 06-21 09:34 2396次阅读

    NVIDIA Isaac 机器人平台利用最新的生成式 AI 和先进的仿真技术,加速 AI 机器人技术的发展

    NVIDIA 发布了 Isaac Manipulator 和 Isaac Perceptor 等一系列基础模型、机器人工具和 GPU 加速库。 NV
    的头像 发表于 06-04 18:00 7696次阅读
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b> <b class='flag-5'>机器人</b>平台利用最新的生成式 AI 和先进的仿真技术,加速 AI <b class='flag-5'>机器人</b>技术的发展

    全球机器人开发领域采用NVIDIA 机器人开发和生产

    比亚迪电子、西门子、泰瑞达和 Alphabet 旗下公司 Intrinsic 采用 NVIDIA Isaac 机器人平台开发自主机械臂、人形机器人
    的头像 发表于 06-03 18:25 1232次阅读

    使用NVIDIA Isaac Manipulator生成抓取姿势和机器人运动

    NVIDIA 宣布与 Intrinsic.ai 就工业机器人任务的基础技能模型学习展开合作。
    的头像 发表于 05-17 10:33 1257次阅读
    使用<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b> Manipulator生成抓取姿势和<b class='flag-5'>机器人</b>运动

    NVIDIA Isaac机器人平台升级,加速AI机器人技术革新

    NVIDIA Isaac机器人平台近期实现重大升级,通过引入最新的生成式AI技术和先进的仿真技术,显著加速了AI机器人技术的发展步伐。该平台正不断扩展其基础模型、
    的头像 发表于 03-27 10:36 672次阅读

    NVIDIA入局人形机器人Isaac平台迎来重要更新

    NVIDIA Isaac 机器人平台利用最新的生成式 AI 和先进的仿真技术,加速 AI 机器人技术的发展。
    的头像 发表于 03-26 09:07 1069次阅读
    <b class='flag-5'>NVIDIA</b>入局人形<b class='flag-5'>机器人</b>!<b class='flag-5'>Isaac</b>平台迎来重要更新

    NVIDIA Isaac将生成式AI应用于制造业和物流业

    NVIDIA Isaac 机器人平台利用最新的生成式 AI 和先进的仿真技术,加速 AI 机器人技术的发展。
    的头像 发表于 03-22 10:06 530次阅读
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b>将生成式AI应用于制造业和物流业

    NVIDIA Isaac平台为AI机器人开发提供支持

    在今日的CES特别演讲中,NVIDIA机器人和边缘计算副总裁Deepu Talla揭示了NVIDIA及其合作伙伴如何将生成式AI与机器人技术融为一体。
    的头像 发表于 01-09 15:00 1083次阅读

    使用 NVIDIA Isaac 仿真并定位 Husky 机器人

    如何使用 ROS 2 Husky 官方软件包将该机器人导入 NVIDIA Isaac Sim 并创建仿真。 本 Demo 中的 Husky 机器人配备了
    的头像 发表于 12-26 18:05 1322次阅读
    使用 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b> 仿真并定位 Husky <b class='flag-5'>机器人</b>