7.Isaac教程--在Python中开发Codelets

news2024/11/19 11:21:17

在Python中开发Codelets

虽然就性能而言,编写小码的最佳语言是 C++,但并非应用程序的所有小码都需要使用相同的语言。 Isaac SDK 还支持 Python codelets,或 pyCodelets,适合那些更熟悉 Python 的人。 本节向您展示如何执行以下操作:

  • 以 Isaac SDK 中包含的 ping_python 为例运行 Python codelets

  • 创建 Python 小码

本节还介绍了使用 Python codelet 部署到目标系统的运行脚本,以及用于 C++ codelet 的 JSON 和 Bazel BUILD 文件与用于 Python codelet 的 JSON 和 Bazel BUILD 文件之间的差异。

文章目录

  • 在Python中开发Codelets
    • 运行 Python Codelet
    • 创建 Python Codelet
      • 创建工作区
      • 创建 Bazel 构建文件
      • 创建 Python Codelet
      • 运行脚本
    • Python Codelets 的 JSON 和 BUILD 文件

在这里插入图片描述

运行 Python Codelet

可以在 apps/tutorials/ping_python/ 目录中找到基础部分中描述的 Ping codelet 的 Python 版本。

可以通过执行以下命令在您的系统上运行此应用程序:

bob@desktop:~/isaac/sdk$ bazel run //apps/tutorials/ping_python

如果您想在 Jetson 设备上运行该应用程序,您必须按照这些说明进行操作

  1. 按照应用程序控制台选项中的说明将 //apps/tutorials/ping_python:ping_python-pkg 部署到机器人。

  2. 使用以下命令切换到 Jetson 上已部署包的目录:

    bob@desktop:~/$ cd ~/deploy/bob/ping_python-pkg
    
    Where "bob" is your username on the host system.
    
  3. 通过执行以下命令运行应用程序:

    bob@desktop:~/deploy/bob/ping_python-pkg/$ ./run apps/tutorials/ping_python/ping_python.py
    

当您通过任一方法运行小码时,“Hello World!” 每 1.5 秒打印一次消息。 修改 apps/tutorials/ping_python/ping_python.py 中的脚本并再次运行它以查看更改的效果。

注意

如果显示“ImportError: No module named capnp”错误,请确保使用在机器人上安装依赖项中提到的 install_dependencies_jetson 脚本安装了 pycapnp

下面显示了一个更完整的示例,即完整应用部分中描述的比例控制小代码的 Python 版本。 以下 Python 脚本在功能上等效于 main.cpp、ProportionalControlCpp.hpp 和 ProportionalControlCpp.cpp 的组合:

'''
Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.

NVIDIA CORPORATION and its licensors retain all intellectual property
and proprietary rights in and to this software, related documentation
and any modifications thereto. Any use, reproduction, disclosure or
distribution of this software and related documentation without an express
license agreement from NVIDIA CORPORATION is strictly prohibited.
'''

from isaac import *


# A Python codelet for proportional control
# For comparison, please see the same logic in C++ at "ProportionalControlCpp.cpp".
#
# We receive odometry information, from which we extract the x position. Then, using refence and
# gain parameters that are provided by the user, we compute and publish a linear speed command
# using `control = gain * (reference - position)`
class ProportionalControlPython(Codelet):
    def start(self):
        # This part will be run once in the beginning of the program

        # Input and output messages for the Codelet. We'll make connections in the json file.
        self.rx = self.isaac_proto_rx("Odometry2Proto", "odometry")
        self.tx = self.isaac_proto_tx("StateProto", "cmd")    # DifferentialBaseControl type

        # Print some information
        print("Please head to the Sight website at <IP>:<PORT> to see how I am doing.")
        print("<IP> is the Internet Protocol address where the app is running,")
        print("and <PORT> is set in the config file, typically to '3000'.")
        print("By default, local link is 'localhost:3000'.")

        # We can tick periodically, on every message, or blocking. See documentation for details.
        self.tick_periodically(0.01)

    def tick(self):
        # This part will be run at every tick. We are ticking periodically in this example.

        # Try to get the odometry message.
        # Nothing to do if we haven't received odometry data yet
        rx_message = self.rx.message
        if rx_message is None:
            return

        # Read parameters that can be set through Sight webpage
        reference = self.config["desired_position_meters"]
        gain = self.config["gain"]

        # Read odometry message received
        position = rx_message.proto.odomTRobot.translation.x

        # Compute the control action
        control = gain * (reference - position)

        # Show some data in Sight
        self.show("reference (m)", reference)
        self.show("position (m)", position)
        self.show("control", control)
        self.show("gain", gain)

        # Publish control command
        tx_message = self.tx.init()
        data = tx_message.proto.init('data', 2)
        data[0] = control    # linear speed
        data[1] = 0.0    # This simple example sets zero angular speed
        self.tx.publish()


