NVIDIAISAAC软件开发工具包的模块化和易于使用的感知堆栈继续加速各种移动机器人的发展。ISAAC引入了PythonAPI,使那些熟悉Python的人更容易构建机器人应用程序。
在这篇文章中,我们将探讨这个特性,并分享如何使用Python构建您自己的ISAAC应用程序的分步指南。我们在ISAACSDK中介绍Python编程,并举例说明如何创建应用程序;如何使用代码、模块和数据流;以及如何处理不同的数据类型。我们用示例来总结文章,将子图添加到同一个应用程序中,并将其部署到Jetson上。我们还将向您展示如何使用Jupyter笔记本电脑,这是一个面向Python开发人员的强大UI工具。对于更高级的Python开发人员,我们还提供了在移动机器人上部署ISAAC应用程序以及在ISAACSim中部署协作机器人手臂的例子。
图1。使用Jupyter笔记本和ISAACSDKPythonAPI在ISAACSim中控制虚拟机器人。
ISAACSDK中Python编程入门
为了指导您使用Python创建一个ISAAC应用程序,请创建一个应用程序文件。从apps文件夹下的新文件夹开始,//apps/mybot。用下面的代码创建一个构建文件,并将其保存在//apps/mybot/BUILD下,以便Bazel能够识别它。
ISAACSDK中Python编程入门为了指导您使用Python创建一个ISAAC应用程序,请创建一个应用程序文件。从apps文件夹下的新文件夹开始,//apps/mybot。用下面的代码创建一个构建文件,并将其保存在//apps/mybot/BUILD下,以便Bazel能够识别它。
load("//engine/build:","isaac_py_app")isaac_py_app(name="mybot",srcs=[""],data=[],modules=[],deps=["//engine/pyalice",],)在构建文件中,//engine/pyalice是PythonAPI的支持代码,是用Python编写的robot应用程序。将下面的代码放入//apps/mybot/并用bazelrunapps/mybot:mybot运行它。您可以通过控制台spew判断它正在运行,您可以使用经典的CTRL-C随时停止它。
fromimportApplicationapp=Application(name="mybot")()了解代码、模块和数据流
ISAACSDK为机器人应用程序提供了许多构建块,称为代码。
其中一些代码可以按原样提供,比如录音机。其他模块打包为模块,必须在代码集可用之前显式加载这些模块。将以下模块添加到刚刚创建的Bazel构建文件中,以便加载它们。
modules=["message_generators","viewers",],
现在可以使用在之前创建的应用程序实例从Python加载它们:
_module('message_generators')_module('viewers')在ISAACSDK中,数据由传感器生成,并在代码实例之间流动,直到它们被执行器消耗。要从加载的codelet创建实例,请在调用之前将以下代码添加到Python应用程序应用程序运行.
node_src=('src')component_src=\node_(_,'ImageLoader')这里创建了一个名为src的节点。消息生成器模块提供的ImageLoader的组件以ImageLoader的名称创建,并附加到src的节点上。它将指定PNG文件中的图像数据作为ColorCameraProto消息发布,就像它们来自真实的相机一样。您可以指定要从中加载数据的图像以及其他几个参数以及消息发布的频率。有关详细信息,请参阅ISAAC消息_generators.ImageLoader。
三维立体分拣机器人component_['color_filename']='/home/bob/Pictures/'component_['focal_length']=[35.0,35.0]component_['optical_center']=[300.0,400.0]component_['tick_period']='1hz'
node_sink=('sink')component_sink=\node_(,'ColorCameraViewer')数据应该在代码之间流动。但是,必须在它们之间建立连接才能使数据流动。从文档中可以看出,CameraGenerator有三个输出通道。选择ColorCameraProto消息发布到的color_left频道。类似地,您可以看到ColorCameraViewer代码从color_listener通道读取消息。连接它们:
(component_src,'color',component_sink,'color_listener')
再次运行应用程序,并检查Sight是否有图像。
在Python中使用不同的ISAAC图像数据类型ISAACSDK允许您在应用程序中使用多个数据源:
记录的传感器数据模拟传感器数据在本节中,我们将解释如何在Python应用程序中使用这些数据类型。
使用摄像头ISAACSDK支持许多带有V4L2Cameracodelet的USB摄像头。
在本节中,您将使用Realsense摄像头,它由realsense模块中的RealsenseCamera代码集支持。类似地,你可以从视线中看到摄像机镜头,就像之前的图像一样。因为这是对ImageLoader的直接替换,所以可以使用命令行参数在它们之间进行切换。有关如何在Python中处理命令行参数的更多信息,argparse-命令行选项、参数和子命令的解析器。您将得到如下代码示例:
parser=(description='SamplePythonAPIapp')_argument('--source',type=str,dest='source',help='Thesourcetogetdatafrom',choices=['camera','image'],default='camera')args,_=_known_args()if=='image':_module('message_generators')component_src=\node_(_,'src')component_['color_filename']='/home/bob/Pictures/'component_['focal_length']=[35.0,35.0]component_['optical_center']=[300.0,400.0]component_['tick_period']='1hz'(component_src,'color',viewer_component,'color_listener')elif=='camera':_module('realsense')camera=("cam").add()=480=640_framerate=30_framerate=30(camera,'color',viewer_component,'color_listener')()如前所示,PythonAPI提供了处理不同环境的灵活性。
使用木桶使用真实的传感器数据是直观的,但是这样做并不总是实际可行的。木桶能帮上忙。Cask是用于记录ISAACSDK中的消息的格式。在ISAACSDK中,可以记录一个消息流,并在以后回放以用于调试或分析。要从Realsense摄像头录制图像流,请尝试在//apps/samples/camera:record_realsense运行示例应用程序。
有了录音桶,你可以在没有真正的传感器的情况下随时随地重放和播放消息流。假设记录的容器位于/home/bob/cask/的文件夹中。您可以使用Replay代码来检索消息:
player_node=('player')player_component=player_()player_['cask_directory']='/home/bob/cask'(player_component,'color',viewer_component,'color_listener')类似地,您可以向Python应用程序添加一个cask作为一个可能的选项,就像您使用realsenesscamera一样。这里,名称color是用于记录彩色相机图像流的通道名称。然后你就可以查看视频流,就好像它来自真实的摄像机一样。
使用模拟传感器如前所述,您已经有了一个Python应用程序,可以在记录的传感器数据和真实传感器数据之间切换。现在再添加一个可能的数据源:来自ISAACSimUnity3D的模拟传感器。将Sim选项添加到命令行参数源,并将模拟相机消息流连接到查看器以进行可视化,如以下代码示例所示:
_argument('--source',type=str,dest='source',help='Thesourcetogetdatafrom',choices=['cask','camera','image','sim'],default='sim')…if=='image':...elif=='cask':...elif=='camera':...elif=='sim':('packages/navsim/apps/navsim_')('interface/output','color','viewer/ColorCameraViewer','color_listener')()检索ISAAC是Unity3D。有关详细信息,请参阅ISAACSimUnity3D。
启动ISAAC是Unity3D:
快递分拣机器人多少钱./build/_64--scenemedium_warehouse
默认情况下,Python应用程序尝试与同一主机上的模拟对话。如果应用程序正在另一台主机上运行,请为组件interface/output配置相应的主机参数。有关详细信息,请参阅。运行该应用程序,模拟摄像机的镜头可以看到。
镜头来自安装在模拟机器人上的模拟摄像机。试着在模拟图形用户界面上玩一些可移动的物体,比如纳米盒子,看看模拟相机的工作原理和真相机一样。
用子图把它拉到一起正如您所注意到的,组件和连接它们的边组成了一个图形。这样的图可以从JSON文件加载,也可以根据需要从Python应用程序加载。有关详细信息,请参阅MIG。
例如,模拟通信子图packages/navsim/apps/navsim_封装了用于使用TCP与ISAACSimUnity3D或NVIDIAOmniverse通信的节点、组件和边。要使其对应用程序可用,请将以下Bazel数据依赖项添加到您先前创建的生成文件中:
data=["//packages/navsim/apps:navsim_tcp_subgraph",],
在Python应用程序中,可以使用以下命令加载它:
('packages/navsim/apps/navsim_')子图组件更像是由一组节点组成的配方,而不是容器。加载子图更像是按照配方创建节点和组件。在视图中,您可以看到从子图创建的所有节点。通过将它们与其他节点连接,可以使用创建更复杂的应用程序。
图4。显示各种子图使用情况的计算图。
当加载多个子图时,命名冲突MIGht会发生,因为在任何应用程序中,节点都需要具有唯一的名称。若要避免此类冲突,请使用另一个参数加载子图:
('packages/navsim/apps/navsim_','simulation',)这里,第二个参数是JSON文件中指定的所有节点的“nodenameprefix”。例如,packages/navsim/apps/navsim_文件指定一个名为interface的节点。前面的语句将创建一个名为的节点,而不是interface。
在Jetson上部署应用程序现在有了一个Python应用程序。在真正的Jetson板上运行只需要一个命令:
./engine/build/-h-p//apps/mybot:mybot-pkg-djetpack43
有关将应用程序部署到Jetson的更多信息,请参阅入门和在Jetson上部署和运行。
使用SSH连接到您的Jetson板或从GUI打开一个终端并检查文件夹/home/nvidia/deploy/bob/mybot-pkg。如果您在Jetson和开发设置上使用不同的用户名,请将nvidia替换为Jetson板上的用户名,将bob替换为开发设置上的用户名。
使用以下命令在Jetson上运行应用程序:
nvidia@Jetson:~/deploy/bob/mybot-pkg$./runapps/mybot/
如果您正在使用存储库之外的资源,请考虑将它们添加到应用程序的Bazel依赖项中,以便可以使用将它们与应用程序一起自动部署到。
如果您在PC机上使用ISAACSimUnity3D,则可以正常通信。
使用Jupyter笔记本因为这里有pythonapi,所以Jupyter笔记本肯定可以工作。将以下生成文件与空的一起使用:
isaac_jupyter_app(name="mybot",modules=["message_generators","viewers",],notebook="",)
以类似于Jetson板或X86工作站的方式部署应用程序,并使用以下命令启动Jupyter:
jupyternotebookapps/mybot/
你现在可以走了。run函数被阻塞,只有在robotic应用程序停止时才返回。要以交互方式使用robotics应用程序,请相应地使用start和stop函数。
Python在模拟移动机器人中的应用在使用模拟传感器工作的部分,有一个模拟机器人,上面安装了模拟摄像机。ISAACSimUnity3D是用来模拟移动机器人的。对于在ISAACSimUnity3D中控制带有差分基座的模拟机器人的示例robot应用程序,请检查//apps/navsim:navsim_navigate中的应用程序。组件和子图可以在JSON文件apps/navsim/navsim_中找到。有关详细信息,请参见ISAACSimUnity3D。
用Python模拟机器人手臂除了移动机器人,用Jupyter笔记本电脑进行简单的联合控制SDK也可以用于构建机器人手臂的应用程序。有了OmniverseISAAC,你可以在没有真正硬件的情况下使用模拟机械手臂。有关更多信息,请按照用Jupyter笔记本电脑进行简单的联合控制上的“UR10in用Jupyter笔记本电脑进行简单的联合控制用Jupyter笔记本电脑进行简单的联合控制Sim”会话说明操作。应用程序将在模拟中控制机械臂,如图5所示。
图5。通用机器人的UR10正在使用Jupyter笔记本电脑进行模拟控制。
以下是应用程序中发生的情况。第一件事是加载一个子图,允许通过TCP与模拟器通信。
(filename="packages/navsim/apps/navsim_",prefix="simulation")
若要为关节生成平滑运动,请为节点加载另一个子图:
流水线分拣机器人设计(filename="packages/planner/apps/multi_joint_lqr_",prefix="lqr")
该子图封装LQR规划器的节点,生成当前关节状态和目标关节位置的命令。将仿真节点与规划器的节点连接起来,以使机械臂关节状态消息和命令消息在它们之间流动:
(simulation_node["output"],"joint_state",lqr_interface,"joint_state")(lqr_interface,"joint_command",simulation_node["input"],"joint_position")
用Python编码的代码集PyCodeletJointPositionControl从滑块读取目标关节位置值,并将这些值作为CompositeProto消息发布:
蜘蛛手分拣机器人大概价格classJointPositionControl(Codelet):defstart(self):=_proto_tx("CompositeProto","command")self._widget=CompositeWidget("position",)deftick(self):_msg=self._()有关详细信息,请参见创建Python代码。
然后,JointPositionControl代码集连接到一个节点,并连接到LQRplanner的目标输入通道:
widget_node=("command_generator")joint_commander=widget_(JointPositionControl)(joint_commander,"command",lqr_interface,"joint_target")启动应用程序应用程序启动你可以随意使用手臂。
带模拟摄像机的模拟机械臂在OmniverseISAACSim中,要有一个带摄像头的机械臂,请加载stageomni:/Isaac/Samples/Isaac_SDK/Scenario/sortbot_。在OmniverseISAACSim中启动仿真和机器人引擎桥,并将视口从透视切换到腕部摄影机,如图6和7所示。
图6。ISAACSim中机器人的透视图。
与之前的应用程序一样,您可以将模拟摄影机通道连接到ColorCameraViewer代码板以可视化画面,并将DepthCameraViewer连接到可视化模拟深度传感器数据。
_module("viewers")viewers=("viewers")color_viewer=(,"ColorViewer")(simulation_node["output"],"color",color_viewer,"color_listener")depth_viewer=(,"DepthViewer")(simulation_node["output"],"depth",depth_viewer,"depth_listener")depth__visualization_depth=3图7。ISAAC模拟中机器人的手腕视图。
总结在本文中,您使用pythonapi从头创建了一个机器人应用程序。您使应用程序可以使用真实的摄影机、录制的摄影机数据和模拟摄影机。我们还向您展示了如何使用pythonapi处理模拟移动机器人和模拟机械臂。做机器人玩得开心!
YangLiu是一名软件工程师,负责开发NVIDIAISAACSDK的各个部分。他获得了达拉斯德克萨斯大学计算机科学博士学位。
审核
物流分拣机器人原理图智能分拣机器人的发展规化