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

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

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

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 为机器人应用程序提供了许多构建块,称为 代码 。有关完整列表的更多信息,请参见 组件 API 概述 。

其中一些代码可以按原样提供,比如 录音机 。其他模块打包为模块,必须在代码集可用之前显式加载这些模块。将以下模块添加到刚刚创建的 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 是否有图像,如图 2 所示。

图 2 。查看的输出我的机器人. py 在 ISAAC 的视线里。

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

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

记录的传感器数据(容器)

真实传感器数据(摄像机)

模拟传感器数据

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

使用摄像头

ISAAC SDK 支持许多带有 V4L2Camera codelet 的 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 :

./build/sample.x86_64 --scene medium_warehouse

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

图 3 。在 ISAAC SDK Sight 中查看虚拟摄像机输出。

镜头来自安装在模拟机器人上的模拟摄像机。试着在模拟图形用户界面( 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 编码的代码集 PyCodelet JointPositionControl 从滑块读取目标关节位置值,并将这些值作为 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()

然后, 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 中,要有一个带摄像头的机械臂,请加载 stage omni:/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 处理模拟移动机器人和模拟机械臂。做机器人玩得开心!

使用以下资源开始使用 ISAAC SDK :

有关更多信息,请参见 ISAAC ISAAC 文档中的 ISAAC 。

ISAAC sdk2020 . 1 附带了许多示例 Python 应用程序,例如, //apps/samples/april_tags:april_tags_python 。相应的 Python 代码位于 //apps/samples/april_tags/april_tags_python.py 。这个应用程序从摄像机镜头中检测特定的四月标签,并可视化结果。有关它的更多信息,请参见 ISAAC SDK 文档中的 ISAAC 和 April 机器人实验室的 四月 。

关于作者

About Yang Liu

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

python应用程序开发者_用 NVIDIA ISAAC-SDK 在 Python 中开发机器人应用程序相关推荐

  1. USB设备仿真框架设计指南——11.在托管代码中开发DSF应用程序

    在DSF COM对象的托管代码中开发DSF测试应用程序有多种方法.对于托管代码与COM对象进行通信,必须将COM类型导入到COM类包装器中. 您可以使用以下任何方法创建COM类包装器: 通过类型库导入 ...

  2. VS2008中开发手持终端程序(PDA软件)总结

    VS2008中开发手持终端程序(PDA手机软件)的项目总结 1程序结构 程序中包括四个部分: 1.系统配置 这个部分用来配置系统中的相关参数,参数包括数据库信息和串口的配置信息.这部分的主要技术是XM ...

  3. python程序元素分析_荐 小学生三分钟学会Python程序语法元素分析~总结笔记

    Python程序语法元素分析 前言:朕今年在读大二,苦逼学python,写博客为了更好的总结知识,每次写博客可能要花费几个小时,或者更多时间来总结知识,如果你觉得文章对你有帮助,可以在文章末尾点赞和评 ...

  4. python语言的开发者_写给.NET开发者的Python教程(一):引言

    距离上一篇博文已过去8个月了,这段时间发生了很多事情导致没能持续更新博客.这段时间除了工作繁忙,业余时间都投入到AI技术的学习中,后面一段时间将会给大家分享我作为一个.NET开发人员在深度学习领域学习 ...

  5. python创建虚拟环境打包_用虚拟环境保存库文件--Python打包-阿里云开发者社区

    用虚拟环境保存库文件 如果你同时负责多个 Python 项目,或者想要轻松打包某个项目及其关联的库文件,再 或者你担心已安装的库之间可能有冲突,那么你可以安装一个 Python 虚拟环境来分而 治之. ...

  6. python3经典小程序代码_一个可以套路别人的python小程序实例代码

    python可以开发什么?谁有python小程序的源代码,...桌面程序,web都可以,还有比如现在讲的多的人工智能,神经网络源码可以去找一些开源代码,搜索一下,蛮多的. 分享python小程序代码练 ...

  7. python的电脑推荐_推荐8款常用的Python GUI图形界面开发框架

    作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言. Python 的 UI 开发工具 ...

  8. python错误代码提示手册_腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册...

    ↑关注 + 星标 ,每天学Python新技能后台回复[大礼包]送你Python自学大礼 在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常 ...

  9. python 全部缩进一行_每天三分钟一起学python之(三)python的基本语法

    每天三分钟,我们一起学python.在上一期PyCharm的安装及常用配置中,给大家介绍了PyCharm的安装方法和一些常用的配置.安装过PyCharm之后,我们就可以开始编写python程序了,今天 ...

最新文章

  1. JavaWeb——jsp-config
  2. 简介子窗口控件(api)
  3. 神经网络用python还是matlab_Matlab与神经网络学习笔记
  4. 多语言网站开发 不完全技术分析收录
  5. [禅悟人生]谦虚有助于自我消融
  6. 虽然自己不是唱歌的材料
  7. VGG Loss的Pytorch实现
  8. Canon EOS Utility安装和使用说明
  9. Vue事件修饰符.prevent .passive
  10. 2021window10下的IDEA安装
  11. win10 电脑内存占用率过高解决
  12. Jupyter内的文件保存
  13. 用python画熊_Python数据可视化:Pandas库,只要一行代码就能实现
  14. 《茅山后裔》全集(叶欣周铁版),MP3完整资源下载
  15. 公钥密码学的基本原理
  16. 自己动手玩转深度学习项目
  17. Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
  18. 连接失败!null, message from server: “Host ‘xxxx‘ is not allowed to connect to this MySQL server“
  19. python 通过邮件控制电脑 实现远程控制
  20. joda-time常用api实例

热门文章

  1. 贴片电容:NP0、C0G、X7R、X5R、Y5V、Z5U的区别
  2. 【报表Reporting Service】
  3. 超高频RFID标签无源传感的发展和特点
  4. RabbitMQ vhost权限问题
  5. 小米支付实习面试经历
  6. ios相机内存_传iPhone 11 Pro配备相机专用内存
  7. 面向对象:一切条条框框都不抵,遇见那个恰好的你
  8. 日期格式参数 含义说明
  9. speeding up your web site 前端性能优化
  10. Linux NoSQL 之 Redis 配置与优化