def main():
    app = Application(
        "apps/tutorials/proportional_control_python/proportional_control_python.app.json")
    app.nodes["py_controller"].add(ProportionalControlPython)
    app.connect('odometry/isaac.navigation.DifferentialBaseOdometry', 'odometry',
                'py_controller/PyCodelet', 'odometry')
    app.connect('py_controller/PyCodelet', 'cmd', 'commander.subgraph/interface',
                'control')
    app.run()


if __name__ == '__main__':
    main()

Python 中的 import 语句类似于 C++ 中的预处理器 #include 语句。 与 ProportionalControlCpp.cpp 一样,codelet 在 start 和 tick 函数中定义。 使用 Isaac 参数 desired_position_meters 和 gain,其值要么在 JSON 文件中配置,要么在运行时通过 Sight 设置。

在每次滴答时,如果收到里程计消息,则会为机器人计算并发布适当的命令。 一些重要数据显示在 Sight 中。

main 函数只是在运行应用程序之前加载图形和配置文件,就像 main.cpp 在 C++ codelet 中所做的那样。 此外,Python 主函数还为 PyCodelet 创建edges。

创建 Python Codelet

创建 Python codelet 时,请遵循类似于以下的过程。

创建工作区

apps/tutorials/proportional_control_python/ 或另一个现有的基于 Python 的小代码复制到 apps/<your_app_name> 作为模板或起点。

如果您在本教程中使用未经修改的比例控制小代码,则需要 Carter 机器人或等效物。 有关详细信息,请参阅 NVIDIA Carter。

重命名文件以反映您的小代码的名称,而不是您复制的小代码。

创建 Bazel 构建文件

  1. 在与用作起点的其他文件一起复制的 apps/<your_app_name>/BUILD 中,将所有 proportional_control_python 字符串替换为 <your_app_name>

  2. 根据您使用的 C++ codelets 修改 py_binary 规则中的数据属性。

    例如,如果您要省略或删除 apps/tutorials/proportional_control_python/BUILD 中的 //packages/segway,并运行 codelet,则会显示错误 Component with typename 'isaac::SegwayRmpDriver' not registered,因为 Proportional Control codelet (proportional_control_python.graph.json) 使用基于 C++ 的segway codelet。

  3. 由于我们的应用程序位于 apps 而不是 apps/tutorials 中,因此删除 //apps/tutorials:py_init 的规范,保留 //apps:py_init

    如果不是将应用程序向上移动到 apps,而是将其移动到 apps/tutorials/tutorials_subapps/tutorials/tutorials_sub 中的 BUILD 文件必须在所有三个目录中指定 py_init,//apps:py_init, //apps/tutorials:py_init //apps/tutorials/tutorials_sub:py_init。 每个目录还需要一份 __init__.py

创建 Python Codelet

  1. 在您的 <your_app_name>.py 中,将 import apps.tutorials.proportional_control_python 替换为 import apps.<your_app_name>

  2. 根据需要重命名和修改 ProportionalControlPython 类。 您可以在此文件中定义多个 Python codelet。

  3. 在主函数中,将所有 proportional_control_python 字符串替换为 <your_app_name>。 您必须使用类名注册所有 pyCodelet,例如我们用作起点的文件中的 ProportionalControlPython。 修改节点名称,在本例中为 py_controller,以匹配您在 graph.json 文件中选择的名称。

    您的主要功能将类似于以下内容:

    def main():
    app = Application(app_filename = "my_new_app.app.json")
    app.register({"my_py_node1": PyCodeletType1, "my_py_node2a": PyCodeletType2, "my_py_node2b": PyCodeletType2})
    app.run()
    
  4. 根据您的小码,在 apps/<your_app_name>/<your_app_name>.app.json 的图形部分添加或删除节点、组件或边。

  5. 根据需要在 apps/<your_app_name>/<your_app_name>.app.json 的配置部分配置节点和组件。 确保用新小代码的名称替换小代码名称的所有实例。

如运行 Python Codelet 中所述,在本地运行 codelet 或在 Jetson 系统上部署和运行它。

运行脚本

