Isaac Sim教程06 OmniGraph图编程

Isaac Sim OmniGraph图编程

版权信息

Copyright 2023 Herman Ye@Auromix. All rights reserved.This course and all of its associated content, including but not limited to text, 
images, videos, and any other materials, are protected by copyright law. 
The author holds all rights to this course and its contents.Any unauthorized use, reproduction, distribution, or modification of this course 
or its contents is strictly prohibited and may result in legal action. 
This includes, but is not limited to:
Copying or distributing course materials without express written permission.
Reposting, sharing, or distributing course content on any platform without proper attribution and permission.
Creating derivative works based on this course without permission.
Permissions and InquiriesIf you wish to use or reproduce any part of this course for purposes other than personal learning, 
please contact the author to request permission.The course content is provided for educational purposes, and the author makes no warranties or representations 
regarding the accuracy, completeness, or suitability of the course content for any specific purpose. 
The author shall not be held liable for any damages, losses, 
or other consequences resulting from the use or misuse of this course.Please be aware that this course may contain materials or images obtained from third-party sources. 
The author and course creator diligently endeavor to ensure that these materials 
are used in full compliance with copyright and fair use regulations. 
If you have concerns about any specific content in this regard, 
please contact the author for clarification or resolution.By enrolling in this course, you agree to abide by the terms and conditions outlined in this copyright notice.

学习目标

  • 熟悉OmniGraph图编程的概念
  • 熟悉OmniGraph图编程的基本操作
  • 熟悉OmniGraph图编程的机器人控制

难度级别

初级中级高级

预计耗时

30 mins

学习前提

对象类型状态
Ubuntu22.04操作系统软件已确认
Isaac Sim软件已配置
Isaac Sim基本概念知识已了解
Isaac Sim基本使用知识已了解
Isaac Sim高级使用知识已了解

OmniGraph 简介

OmniGraph 是 Omniverse 中的一种可视化脚本语言,为世界赋予了生动的行为和互动。
它能够处理多种计算任务,涵盖了各种事件,OmniGraph 将多种不同类型的图系统集成在单一框架下。

如果希望深入了解OmniGraph,可以参考OmniGraph官方文档

创建 ActionGraph

ActionGraph是OmniGraph的一种,用于事件驱动的行为,此处仅涉及ActionGraph,不讨论其他的Graph。

  1. 从编辑器顶部的下拉菜单中选择Window -> Visual Scripting -> Action Graph
  2. 图形编辑器将显示在与内容浏览器相同的窗格中。在这里插入图片描述

浏览OmniGraph

区分图

为了避免在包含多个相同组件的Graph中发生混淆的连线错误,我们可以在Stage中为不同的节点命名,并在View中的Node Header里,选择“Use Prim Name”来区分它们。

在这里插入图片描述

缩放图

通过点击不同的缩略图情况,可以调整图的展现程度,以便更详细地查看图中的各个部分。

在这里插入图片描述

案例1:物体跟随

通过绘制ActionGraph,使得圆锥体立方体的上方,并能够跟随立方体的移动。

创建物体

首先,按照之前教程中简单的Prim创建方法,创建一个立方体 Cube圆锥体 Cone

将立方体从“舞台”面板拖放到“动作图表”面板:
在这里插入图片描述

读取立方体属性

在弹出的对话框中,选择Read Attribute,这将创建一个读取 Prim 属性节点,该节点可以从您拖入的 prim 中读取信息。
在这里插入图片描述
设置属性的名称为xfromOp:translate,这意味着它读取的参数值是立方体的位置值。
在这里插入图片描述

写圆锥属性

同理,将圆锥体拖入Action Graph中,设置为Write Attribute并将属性的名称为xfromOp:translate

添加加和运算

在Action Graph的搜索栏中搜索Add,引入基本的数学运算Add

添加常量

在Action Graph的搜索栏中搜索Point3d,引入一个类型为Point3d的常量,并在常量的属性中将其值设置为[0,0,1],代表在Z轴方向上的值为1米,x轴y轴的值为0。

在这里插入图片描述

逻辑连线

Constant Point3dValue连接到A,将从立方体读出的位置参数值Value连接到AddB,并将AddSum连接到圆锥属性的写节点的Value,此时圆锥将要写入的位置是立方体的位置与Constant Point3d位置的加和。

在这里插入图片描述

设置定期触发

On Tick: Executes an output execution pulse at a regular multiple of the refresh rate.

