Nvidia Isaac Sim 5 - 快速教程 1 - 基础使用教程

本教程介绍 Isaac Sim 的基础内容,包括浏览 GUI、向场景添加对象、查看对象的基本属性,以及运行仿真。

本教程将从空白场景开始,通过三种不同工作流中的任意一种,使机器人运动起来。包含这三种不同工作流的目的是说明 Isaac Sim 可以根据需求以不同方式使用。

可以查看两种工作流中的脚本,了解它们之间的差异。通过比较和对照,有助于理解如何执行完全相同的任务:

  • 扩展脚本可以在 Window > Examples > Robotics Examples 中找到,然后点击浏览器右上角的 Open Script
  • 独立脚本可以在 <isaac-sim-root-dir>/standalone_examples/tutorials/ 文件夹中找到。

可以通过编辑 Extension 示例中的任意脚本试用“热重载”功能。保存文件后,无需关闭仿真器,即可看到更改立即生效。


1. GUI

1.1. 启动

从安装根目录启动 Isaac Sim。

cd ~/isaacsim
./isaac-sim.sh

仿真器完全加载后,创建新场景:

从顶部菜单栏中,点击 File > New。首次启动 Isaac Sim 时,完成该操作可能需要五到十分钟。

1.2. 添加地平面

向场景添加地平面:

  1. 从顶部菜单栏中,点击 Create > Physics > Ground Plane

1.3. 添加光源

可以向场景中添加光源,照亮场景中的对象。如果场景中有光源,但没有对象反射光线,场景仍然是黑暗的。

向场景中添加远光源:

  1. 从顶部菜单栏中,点击 Create > Lights > Distant Light

1.4. 添加可视立方体

“可视”立方体是指未附加任何物理属性的立方体,比如没有质量、没有碰撞属性。因此该立方体不会在重力作用下下落,也不会与其他对象发生碰撞。

向场景中添加立方体:

  1. 从顶部菜单栏中,点击 Create > Shape > Cube
  1. 在 UI 最左侧找到箭头图标,然后点击 Play。仿真运行时,立方体不会发生任何变化。

1.5. 移动、旋转和缩放立方体

使用左侧工具栏上的各种操纵器操控立方体。

  1. 按下“W”键或点击移动操纵器,即可拖拽及移动立方体。可以通过点击箭头+拖拽,沿单个轴移动;点击彩色方块+拖拽,沿两个轴移动;或者点击操纵器中心的圆点+拖拽,沿全部三个轴移动。
  1. 按下“E”键或点击旋转操纵器旋转立方体。
  1. 按下“R”键或点击缩放操纵器缩放立方体。可以通过点击箭头+拖拽,沿单个维度缩放;点击彩色方块+拖拽,沿两个维度缩放;或者点击操纵器中心的圆圈+拖拽,沿全部三个维度缩放。
  1. 按下“Esc”键可取消选择立方体。

对于“移动”和“旋转”操作,可以指定在局部坐标还是在世界坐标下进行操作。点击+按住操纵器即可查看相关选项。

还可以通过立方体的属性面板进行更精确的修改,在相应的输入框中输入准确数值。点击输入框旁边的蓝色方块,可将数值重置为默认值。

1.6. 添加物理和碰撞属性

常见的物理属性包括质量和惯性矩阵,这些属性使物体能够在重力作用下下落。碰撞属性则使物体能够与其他物体发生碰撞。

物理属性和碰撞属性可以分别添加,因此可以创建能与其他物体碰撞但不受重力作用下落的物体,或者受重力作用下落但不与其他物体碰撞的物体。但多数情况同时添加两者。

为立方体添加物理和碰撞属性的步骤如下:

  1. 在 Stage 树中找到该物体(“/World/Cube”),然后高亮选中它。
  1. 在工作区右下角的属性面板中,点击“Add”按钮,然后从下拉菜单中选择“Physics”。此时将显示可添加到该对象的一系列属性。
  1. 选择“Rigid Body with Colliders Preset”,即可同时为对象添加物理网格和碰撞网格。
  1. 点击“Play”按钮,即可看到立方体在重力作用下下落,并且与地面发生碰撞。

2. Extension

2.1. 启动

下面将通过名为 Script Editor 的现有扩展模块演示 Extension 工作流的属性。 Script Editor 支持使用 Python 与 Stage 进行交互。主要使用的 Python API 与 Standalone Python 工作流中的基本相同。当开始与仿真时间线交互时,这两种工作流之间的差异将变得清晰。

启动全新的 Isaac Sim 实例,在顶部菜单栏中点击 Window > Script Editor。下面的代码片段均来自同一可运行脚本,应按照顺序依次执行。

2.2. 添加地平面

