Nvidia Isaac Sim图编程OmniGraph 入门教程 2024(6)

Nvidia Isaac Sim 入门教程 2024

版权信息

Copyright 2023-2024 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图形界面知识已了解

什么是OmniGraph?

OmniGraph 是 Omniverse 中的一种可视化的编程框架,也就是常见的图编程,以非代码的方式进行编程,使得不熟悉Omniverse里的API的用户也可以方便地连接Omniverse生态的各组件。

在 Omniverse Isaac Sim 内部,OmniGraph 是数据生成器、ROS2 Bridge、传感器访问、控制器、外部输入/输出设备、UI 等的主要引擎,也可以将OmniGraph和代码编程结合起来,节省编程时间。

OmniGraph概念

OmniGraph包含两种图概念,分别是Authoring GraphExecution Graph
Authoring Graph可以理解为用户在构建图时看到的内容,它描述了图的拓扑和配置,进而描述了要进行的特定计算,例如读取当前某个场景中方块的Transform并写入到一个变量。
Execution Graph是系统在评估Authoring Graph所描述的计算时使用的,方便系统对用户所创建的图进行性能优化并保留原有的业务逻辑,例如两个依次将变量在数值上x2的同功能类型的不同节点,将被优化成一个将变量在数值上x4的节点。

简单来说,一般用户通常只需要涉及Authoring Graph,而不需要考虑Execution Graph

The abstract concept that comprises nodes and connections which could be referring to either the Authoring Graph, the Execution Graph, or a combination of both.

OmniGraph类型

OmniGraph可以从图的执行(评估)方式来区分。

“evaluate”(评估)指的是对图形中的每个节点进行计算或处理。

图可以分为三种类型:

  • ActionGraph
    ActionGraph是一种响应特定事件而触发动作的图,可以理解为一个事件的回调函数,触发信号可以是键盘鼠标、舞台事件、对象变更时以及定时器等,例如按下键盘的W键,触发执行一系列图,使得仿真中的小车前进。

  • PushGraph
    PushGraph在每次系统更新或者TICK时都会对每个节点进行执行(评估),这意味着无论节点是否需要在帧更新时进行计算,所有节点都会被处理,因此效率不高。

  • LazyGraph
    Lazy Graph仅执行(评估)自上次执行(评估)以来,输入发生变化的节点。

简单来说,它们在触发条件和执行效率上有一定差别,一般用户通常只需要涉及 ActionGraph,而不用关注其他。

如果希望深入了解OmniGraph,可以参考OmniGraph官方文档、OmniGraph关键概念。

第一个ActionGraph

在了解完Graph的概念和分类后,我们通过学习ActionGraph,作为进入OmniGraph开发流的一种途径。
此时假设一种场景,我们为小车戴上帽子,使得仿真中的一个圆锥体作为“帽子”,让这个“帽子”跟随着小车运动,为了通过非代码的方式实现这个功能,我们需要用到图编程。

分析流程

首先我们来分析如何实现这样一个功能:

  1. 读取小车车身的当前位姿。
  2. 在小车原有位姿的基础上,让Z轴高度增加一段距离作为戴帽子的位姿。
  3. 将戴帽子的位姿作为圆锥体“帽子”的位姿。
  4. 寻找一个触发条件来让帽子的位置不断跟随小车运动的车身位置更新。

在分析完具体应该实现的步骤后,我们来进行图的创建,并将这些流程的需求,以节点、属性、连接的形式组织到图中。

创建图

  1. 打开在上一章节中制作的小车。
  2. 从编辑器顶部的下拉菜单中选择Window -> Visual Scripting -> Action Graph
  3. 重命名这个Graph为object_tracking_graph来表明功能。
  4. 在左下角的窗块中查看图的编辑器。
  5. 点击Edit Action Graph

在这里插入图片描述

读取小车身体的位姿

小车身体的位置(Translation)和朝向(Orientation)都属于小车身体这个基本对象(Prim)的属性(Attribute),因此我们需要先读取这些属性。

  • 在左下角的图编辑器中搜索read prim attribute节点,并将其拖入编辑窗口中。

  • 修改这个节点的名称为read_chassis_translation_node

  • 在右侧的属性(Property)中指定这个节点所绑定的基本对象(Prim)和属性名(Attribute)为/World/fqnvidia/bodyxfromOp:translate,这意味着它读取的参数值是小车车身的位置属性。
    在这里插入图片描述

  • 同理,按照以上步骤读取小车车身的朝向属性,注意指定的属性为xfromOp:orient
    在这里插入图片描述