On Tick基于屏幕刷新率的,表示在刷新率的某个倍数时执行一次输出。这与硬件刷新和显示有关,详细可参考Omniverse: On Tick。

最后,在Action Graph的搜索栏中搜索On Tick,设置在仿真中定期触发的动作或事件,在每次屏幕刷新时触发一次写圆锥位置的行为。

测试

按下Play,并拖动立方体,查看圆锥跟随立方体的效果。

在这里插入图片描述

案例2:机器人控制

添加机器人

通过在GUI底部的地址栏中打开omniverse://localhost/Library/NVIDIA/Assets/Isaac/2023.1.0/Isaac/Robots/Jetbot/文件夹,导入Jetbot机器人。你只需将其拖动到舞台上即可完成导入。

添加环境

按照之前的教程,配置机器人所需的整体物理环境。
在这里插入图片描述

添加Articulation Controller 和 Differential Controller

  1. 单击“New Action Graph”以打开一个空白图表。

  2. 在图形编辑器的搜索栏中输入controller,找到Articulation ControllerDifferential Controller

    • Articulation Controller 用于控制关节树型机器人的关节。这包括连接机器人不同部分的关节,允许以特定的方式移动和旋转。通过将驱动程序命令(以力、位置或速度的形式)应用于具有关节根的机器人的指定关节,实现对机器人关节的精准控制。

    • Differential Controller 负责轮式机器人的差分驱动。在给定目标线速度和角速度的情况下,计算两轮机器人的驱动命令。这种控制方式允许通过独立控制两个驱动轮的速度来实现机器人的转弯和移动。

在这里插入图片描述

  1. Articulation ControllerDifferential Controller拖动到图形上。
    在这里插入图片描述

指定需要控制的机器人

要告诉控制器要控制哪个机器人,请首先选择图形中的Articulation Controller节点并打开属性窗格。
在这里插入图片描述

有两种方式:

  1. 方式一: 选中usePath并在robotPath中输入机器人/World/jetbot的路径。
  2. 方式二: 不使用路径输入,取消选中usePath,然后单击Add Targets,在弹出窗口中选择jetbot

在这里插入图片描述

设置需要控制的关节的检查

Articulation Controller还需要知道要连接哪些关节。它期望以标记或索引值列表的形式提供此信息。机器人的每个关节都有一个名称,而jetbot恰好有两个,即left_wheel_jointright_wheel_joint。通过检查阶段上下文树中的jetbot来验证这一点。在/World/jetbot/chassis内有两个旋转物理关节,名为left_wheel_jointright_wheel_joint

配置Differential Controller

Articulation Controller一样,Differential Controller也需要配置。选择图表中的Differential Controller节点,然后在属性窗格中,将wheelDistance设置为0.1125,将wheelRadius设置为0.03,将maxAngularSpeed设置为1,这设置了差分驱动所需要的一些基本参数。
在这里插入图片描述

添加关节名称的token常量

Constant token: Holds a token value, which is a 64-bit value representing an interned string

使用Constant Token节点来保存一个token值,这里指的是prim jetbot/chassis/left_wheel_jointjetbot/chassis/right_wheel_joint两个字符串,因为Isaac Sim没有Constant String类型,目的是为了将其作为关节名称的标识。

在图形编辑器的搜索栏中输入token并向图形添加两个Constant Token节点。
在这里插入图片描述

选择一个,然后在属性窗格中将其值设置为left_wheel_joint。对另一个常量标记节点重复此操作,但将值设置为right_wheel_joint
在这里插入图片描述

token添加到数组

在图形编辑器的搜索栏中输入make array并向图形添加Make Array节点。
在这里插入图片描述

选择Make Array节点,然后单击属性窗格菜单的inputs部分中的+图标以添加第二个输入。将arraySize设置为2
在这里插入图片描述

然后从同一窗格的下拉菜单中将输入类型设置为token[]
在这里插入图片描述

将关节传递给关节树控制器

最后,将Constant Token节点连接到Make Array节点的AB,然后将该节点的输出连接到Articulation Controller节点的Joint Names输入。
在这里插入图片描述
随后添加的节点事件节点。在图形编辑器的搜索栏中搜索playback并将On Playback Tick节点添加到图形中。该节点将为每一帧发出一个执行事件,但仅在仿真播放时发出。

On Playback Tick: Executes an output execution pulse during playback