要使用交互式 Python 添加地平面,请将以下代码段复制粘贴到 Script Editor 中,然后点击底部的“Run”按钮执行。

from isaacsim.core.api.objects.ground_plane import GroundPlane
GroundPlane(prim_path="/World/GroundPlane", z_position=0)

2.3. 添加光源

可以向场景中添加光源,照亮场景中的对象。如果场景中有光源,但没有对象反射光线,场景仍然是黑暗的。

  • Script Editor 中打开新选项卡(Tab > Add Tab)。
  • 将以下代码段复制粘贴到 Script Editor 中,然后运行,即可添加光源。
import omni.usd
from pxr import Sdf, UsdLux

stage = omni.usd.get_context().get_stage()
distantLight = UsdLux.DistantLight.Define(stage, Sdf.Path("/DistantLight"))
distantLight.CreateIntensityAttr(300)

2.4. 添加可视立方体

“可视”立方体是指未附加任何物理属性的立方体。没有质量、没有碰撞属性。该立方体不会在重力作用下下落,也不会与其他对象发生碰撞。

  1. Script Editor 中打开新选项卡(Tab > Add Tab)。
  1. 将以下代码片段复制粘贴到 Script Editor 中,然后运行,将添加两个立方体。保留其中一个为仅可视对象,为另一个添加物理和碰撞属性,以便进行对比。
from isaacsim.core.experimental.materials import PreviewSurfaceMaterial
from isaacsim.core.experimental.objects import Cube

yellow_material = PreviewSurfaceMaterial("/Materials/yellow")
yellow_material.set_input_values("diffuseColor", [1.0, 1.0, 0.0])

cyan_material = PreviewSurfaceMaterial("/Materials/cyan")
cyan_material.set_input_values("diffuseColor", [0.0, 1.0, 1.0])

visual_cube = Cube(
    paths="/visual_cube",
    positions=[0, 0.5, 0.5],
    sizes=0.3,
)
visual_cube.apply_visual_materials(yellow_material)

test_cube = Cube(
    paths="/test_cube",
    positions=[0, -0.5, 0.5],
    sizes=0.3,
)
test_cube.apply_visual_materials(cyan_material)

Isaac Sim Core API 是对原始 USD API 和物理引擎 API 的封装。可以使用原始 USD API 添加可视立方体(不带物理和颜色属性)。注意,原始 USD API 更加冗长,但可以更精细地控制每个属性。

import omni.usd
from pxr import Gf, UsdGeom

stage = omni.usd.get_context().get_stage()

path = "/visual_cube_usd"
cube_geom = UsdGeom.Cube.Define(stage, path)
cube_prim = stage.GetPrimAtPath(path)
size = 0.5
offset = Gf.Vec3f(1.5, -0.2, 1.0)
cube_geom.CreateSizeAttr(size)
if not cube_prim.HasAttribute("xformOp:translate"):
    UsdGeom.Xformable(cube_prim).AddTranslateOp().Set(offset)
else:
    cube_prim.GetAttribute("xformOp:translate").Set(offset)

2.5. 添加物理和碰撞属性

常见的物理属性包括质量和惯性矩阵,这些属性使物体能够在重力作用下下落。碰撞属性则使物体能够与其他物体发生碰撞。

物理属性和碰撞属性可以分别添加,因此可以创建能与其他物体碰撞但不受重力作用下落的物体,或者受重力作用下落但不与其他物体碰撞的物体。但多数情况同时添加两者。

Isaac Sim Core API 为常用对象编写封装类,并且附带其所有物理和碰撞属性。可以使用以下代码片段添加带有物理和碰撞属性的立方体。

import numpy as np
from isaacsim.core.api.objects import DynamicCuboid

DynamicCuboid(
   prim_path="/dynamic_cube",
   name="dynamic_cube",
   position=np.array([0, -1.0, 1.0]),
   scale=np.array([0.6, 0.5, 0.2]),
   size=1.0,
   color=np.array([255, 0, 0]),
)

另外,如果想为现有对象添加物理和碰撞属性,可以使用以下代码段。

from isaacsim.core.prims import RigidPrim
RigidPrim("/test_cube")

from isaacsim.core.prims import GeometryPrim
prim = GeometryPrim("/test_cube")
prim.apply_collision_apis()

点击“Play”按钮,即可看到立方体在重力作用下下落,并且与地面发生碰撞。

2.6. 移动、旋转和缩放立方体

使用核心 API 移动对象:

import numpy as np
from isaacsim.core.prims import XFormPrim


translate_offset = np.array([[1.5,1.2,1.0]])
orientation_offset = np.array([[0.7,0.7,0,1]])     # note this is in radians
scale = np.array([[1,1.5,0.2]])