计算帽子的位姿

  • 在Action Graph的搜索栏中搜索Point3d,引入一个类型为Point3d的常量。
  • 重命令这个常量为cone_increment
  • 将常量的属性中将其值设置为[0,0,1],代表在Z轴方向上拔高的值为1米,x轴y轴的偏移值为0,它将作为帽子相对于车身的位置增量。

在这里插入图片描述

  • 在Action Graph的搜索栏中搜索Add,引入基本的数学运算Add,它将用于将小车车身的位置和帽子的位置增量相加,作为帽子的位置。
  • 重命名这个数学运算为add_z_node
  • 将这个数学运算节点的输入Acone_increment进行连线。
  • 将这个数学运算节点的输入Bread_chassis_translation_node的输出value进行连线。
    在这里插入图片描述

写入帽子位姿

  • 添加Cone,此时添加一个Mesh类型的圆锥Cone到场景中。
  • 在舞台中重命名为cone_for_chassis
  • 为它添加带颜色的外观材质(可选)。
  • 在左下角的图编辑器中搜索write prim attribute节点,并将其拖入编辑窗口中。
  • 修改这个节点的名称为write_cone_translation_node
  • 在右侧的属性(Property)中指定这个节点所绑定的基本对象(Prim)和属性名(Attribute)为/World/cone_for_chassisxfromOp:translate,这意味着它写入的参数值是圆锥帽子的位置属性。

注意: 另一种方便的方法来指定节点绑定对象和读写类型的方式是,从舞台中将基本对象拖拽到图的编辑区

在这里插入图片描述

  • 同理,按照以上步骤写入圆锥帽子的朝向属性,注意指定的属性为xfromOp:orient
    在这里插入图片描述

  • add_z_node的输出Sum,连接到write_cone_translation_node的输入Value,写入帽子的位置。

  • read_chassis_orientation_node的输出Value,连接到write_cone_orientation_node的输入Value,写入帽子的朝向。
    在这里插入图片描述

  • 设置触发
    以上的步骤完成了从小车车身位姿的读取、帽子位姿计算、到帽子位姿的写入,但是还缺少触发条件,这里我们设置一个定期触发的触发器作为条件。

设置定期触发

  • 在左下角的图编辑器中搜索on tick节点,并将其拖入编辑窗口中。
    On Tick节点每帧都会通过其Tick执行端口发出执行信号。因此,连接到其Tick端口的任何内容都会每帧进行评估。
    它基于屏幕刷新率的,表示在刷新率的某个倍数时执行一次输出。这与硬件刷新和显示有关,详细可参考Omniverse: On Tick。

  • 连接on_tick的输出信号Tickwrite_cone_translation_node,使得每次触发时,重新设置帽子的位置Action将被执行。

  • 连接on_tick的输出信号Tickwrite_cone_orientation_node,使得每次触发时,重新设置帽子的朝向Action将被执行。

在这里插入图片描述

测试

按下Play,按下shift并小车,查看圆锥帽子跟随小车的效果。

在这里插入图片描述

控制机器人的Graph

通过上面的戴帽子Graph学习,我们成功地为小车戴上了一个跟随移动的帽子,并在测试中通过GUI拖拽的方式移动了小车。
那么是否有更易于操控的方式,比如键盘,用非直接代码的方式控制小车呢?这同样可以通过Graph来实现。

分析流程

首先我们来分析如何实现用键盘控制小车的功能:

  1. 读取键盘状态
    首先要读取用户的键盘输入作为小车的速度控制信号。
  2. 添加差速轮控制器
    在教程中制作的小车是简单的两轮差速小车,为了实现键盘控制速度并解算到轮子应该有的速度,我们需要一个差速轮控制器。
  3. 添加关节树控制器
    当获取到轮子应有的速度时,还需要通过关节树控制器来对轮子这样的关节进行控制。
  4. 轮询读取键盘的状态,继续下一次的更新。

创建图

  1. 打开在上一章节中制作的小车。
  2. 从编辑器顶部的下拉菜单中选择Window -> Visual Scripting -> Action Graph
  3. 重命名这个Graph为keyboard_control_graph来表明功能。
    在这里插入图片描述

