Isaac SDK入门教程-利用Python开发Codelets
Isaac SDK入门教程-利用Python开发Codelets
说明:
- 介绍虽然在性能方面,编写codelet的最佳语言是C ++,但并非所有应用程序的codelet都需要使用相同的语言。
- 对于那些更熟悉Python的人来说,Isaac SDK还支持Python codelets或pyCodelets。
- 操作步骤
- 使用Isaac SDK中包含的ping_python作为示例运行Python codelet
- 创建Python codelet
- 运行Python Codelet
- 可以在apps/tutorials/ping_python/目录中找到Basics部分中描述的Ping codelet的Python版本。
- 可以通过执行以下命令在您的系统上运行此应用程序:
bob@desktop:~/isaac$ bazel run //apps/tutorials/ping_python
- 如果要在Jetson设备上运行应用程序,则必须遵循这些说明
2.1. 使用以下命令将ping_python-pkg部署到目标计算机:
bob@desktop:~/isaac$ ./engine/build/deploy.sh -p //apps/tutorials/ping_python:ping_python-pkg -h <target_ip> -d <device_type>
- 有关部署的更多详细信息,请参阅“在Jetson上部署和运行”部分。
2.2.使用以下命令切换到Jetson上已部署包的目录:
bob@desktop:~/$ cd ~/deploy/bob/ping_python-pkg
- 其中“bob”是您在主机系统上的用户名。
2.3.如果尚未安装pycapnp,请使用以下命令安装它:
bob@desktop:~/deploy/bob/ping_python-pkg/$ sudo apt install python-pip
bob@desktop:~/deploy/bob/ping_python-pkg/$ python -m pip install pycapnp --user
2.4.这可能需要大约五分钟才能完成,但一旦安装了pycapnp,就不需要再次安装。
- 如果省略此步骤或忘记错误“ImportError:No module named capnp”,则显示错误。
- 执行以下命令运行应用程序:
bob@desktop:~/deploy/bob/ping_python-pkg/$ ./run apps/tutorials/ping_python/ping_python.py
当您运行codelet时,通过任一方法,每1.5秒打印一次“Hello World!”消息。
修改 apps/tutorials/ping_python/ping_python.py 上的脚本并再次运行以查看更改的效果。
更完整的示例,完整应用程序部分中描述的比例控制小码的Python版本如下所示。
以下Python脚本在功能上等同于main.cpp,ProportionalControlCpp.hpp和ProportionalControlCpp.cpp的组合:
from __future__ import absolute_import, division, print_function
from engine.pyalice import *
import apps.tutorials.proportional_control_python
# 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")
# Parameters. We'll be able to modify them through Sight website.
self.set_isaac_param("desired_position_meters", 1.0)
self.set_isaac_param("gain", 1.0)
# 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.
# Nothing to do if we haven't received odometry data yet
if not self.rx.available():
return
# Read parameters that can be set through Sight webpage
reference = self.get_isaac_param("desired_position_meters")
gain = self.get_isaac_param("gain")
# Read odometry message received
position = self.rx.get_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_proto()
data = tx_message.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("proportional_control_python", ["navigation", "segway", "sensors:joystick"])
app.load_graph(
"apps/tutorials/proportional_control_python/proportional_control_python.graph.json")
app.load_config(
"apps/tutorials/proportional_control_python/proportional_control_python.config.json")
app.register({"py_controller": ProportionalControlPython})
app.start_wait_stop()
if __name__ == '__main__':
main()
- Python中的Import语句类似于C++中的预处理器#include语句。
- 与ProportionalControlCpp.cpp类似,codelet在start和tick函数中定义。
- 使用Isaac参数desired_position_meters和gain,其值在JSON文件中配置或在运行时通过Sight设置。
- 在每个刻度线处,如果收到odometry消息,则为机器人计算并发布适当的命令。
- 一些重要数据显示在Sight中。
- main函数在运行应用程序之前简单地加载图形和配置文件,main.cpp在C ++ codelet中的作用方式。
- 创建Python Codelets
- 在创建Python codelet时,请执行与以下类似的过程。
3.1.创建工作区
将apps/tutorials/proportional_control_python/
或其他现有的基于Python的codelet复制到apps/<your_app_name>作为模板或起点。
如果您在本教程中使用未经修改的比例控制codelet,则需要Carter机器人或同等产品。
有关更多信息,请参阅NVIDIA Carter。
重命名文件以反映您的codelet的名称,而不是您复制的codelet。
3.2.创建Bazel BUILD文件
在apps/<your_app_name>/BUILD中复制并使用其他文件作为起点
将所有proportional_control_python字符串替换为<your_app_name>。
根据您使用的C ++ codelet修改py_binary规则中的data属性。
例如,如果要在apps/tutorials/proportional_control_python/BUILD中省略或删除//packages/segway并运行codelet,则会显示未注册typename“isaac :: SegwayRmpDriver”的错误Component,因为比例控制 codelet(proportional_control_python.graph.json)使用基于C ++的segway codelet。
由于我们的应用程序位于apps而非apps/tutorials中,请删除//apps/tutorials:py_init,保留//apps:py_init。
如果不是将应用程序移动到 apps,而是将其移动到apps/tutorials/tutorials_sub,则 apps/tutorials/tutorials_sub中的BUILD文件必须在所有三个目录中指定py_init,//apps:py_init, //apps/tutorials:py_init, and //apps/tutorials/tutorials_sub:py_init。 每个目录还需要init.py的副本。
3.3.创建Python Codelet
- 在<your_app_name> .py中,将import apps.tutorials.proportional_control_python替换为导入应用程序。
- 根据需要重命名和修改ProportionalControlPython类。 您可以在此文件中定义多个Python codelet。
- 在main函数中,将所有proportional_control_python字符串替换为<your_app_name>。
- 您必须使用它们的类名注册所有pyCodelet,例如我们用作起点的文件中的ProportionalControlPython。
- 修改节点名称,在本例中为py_controller,以匹配您在graph.json文件中选择的名称。
- 您的主要功能类似于以下内容:
def main():
app = Application("my_new_app")
app.load_graph("apps/my_new_app/my_new_app.graph.json")
app.load_config("apps/my_new_app/my_new_app.config.json")
app.register({"my_py_node1": PyCodeletType1, "my_py_node2a": PyCodeletType2, "my_py_node2b": PyCodeletType2})
app.start_wait_stop()
- 根据您的codelet,在apps/<your_app_name>/<your_app_name>.graph.json中添加或删除边缘的节点,组件。
- 根据需要在apps/<your_app_name>/<your_app_name>.config.json中配置节点和组件。
- 确保将codelet名称的所有实例替换为新codelet的名称。
- 在本地运行codelet或在Jetson系统上部署和运行它,如运行Python Codelet中所述。
3.4. 运行脚本
- 与包含Python codelet或codelet的Isaac应用程序的部署(使用deploy.sh)一起提供的运行脚本执行以下功能:
- 检查Python脚本的文件名是否以“.py”结尾
- 验证每个目录是否都有init.py文件
- 使用以下命令运行应用程序。
PYTHONPATH=$PWD:$PWD/engine python
- 当我们使用以下命令时,这些函数由运行脚本执行:
./run apps/tutorials/proportional_control_python/proportional_control_python.py
3.5. JSON 和BUILD 文件
Python codelet的JSON文件与C++ codelet的JSON文件非常相似
只不过Python codelets的组件类型总是 isaac::alice::PyCodelet。
Bazel BUILD文件有些不同,如以下示例所示:
load("//engine/build:isaac.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",
"//messages:core_messages",
"//packages/navigation:libnavigation_module.so",
"//packages/segway:libsegway_module.so",
"//packages/sensors:libjoystick_module.so",
],
deps = ["//engine/pyalice"],
)
isaac_pkg(
name = "proportional_control_python-pkg",
srcs = ["proportional_control_python"],
)
- 通过在py_binary规则中指定数据中的相应模块,可以使用C ++ codelet。
- 例如,//packages/segway:libsegway_module.so需要使用类型为isaac::SegwayRmpDriver的C++ Codelet。
- 省略或遗忘此依赖项会导致在运行应用程序时显示未注册的类型名为“isaac::SegwayRmpDriver”的错误组件。
- isaac_pkg规则负责打包所有文件并创建可以使用部署脚本传输到目标设备的存档。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号