与包含一个或多个 Python codelet 的 Isaac 应用程序的部署(使用 deploy.sh)一起提供的运行脚本执行以下功能:

  1. 检查 Python 脚本的文件名是否以“.py”结尾

  2. 验证每个目录都有一个 init.py 文件

  3. 使用以下命令运行应用程序。

PYTHONPATH=$PWD:$PWD/packages/pyalice:$PWD/packages/ml python

当我们使用以下命令时,这些功能由运行脚本执行:

./run apps/tutorials/proportional_control_python/proportional_control_python.py

Python Codelets 的 JSON 和 BUILD 文件

Python codelet 的 JSON 文件与 C++ codelet 的 JSON 文件非常相似,只是 Python codelet 的组件类型始终是 isaac::alice::PyCodelet

Bazel BUILD 文件有些不同,如下例所示:

load("@com_nvidia_isaac_sdk//bzl:module.bzl", "isaac_pkg")

py_binary(
    name = "proportional_control_python",
    srcs = [
        "__init__.py",
        "proportional_control_python.py",
    ],
    data = [
        "proportional_control_python.config.json",
        "proportional_control_python.graph.json",
        "//apps:py_init",
        "//apps/tutorials:py_init",
        "//packages/navigation:libnavigation_module.so",
        "//packages/segway:libsegway_module.so",
        "//packages/sensors:libjoystick_module.so",
    ],
    deps = ["//packages/pyalice"],
)

isaac_pkg(
    name = "proportional_control_python-pkg",
    srcs = ["proportional_control_python"],
)

通过在 py_binary 规则的数据中指定相应的模块,可以使用 C++ codelets。 例如,//packages/segway:libsegway_module.so 是使用 isaac::SegwayRmpDriver 类型的 C++ Codelet 所必需的。 忽略或忘记此依赖项会导致在应用程序运行时显示错误 Component with typename ‘isaac::SegwayRmpDriver’ not registered

isaac_pkg 规则负责打包所有文件并创建一个存档,该存档可以使用部署脚本传输到目标设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化系列讲解:SVG绘制基本图形及如何复用

文章目录一、SVG坐标系二、SVG坐标系单位三、SVG绘制基本图形3.1 矩形3.2 圆形3.3 椭圆3.4 直线3.5 折线3.6 多边型3.7 路径3.8 文字3.9 图片四、SVG元素的组合五、图形元素定义复用和使用定义的复用5.1 defs与use5.2 symbol与use一、SVG坐标系 SVG 使用的坐标系统&#xff08;…

【Python】函数——传递任意数量的实参

传递任意数量的实参和传递任意数量的关键字实参 *args&#xff1a;表示用来接收任意数量的实参&#xff0c;其中&#xff0c;形参*args的星号会让Python创建一个名为args的空元组&#xff0c;并将接收到的任意数量的实参存储在这个元组中。**kwargs&#xff1a;表示用来接收任…

ARX给CAD发送命令的几种方法

本文迁移自本人网易博客&#xff0c;写于2015年11月16日。1、ads_queueexpr( _T("(command\"_POINT\" \"1,1,0\")") );该函数CAD未公开&#xff0c;使用时提前声明下就可以了。可以参考帮助文件中&#xff1a;Tips and Techniques 。2、acDocMan…

嵌入式:人机交互接口设计详解

文章目录键盘和LED的接口原理HD7279A与S3C2410A的连接原理图键盘和LED控制的编程实例LCD显示原理LCD控制器概述嵌入式处理器与LCD的连接S3C2410A的LCD控制器&#xff08;1&#xff09;STN LCD&#xff08;2&#xff09;TFT LCDLCD控制器的框图LCD接口信号STN LCD控制器操作&…

Java IO流 - 转换流的使用详细介绍

文章目录转换流字符输入转换流字符输出转换流转换流 之前我们代码编码和文件编码都是UTF-8, 所以没有出现中文乱码的问题 我们知道代码编码和文件编码的格式如果不一致的话会出现中文乱码的问题 那么如果在开发中, 我们确实会遇到编码不一致的情况如何解决呢? 我们可以使用字符…

【高阶数据结构】手撕红黑树(超详细版本)

&#x1f308;欢迎来到数据结构专栏~~手撕红黑树 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

JMS规范和AMQP协议

参考资料&#xff1a;《JMS与AMQP简述以及比较》《AMQP协议详解》《MQ消息队列的JMS规范和AMQP协议的区别》《消息队列之JMS和AMQP对比》写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。一般情况下MQ的…

【数据结构与算法——C语言版】6. 排序算法(3)——插入排序