添加键盘

  • 在Action Graph的搜索栏中搜索read keyboard state,选中Read Keyboard State
  • 重命名节点为read_keyboard_J
  • 设置属性(Property)中的Key为J
  • 同理,将IKJL均设置,分别对应I(前进)、K(后退)、左转(J)和右转(L)
    在这里插入图片描述

添加键盘到速度指令的映射

  • 在Action Graph的搜索栏中搜索to double并添加。
    它能够将其他类型的值转化为double类型的值,例如将键盘按下的bool状态值转化为为double类型的值。

  • 分别将read_keyboard_I、K、J、L节点的输出bool量Is Pressed和四个to_double的输入Value相连。

在这里插入图片描述

  • 在Action Graph的搜索栏中搜索const double,选中Constant Double来作为四个方向按键按下时速度值对应的speed常数。
命名数值
forward_speed3
backward_speed-3
left_speed3
right_speed-3

在这里插入图片描述

  • 在Action Graph的搜索栏中搜索multiply math,选中Multiply
    通过将键盘按下的bool值乘以速度常数来获得单个方向的速度值。

  • backward_speed的输出Valueto doubleDouble值分别作为multiply节点的AB

  • 同理,将另外三个方向的bool量和速度常数相乘。
    在这里插入图片描述

  • 在Action Graph的搜索栏中搜索add,选中Add来进行加法运算,来分别获取角速度和线速度。

  • 重命名为linear_velocity

  • 将K和I(前进后退)的乘积相加,使得Product连接到linear_velocityA,另一个Product连接到linear_velocityB

  • 同理,再添加一个Add并重命名为angular_velocity

  • 同理,重命名J和L(左转右转)的乘积相加,使得Product连接到angular_velocityA,另一个Product连接到angular_velocityB
    在这里插入图片描述

关于键盘设置,详细可参考OmniGraph: Read Keyboard State

添加差动控制器

  • 在图形编辑器的搜索栏中输入Differential Controller并添加。
    Differential Controller 负责轮式机器人的差速运动驱动。在给定目标线速度和角速度的情况下,计算两轮机器人的驱动命令。这种控制方式允许通过独立控制两个驱动轮的速度来实现机器人的转弯和移动。

  • 配置Differential Controller
    选择图表中的Differential Controller节点,然后在属性窗格中,设置对应的参数。
    如果使用的是本教程中组装的机器人,将有以下参数:

参数名
wheelDistance2
wheelRadius0.5
maxAngularSpeed3
maxLinearSpeed3
  • linear_velocity的输出Sum连接到差动控制器的Desired Linear Velocity
  • angular_velocity的输出Sum连接到差动控制器的Desired Angular Velocity
    ##

添加关节树控制器

  • 在图形编辑器的搜索栏中输入Articulation Controller并添加。
    Articulation Controller 用于控制使用了关节树结构的机器人的关节,包括连接机器人不同部分的关节,允许以特定的方式移动和旋转。通过将驱动程序命令(以力、位置或速度的形式)应用于具有关节根的机器人的指定关节,实现对机器人关节的精准控制。

  • 配置机器人控制器,指定需要控制的机器人prim为/World/fqnvidia

  • 添加关节到articulation_controller的属性(Property)中的jointNames
    Articulation Controller还需要知道要控制的关节是哪些。它期望的输入是以关节身份标记或关节索引值的列表。例如fqnvidia机器人的left_wheel_jointright_wheel_joint可以作为被控制的无限制的旋转关节。

注意: jointNames的顺序应当和差动控制器的控制输出序列匹配。

  • 连接differential_controller的输出Velocity Commandarticulation_controller的输入Velocity Command

在这里插入图片描述

设置定期触发

  • 在左下角的图编辑器中搜索on tick节点,并将其拖入编辑窗口中。
    On Tick节点每帧都会通过其Tick执行端口发出执行信号。因此,连接到其Tick端口的任何内容都会每帧进行评估。
    它基于屏幕刷新率的,表示在刷新率的某个倍数时执行一次输出。这与硬件刷新和显示有关,详细可参考Omniverse: On Tick。

  • 连接on_tick的输出信号Tickdifferential_controller,使得每次触发时,差动控制器执行一次功能。

  • 连接on_tick的输出信号Tickarticulation_controller,使得每次触发时,关节树控制器执行一次功能。

在这里插入图片描述

最终的节点和连线应当如图:
在这里插入图片描述

测试

按下Play,随后随意按动键盘的IKJL来进行机器人的移动控制,能够观察到小车在键盘指令下运动,并且帽子会随着机器人的运动和姿态调整而变化。