区别于On TickOn Playback Tick的触发条件是在Play过程中的每个“tick”(时刻)执行一次输出。它与播放或仿真的时间轴相关。每个“tick”可能代表仿真中的一次步进,详细可参考Omniverse: On Playback Tick。

On Playback Tick节点的Tick输出连接到两个控制器节点的Exec In输入。
在这里插入图片描述

将差分控制器的指定速度传递给关节树控制器

Differential ControllerVelocity Command输出连接到关节控制器的Velocity Command输入。完成后,图表应如下图:
在这里插入图片描述

测试

最终按播放按钮并选择图表中的Differential Controller节点。单击并拖动Differential Controller属性窗格中的角速度或线速度值以更改其值(或者只需单击并输入所需的值),可以发现小车在转动。
在这里插入图片描述

案例3: 键盘控制机器人移动练习

绘制一个通过键盘I K J L键位控制Jetbot机器人移动的OmniGraph作为练习
相关值:差分控制器的最大角速度为5 最大线速度为5Constant DoubleValue5
在这里插入图片描述
在这里插入图片描述

键盘状态读取

在Action Graph的搜索栏中搜索keyboard,选中Read Keyboard State,并设置它读取对应的键位,详细可参考OmniGraph: Read Keyboard State
在这里插入图片描述

数值转化

在Action Graph的搜索栏中搜索to double,能够将其他类型的值转化为double类型的值
例如,将键盘按下的bool状态值转化为为double类型的值
在这里插入图片描述

常量设置

在Action Graph的搜索栏中搜索const double,选中Constant Double来作为设置速度大小的常数
在这里插入图片描述

数学运算

在Action Graph的搜索栏中搜索multiply math,选中Multiply来将两同类型的变量相乘
通过将键盘按下的bool值乘以正负方向的速度系数来获得在该方向的速度
在这里插入图片描述
在Action Graph的搜索栏中搜索sub math,选中Subtract来进行减法运算
通过将某一方向的值减去相反方向的值,即可获得在该方向上真实的值
在这里插入图片描述

完整图

在这里插入图片描述
如果希望获得简单键盘控制的启发,可以参考Isaac Examples->Input Devices -> Omnigraph Keyboard

在这里插入图片描述

局部图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

案例4: 图编程的Python接口

虽然图编程的理念就是不希望使用复杂的代码,但它确实有代码,通过代码中的简单编辑,可以融合图编程和代码编程的一部分特性,以下代码不可运行,仅供参考。