前言 在本系列的上两篇文章分别介绍了两种O(n2)的排序算法——选择排序和冒泡排序&#xff0c;今天是第三种O(n2)的排序算法&#xff1a;插入排序。 插入排序 核心思想 它的基本思想是将一个记录插入到已经排好序的有序表中&#xff0c;从而产生一个新的、记录数增 1 的有序…

软件测试~自动化测试Seleniums---1

一.什么是自动化测试 1.自动化测试介绍 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 将测试人员双手解放&#xff0c;将部分测…

机器视觉(十):印刷体字符识别

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

Unreal模块创建流程

可以把开发中通用的功能封装成模块,以在不同项目之间复用,这里记录一下创建模块的步骤:在工程的Source文件夹中新建文件夹,命名为模块名称TestCustomModule:如果要区分模块内脚本的公私有权限,则在模块文件夹内创建Public和Private文件夹,这里我没有区分,就不创建了:在模块文件…

Js如何实现一个累加向上漂浮动画

前言 在不久之前,看到一个比较有意思的小程序,就是静神木鱼,可以实现在线敲木鱼,自动敲木鱼,手盘佛珠,静心颂钵的 整个小程序功能比较小巧,大道至简,曾风靡过一阵的,无论在App应用市场上,还是小程序里,一些开发者都赚得盆满钵满,用于缓解当代年轻人的一个焦虑,佛系解压,算是一…

Kubernetes:通过轻量化工具 kubespy 实时观察YAML资源变更

写在前面 分享一个小工具 kubespy 给小伙伴博文内容涉及&#xff1a; 工具的简单介绍下载安装以 kubectl 插件方式使用 Demo 理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0c;為何竟如此艱難呢 ------赫尔曼黑塞《德米安》 简单介…

详解二分查找的两种写法以及二分查找的六种变形

目录 一、二分查找的两种写法 1.1 - 第一种写法&#xff08;左闭右闭&#xff09; 1.2 - 第二种写法&#xff08;左闭右开&#xff09; 二、二分查找的六种变形 2.1 - 查找第一个 target 的元素位置 2.2 - 查找第一个 > target 的元素位置 2.3 - 查找第一个 > ta…

JS类型转换机制

概述 JS中有六种简单数据类型&#xff1a;undefined、null、boolean、string、number、symbol&#xff0c;以及引用类型&#xff1a;object 但是我们在声明的时候只有一种数据类型&#xff0c;只有到运行期间才会确定当前类型let x y ? 1 : a; &#xff0c;x的值在编译阶段…

FPGA基础之内置逻辑门

verilog语言中&#xff0c;针对逻辑门&#xff0c;有许多内置可直接使用的逻辑门&#xff0c;从输入输出数量可分为多输入门和多输出门。 一、多输入门 有单个或多个输入&#xff0c;只有单个输出的逻辑门&#xff0c;包含and(与)&#xff0c;or(或)&#xff0c;xor(异或)&am…

在训练心脏数据集时碰到的问题汇总

在训练心脏数据集时碰到的问题汇总&#xff1a; 1.nii数据处理问题 心脏CT数据集采用的是医学图像常用的压缩文件格式nii&#xff0c;且储存的图像为3D图像&#xff0c;不能直接使用。 首先应导入SimpleITK包&#xff0c;利用如下三个函数进行nii格式文件的提取。 sitk.ReadI…

vlan间的通信

vlan之间要通过三层通信实现互访&#xff0c;三层通信需借助三层设备 如果之前配置了 hybrid模式想删除 命令 undo port link-type hybrid vlan all [Huawei-GigabitEthernet0/0/3]dis this interface GigabitEthernet0/0/3 undo port hybrid vlan 1 这里可以理解为多删了一个…

【python】【数据分析】2022年全国大学生数据分析大赛题解-医药电商销售数据分析

文章目录一、前言二、题目三、题解1&#xff0e;对店铺进行分析&#xff0c;一共包含多少家店铺&#xff0c;各店铺的销售额占比如何&#xff1f;给出销售额占比最高的店铺&#xff0c;并分析该店铺的销售情况。2.对所有药品进行分析&#xff0c;一共包含多少个药品&#xff0c…

Promise和async/await

1、回调地狱 多层回调函数的相互嵌套&#xff0c;就形成了回调地狱。示例代码如下&#xff1a; 回调地狱的缺点&#xff1a; 代码耦合性太强&#xff0c;牵一发而动全身&#xff0c;难以维护大量冗余的代码相互嵌套&#xff0c;代码的可读性变差 1.1、如何解决回调地狱的问题…