在这里插入图片描述

Python实现(可选的)

虽然图编程的理念就是不希望使用复杂的代码,但它确实有代码实现。
通过代码中的简单编辑,可以融合图编程和代码编程的一部分特性,也可以通过查看graph中的代码,借鉴为开发的一些材料。要查找特定节点的后端.py和.ogn文件。将鼠标悬停在图编辑器窗口中的节点上,将出现一个工具提示窗口,扩展的名称将写在括号中。
然后可以通过导航到包含节点后端脚本的扩展文件夹来查看,例如exts/omni.isaac.<ext_name>/omni/isaac/<ext_name>/ogn/python/nodes/

import omni.graph.core as og

常用的Graph(可选的)

Isaac Sim提供了一些常用的Graph,包括机械臂、夹爪的控制器、ROS2的关节状态发布等一些桥接节点等,在Isaac Utils -> Common Omnigraphs可以找到。
更深入的信息可参考常用Graph。

结尾语

恭喜你,已经学习了Isaac Sim图编程的相关内容,能够利用非直接代码的图实现机器人的基本控制、物体跟随等功能。

在下一章节,你将学习Isaac Sim中的拓展编程,利用拓展制作机器人演示demo。

如需企业内训定制、项目开发合作或个人学习支持,请联系:hermanye233@icloud.com

参考资料

OmniGraph现有的节点库
OmniGraph构建键盘控制
OmniGraph官方文档
OmniGraph关键概念
Omniverse: On Tick
OmniGraph: Read Keyboard State
常用Graph

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

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

相关文章

创建一个Django项目

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 本小节我们将开始讲解如何使用Django创建一个项目&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;首先在D盘&#xff08;读者可以根据…

Java基础:IO流

目录 一、定义 1.引言 2.分类 &#xff08;1&#xff09;按照流的方向分 &#xff08;2&#xff09;按操作文件的类型分 3.体系结构 二、字节流&#xff08;以操作本地文件为例&#xff09; 1. FileOutputStream 类 &#xff08;1&#xff09;定义 &#xff08;2&am…

使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

现代数据环境需要一种新型的基础架构&#xff0c;即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地&#xff0c;它为您的所有数据需求提供了一个中心枢纽。然而&#xff0c;构建和管理有效的数据湖可能很复杂。 这…

PR模板 | RGB特效视频标题模板Titles | MOGRT

RGB特效视频标题模板mogrt免费下载 4K分辨率&#xff08;38402160&#xff09; 支持任何语言 友好的界面 输入和输出动画 快速渲染 视频教程 免费下载&#xff1a;https://prmuban.com/39055.html 更多pr模板视频素材下载地址&#xff1a;https://prmuban.com

不翻墙安装yolov8环境下的RT-DETR并实现PCB表面缺陷检测

目录 一、新建conda环境二、安装yolov8环境1.克隆安装包2.安装依赖包3.测试模型 任务2&#xff1a;基于RT-DETR实现PKU-PCB表面缺陷检测数据准备 数据增强测试 总结 一、新建conda环境 创建并激活conda环境&#xff1a; 在conda创建一个名为yolov8的新环境&#xff0c;并在其中…

外贸行业 - 收汇日期

“收汇日期”指的是外贸业务中&#xff0c;出口方从进口方收到货款的具体日期。在外贸交易中&#xff0c;特别是使用信用证&#xff08;Letter of Credit, L/C&#xff09;、电汇&#xff08;Telegraphic Transfer, T/T&#xff09;、付款交单&#xff08;Documents against Pa…

《2024云安全资源池 能力指南》

《2024云安全资源池 能力指南》这份报告不仅梳理了云安全资源池的发展历程,还深入探讨了其在当前云计算环境下的重要性和必要性。报告详细分析了云安全资源池的市场需求、技术架构、关键技术以及行业应用案例,为政企用户提供了全面的云安全解决方案。通过资料收集、问卷调研、企…

深入了解 GPT-4 和 ChatGPT 的 API---OpenAI Playground

文章目录 基本概念OpenAI API 提供的可用模型在 OpenAI Playground 中使用 GPT 模型 掌握GPT-4 和 ChatGPT 的 API 的使用方法&#xff0c;以便有效地将它们集成到 Python 应用程序中。首先&#xff0c;需要了解 OpenAI Playground。这将使你在编写代码之前更好地了解模型。接着…