# Copyright (c) 2022-2023, 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.
#import numpy as np
import omni.ext
import omni.graph.core as og
from omni.isaac.core.objects import VisualCuboid
from omni.isaac.core.utils.viewports import set_camera_view
from omni.isaac.examples.base_sample import BaseSampleclass OmnigraphKeyboard(BaseSample):def __init__(self) -> None:super().__init__()self._gamepad_gains = (40.0, 40.0, 2.0)self._gamepad_deadzone = 0.15def setup_scene(self):world = self.get_world()world.scene.add(VisualCuboid(prim_path="/Cube",  # The prim path of the cube in the USD stagename="cube",  # The unique name used to retrieve the object from the scene later onposition=np.array([0, 0, 1.0]),  # Using the current stage units which is cms by default.size=1.0,  # most arguments accept mainly numpy arrays.color=np.array([0, 1.0, 1.0]),  # RGB channels, going from 0-1))world.scene.add_default_ground_plane()set_camera_view(eye=np.array([5, 5, 3]), target=np.array([0, 0, 0]))# setup graphkeys = og.Controller.Keysog.Controller.edit({"graph_path": "/controller_graph", "evaluator_name": "execution"},{keys.CREATE_NODES: [("OnTick", "omni.graph.action.OnTick"),("A", "omni.graph.nodes.ReadKeyboardState"),("D", "omni.graph.nodes.ReadKeyboardState"),("ToDouble1", "omni.graph.nodes.ToDouble"),("ToDouble2", "omni.graph.nodes.ToDouble"),("Negate", "omni.graph.nodes.Multiply"),("DeltaAdd", "omni.graph.nodes.Add"),("SizeAdd", "omni.graph.nodes.Add"),("NegOne", "omni.graph.nodes.ConstantInt"),("ScaleDown", "omni.graph.nodes.Multiply"),("ScaleFactor", "omni.graph.nodes.ConstantDouble"),("CubeWrite", "omni.graph.nodes.WritePrimAttribute"),  # write prim property translate("CubeRead", "omni.graph.nodes.ReadPrimAttribute"),],keys.SET_VALUES: [("A.inputs:key", "A"),("D.inputs:key", "D"),("OnTick.inputs:onlyPlayback", True),  # only tick when simulator is playing("NegOne.inputs:value", -1),("ScaleFactor.inputs:value", 0.1),("CubeWrite.inputs:name", "size"),("CubeWrite.inputs:primPath", "/Cube"),("CubeWrite.inputs:usePath", True),("CubeRead.inputs:name", "size"),("CubeRead.inputs:primPath", "/Cube"),("CubeRead.inputs:usePath", True),],keys.CONNECT: [("OnTick.outputs:tick", "CubeWrite.inputs:execIn"),("A.outputs:isPressed", "ToDouble1.inputs:value"),("D.outputs:isPressed", "ToDouble2.inputs:value"),("ToDouble2.outputs:converted", "Negate.inputs:a"),("NegOne.inputs:value", "Negate.inputs:b"),("ToDouble1.outputs:converted", "DeltaAdd.inputs:a"),("Negate.outputs:product", "DeltaAdd.inputs:b"),("DeltaAdd.outputs:sum", "ScaleDown.inputs:a"),("CubeRead.outputs:value", "SizeAdd.inputs:b"),("SizeAdd.outputs:sum", "CubeWrite.inputs:value"),("ScaleFactor.inputs:value", "ScaleDown.inputs:b"),("ScaleDown.outputs:product", "SizeAdd.inputs:a"),],},)def world_cleanup(self):pass

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

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

相关文章

Spring容器启动过程中的自定义操作插口汇总

目录标题 PostConstruct注解EventListener方式InitializingBean的afterPropertiesSet方法实现ApplicationRunner接口重写run方法实现AplicationContextAware接口重写setApplicationContext实现ServletContextListener接口contextInitialized方法实现ServletContextAware接口set…

7个简单技巧,让你从容应对压力面试!

01-什么是压力面试? 压力面试是指有意制造紧张,以了解求职者将如何面对工作压力的一种面试形式。 事实上,压力面试不是单独存在的一类面试,往往是穿插在面试过程中。 面试人通过提出不礼貌、冒犯的问题,或者用怀疑、…

【1day】蓝凌OA 系统custom.jsp 接口远程命令执行漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞概述 二、影响版本 三、资产测绘 四、漏洞复现

梦回吹角连营(2)(快速幂快乘)

Description 给定f(n)(a1)*n^a(a2)*n^(a1)...b*n^(b-1) 求f(n)%10000000033 Input 输入一个正整数T(T<10),表示有T组数据&#xff0c;每组数据包括三个整数a,b,n (0<n<10^9,1<a < b-1<10^20) Output 输出 f(n)%10000000033 的结果 Sample Input 1 1 2…

【1day】蓝凌OA 系统datajson.js接口远程命令执行漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞概述 二、影响版本 三、资产测绘 四、漏洞复现

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南 第一章&#xff1a;什么是提示工程&#xff1f; 提示工程是创建提示或询问或给出指令的过程&#xff0c;这些指令指导像ChatGPT这样的语言模型的输出。 它允许用户控制模型的输出并生成适合他们特定需求的文…

十三、FreeRTOS之FreeRTOS时间管理

本节主要介绍以下内容&#xff1a; 1&#xff0c;延时函数介绍&#xff08;了解&#xff09; 2&#xff0c;延时函数解析&#xff08;熟悉&#xff09; 3&#xff0c;延时函数演示实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌握&#xff09; 一、…

最新测试开发招聘信息汇总,内含社招和实习生岗位~

1 科大讯飞 [武汉/合肥/西安] 科大讯飞&#xff08;教育事业部&#xff09; - 移动、服务端高级测试开发工程师 一、移动方向高级测试开发工程师 岗位职责&#xff1a; 1.负责教育 BG 中 APP/SDK/软硬一体等产品类型的专项测试工作&#xff0c;包括专项测试方案设计、自动化测…

通过时间交织技术扩展ADC采样速率的简要原理

前言 数据采集是将自然界中存在的模拟信号通过模数转换器&#xff08;ADC&#xff09;转换成数字信号&#xff0c;再对该数字信号进行相应的接收和处理。数据采集系统作为数据采集的手段&#xff0c;在移动通信、图向采集、无线电等领域有重要作用。随着电子信息技术的飞速发展…

【计算机系统基石与Linux进程管理深度解析】

​​​​​​​ 【本节重点】 认识冯诺依曼系统 操作系统概念与定位 深入理解进程概念&#xff0c;了解PCB 学习进程状态&#xff0c;学会创建进程&#xff0c;掌握僵尸进程和孤儿进程&#xff0c;及其形成原因和危害 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如…

IO / day03 作业

1. 使用文件IO完成对图像的读写操作 代码 #include<myhead.h>int main(int argc, const char *argv[]) {int fd-1;if((fd open("./bird.bmp", O_RDWR)) -1){perror("fopen error");return -1;}//读取该图片的大小&#xff0c;需要将光标向后偏移…

通过pipeline配置sonar自动化实现过程解析

这篇文章主要介绍了通过pipeline配置sonar自动化实现过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.sonar配置webhooks&#xff0c; 2.url填写jenkins的地址&#xff1a;http://jenkinsurl/sonarqu…

高低压供配电智能监控系统

高低压供配电智能监控系统是一种综合运用物联网、云计算、大数据和人工智能等技术的智能化监控系统&#xff0c;用于实时监测高低压供配电设备的运行状态和电能质量&#xff0c;及时发现和处理供配电系统中存在的问题&#xff0c;提高供配电系统的安全性和可靠性。依托电易云-智…

JavaScript 数组

JavaScript 数组 用来存储一系列相关数据的一种数据类型 创建数组 字面量方式 ----- [1,2,3,4,5,6];实例化构造函数 ----- new Array(1,2,3,4,5,6);组成数组的元素可以是任意的数据类型包括数组本身&#xff1b; new Array(n): n 表示数组的长度 内容操作 获取&#xff08;查…

LLM之Agent(四)| AgentGPT:一个在浏览器运行的Agent

AgentGPT是一个自主人工智能Agent平台&#xff0c;用户只需要为Agent指定一个名称和目标&#xff0c;就可以在浏览器中链接大型语言模型&#xff08;如GPT-4&#xff09;来创建和部署Agent平台。 PS&#xff1a;目前agentGPT仅支持chatgpt模型&#xff0c;暂时不支持本地llm模…

怎么让CMake不使用VS作为构建工具,而是使用gcc

2023年12月5日&#xff0c;周二晚上 要让 CMake 使用 gcc 而不是 Visual Studio 作为构建工具&#xff0c;可以通过指定生成器来告诉 CMake 使用 gcc。 在运行 cmake 命令时&#xff0c;可以使用 -G 参数来指定生成器。 对于 gcc&#xff0c;可以使用 "Unix Makefiles&q…

调查显示 IT 服务事件越来越频繁

事件管理平台提供商 Transposit 对美国 1,000 名 IT 运营、DevOps、站点可靠性工程 (SRE) 和平台工程专业人士进行的一项调查发现&#xff0c;超过三分之二 (67%) 的人发现故障率有所增加过去 12 个月中影响客户的服务事件的频率。 今天在Kubecon CloudNative会议上宣布的调查…

102.套接字-Socket网络编程4(TCP通信流程)

目录 TCP编程流程 套接字函数 1.创建套接字 2.绑定地址 3.监听连接请求 4.接受连接 5. 连接到服务器 6. 发送数据 7. 接收数据 8.关闭套接字 服务器端通信流程 示例代码 客户端通信流程 代码示例 TCP编程流程 TCP是一个面向连接的&#xff0c;安全的&#xff0c;流…

【Java技术专题】「入门到精通系列教程」深入探索Java特性中泛型技术体系的原理和实战开发指南

深入探索Java特性中泛型技术体系的原理和实战开发指南 前提介绍泛型的介绍泛型带来的好处泛型引发的问题错觉&#xff1a;泛型也可以实现多态 泛型的特点类型擦除概念定义案例分析隐患问题开发要点类型擦除的过程案例代码 实例分析类型转换问题 通配符与上下界通配符List<Ob…

在线测量大尺寸管材的测径仪有哪些?

工业高速发展的背后&#xff0c;离不开与之匹配的高端设备作为科研的支撑。品质检测仪器也在随着现代科技的发展而不断变化&#xff0c;随着科技的进步&#xff0c;各种大口径的管材、管道被生产制造出来&#xff0c;而对其外径尺寸的检测则因口径范围大而使得很少有仪器能进行…