stage = omni.usd.get_context().get_stage()
cube_in_coreapi = XFormPrim(prim_paths_expr="/test_cube")
cube_in_coreapi.set_world_poses(translate_offset, orientation_offset)
cube_in_coreapi.set_local_scales(scale)

使用原始 USD API 移动对象:

from pxr import UsdGeom, Gf
import omni.usd

stage = omni.usd.get_context().get_stage()
cube_prim = stage.GetPrimAtPath("/visual_cube_usd")
translate_offset = Gf.Vec3f(1.5,-0.2,1.0)
rotate_offset = Gf.Vec3f(90,-90,180)        # note this is in degrees
scale = Gf.Vec3f(1,1.5,0.2)
# translation
if not cube_prim.HasAttribute("xformOp:translate"):
   UsdGeom.Xformable(cube_prim).AddTranslateOp().Set(translate_offset)
else:
   cube_prim.GetAttribute("xformOp:translate").Set(translate_offset)
# rotation
if not cube_prim.HasAttribute("xformOp:rotateXYZ"):        # there are also "xformOp:orient" for quaternion rotation, as well as "xformOp:rotateX", "xformOp:rotateY", "xformOp:rotateZ" for individual axis rotation
   UsdGeom.Xformable(cube_prim).AddRotateXYZOp().Set(rotate_offset)
else:
   cube_prim.GetAttribute("xformOp:rotateXYZ").Set(rotate_offset)
# scale
if not cube_prim.HasAttribute("xformOp:scale"):
   UsdGeom.Xformable(cube_prim).AddScaleOp().Set(scale)
else:
   cube_prim.GetAttribute("xformOp:scale").Set(scale)

3. Standalone Python

3.1. 启动

运行第一部分《Isaac Sim 基础使用教程》的脚本位于 standalone_examples/tutorials/getting_started.py

要运行该脚本,请打开终端,导航到 Isaac Sim 的安装根目录,然后运行以下命令:

./python.sh standalone_examples/tutorials/getting_started.py

3.2. 代码解析

3.2.1. 添加地平面

下面是 getting_started.py 中与向场景添加地平面相关的代码行。

from isaacsim.core.api.objects.ground_plane import GroundPlane
GroundPlane(prim_path="/World/GroundPlane", z_position=0)

3.2.2. 添加光源

可以向场景中添加光源,照亮场景中的对象。如果场景中有光源,但没有对象反射光线,场景仍然是黑暗的。

getting_started.py 中用于添加远距离光源的代码行是:

from pxr import Sdf, UsdLux
stage = omni.usd.get_context().get_stage()
distantLight = UsdLux.DistantLight.Define(stage, Sdf.Path("/DistantLight"))
distantLight.CreateIntensityAttr(300)

3.2.3. 添加可视立方体

“可视”立方体是指未附加任何物理属性的立方体。没有质量、没有碰撞属性。该立方体不会在重力作用下下落,也不会与其他对象发生碰撞。

getting_started.py 中用于向场景添加可视化立方体的代码行是:

import numpy as np
from isaacsim.core.api.objects import VisualCuboid
VisualCuboid(
   prim_path="/visual_cube",
   name="visual_cube",
   position=np.array([0, 0.5, 0.5]),
   size=0.3,
   color=np.array([255, 255, 0]),
)

3.2.4. 添加物理和碰撞属性

常见的物理属性包括质量和惯性矩阵,这些属性使物体能够在重力作用下下落。碰撞属性则使物体能够与其他物体发生碰撞。

物理属性和碰撞属性可以分别添加,因此可以创建能与其他物体碰撞但不受重力作用下落的物体,或者受重力作用下落但不与其他物体碰撞的物体。但多数情况同时添加两者。

在 Standalone Python 脚本中,可以通过将立方体转换为 RigidPrim 对象来为其添加物理属性,如下所示。这样便赋予其在重力作用下下落的能力。

from isaacsim.core.prims import RigidPrim
RigidPrim("/visual_cube")

下面的代码片段展示添加碰撞属性的相关行,这使物体能够与其他物体发生碰撞。

from isaacsim.core.prims import GeometryPrim
prim = GeometryPrim("/visual_cube")
prim.apply_collision_apis()

3.2.5. 移动、旋转和缩放立方体

下面的代码片段展示使用核心 API 移动场景中物体的相关行。

import numpy as np
from isaacsim.core.prims.xform_prim import XformPrim
from isaacsim.core.prims.prim import Prim

translate_offset = np.array([[1.5,-0.2,1.0]])
rotate_offset = np.array([[90,-90,180]])
scale = np.array([[1,1.5,0.2]])

cube_in_coreapi = XformPrim(Prim(prim_paths_expr="/test_cube"))
cube_in_coreapi.set_world_poses(translate_offset, rotate_offset)
cube_in_coreapi.set_scales(scale)