如何将一个web端程序打包成一个pc端程序(exe文件)?

如何将一个Web端程序打包成一个PC端程序&#xff0c;例如一个可执行的EXE文件&#xff0c;是许多开发者常见的需求。下面将详细解释如何使用Nativefier工具将Web端程序打包成PC端程序的具体步骤。 目录 下载并安装Node.js验证Node.js和npm的安装安装Nativefier使用Nativefier打…

鸿蒙Harmony角落里的知识:从ECMA规范到ArkTS接口(一)

前言&#xff1a; 在深入理解和使用ArkTS中的数组操作之前&#xff0c;我们有必要先了解ECMAScript&#xff08;ECMA&#xff09;规范中的规定。ECMA规范是JavaScript语言的官方标准&#xff0c;而ArkTS作为JavaScript的超集&#xff0c;也遵守了这些规定。本系列文章旨在探讨…

学期结束如何发布期末成绩?

当期末的试卷最后一张被收起&#xff0c;当教室里的喧嚣逐渐沉寂&#xff0c;学生们的心中充满了对成绩的期待与忐忑。期末成绩&#xff0c;关乎着学生的心情&#xff0c;更关系到他们的未来学习动力。那么&#xff0c;如何在保护学生隐私的同时&#xff0c;高效地公布成绩呢&a…

文件怎么加密?电脑文件加密,分享5个实用方法

通常情况下&#xff0c;人们对手机数据的保护比对电脑数据更为重视。许多人使用指纹和密码来防止他人窥视聊天记录和照片。然而&#xff0c;电脑上的数据却常常被忽视。大多数用户仅设置了电脑登录密码&#xff0c;认为这样就足以保护电脑和其中的文件。然而如果你也是这样认为…

chatglm系列知识

一、目录 chatglm 是什么语言模型与transformer decoder 的区别解释prefix LM与Cause LMchatglm&#xff08;prefix LM&#xff09;与decoder-only LM 核心区别glm 架构chatglm 预训练方式chatglm 微调chatglm与chatglm2、chatglm3的区别chatglm 激活函数采用gelu, 为什么chat…

办理北京公司注册地址异常变更要求和流程

在北京注册公司时选择注册地址是非常重要的一环&#xff0c;注册地址不仅体现在营业执照上&#xff0c;在网上也有公示信息&#xff0c;一般选用的是商用地址和商住两用地址&#xff0c;在公司经营过程中&#xff0c;因为经营需要变更注册地址&#xff0c;也要依法变更&#xf…

详解Spring AOP(一)

目录 1. AOP概述 2.Spring AOP快速入门 2.1引入AOP依赖 2.2编写AOP程序 3.Spring AOP核心概念 3.1切点&#xff08;PointCut&#xff09; 3.2连接点&#xff08;Join Point&#xff09; 3.3通知&#xff08;Advice&#xff09; 3.4切面&#xff08;Aspect&#xff09; …

时间?空间?复杂度??

1.什么是时间复杂度和空间复杂度&#xff1f; 1.1算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称为空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空…

CentOS 8.5 - 配置ssh的免密登录

文章目录 生成ssh密钥公钥内容放入服务器 生成ssh密钥 在本地主机安装 ssh工具&#xff0c;并生成公钥、私钥。 # 命令行输入 ssh-keygen -r rsa# 会在当前用户的家目录下生成一个.ssh目录公钥内容放入服务器 将上一步生成的id_rsa.pub公钥的内容复制到远程服务器 # 编辑文…

Day17--654.最大二叉树+617.合并二叉树+700.二叉搜索树中的搜索+ 98.验证二叉搜索树

一、654.最大二叉树 题目链接&#xff1a;https://leetcode.cn/problems/maximum-binary-tree/ 文章讲解&#xff1a;https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1MG411G7ox…

SpringMVC系列四: Rest-优雅的url请求风格

Rest请求 &#x1f49e;Rest基本介绍&#x1f49e;Rest风格的url-完成增删改查需求说明代码实现HiddenHttpMethodFilter机制注意事项和细节 &#x1f49e;课后作业 上一讲, 我们学习的是SpringMVC系列三: Postman(接口测试工具) 现在打开springmvc项目 &#x1f49e;Rest基本介…

Part 5.2 KMP

KMP 算法可以用来解决模式串匹配问题。 【模板】KMP 题目描述 给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​&#xff0c;若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同&#xff0c;则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了&…