0 前言
官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/00_sim/spawn_prims.html
Isaacsim+Isaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm=1001.2014.3001.5502
本教程介绍如何在 Isaac Lab 中使用 Python 将各种对象添加到场景中。
教程对应的脚本为spawn_prims.py
在scripts/tutorials/00_sim
目录下。
运行该程序:
- 进入安装 isaac lab 时创建的conda虚拟环境
- 在该环境下进入 isaac sim文件夹中运行
source setup_conda_env.sh
- 终端中输入
python scripts/tutorials/00_sim/spawn_prims.py
运行你的代码
1 基本介绍
Omniverse 中的场景设计基于名为 USD(通用场景描述)的软件系统和文件格式构建。它允许以分层方式描述 3D 场景。
前面已经对USD文件做过简单的介绍,需要看更多细节的小伙伴可以看之前的教程,传送门放在下面:
第六章、Isaacsim中的资产(usd)
第六章、Isaacsim中的资产:机械狗usda文件详解(1):头部
第六章、Isaacsim中的资产:机械狗usda文件详解(2):base
第六章、Isaacsim中的资产:机械狗usda文件详解(3):trunk
第六章、Isaacsim中的资产:机械狗usda文件详解(4):四肢及imu
基本概念:
- Primitives (Prims):可以理解为USD场景中的节点,节点可以是Mesh,光源、相机及变换等。
- Attributes(属性):是节点的属性,可以被认为是键值对。如:一个prim节点可以有一个名为color的属性,其值为red。
- Relationships(关系):是节点间的连接关系。可以认为类似于指针。例如,一个mesh节点可以通过和merterial节点建立关系来进行着色。
上面的这些集体构成了USD stage 即USD 场景,当在场景中生成prim节点时,每个节点都需要一个配置类实例来定义节点的属性和关系(。然后将配置类传递给相应的函数,其中指定了prim名称和转换。然后该函数将prim生成到场景中。
官方给出了代码
# 创建一个配置类实例包含prim的属性和关系
cfg = MyPrimCfg()
# 指定prim地址
prim_path = "/path/to/prim"
# 调用 spawn_my_prim() 函数生成prim对象
spawn_my_prim(prim_path, cfg, translation=[0, 0, 0], orientation=[1, 0, 0, 0], scale=[1, 1, 1])
# 或
# 通过配置类内置方法创建prim
cfg.func(prim_path, cfg, translation=[0, 0, 0], orientation=[1, 0, 0, 0], scale=[1, 1, 1])
2 添加地平面
代码前面的部分已经在上一节中讲过。这里不再重复,直接从添加地平面开始。
配置sim_units.GroundPlaneCfg
一个网格状的地平面,具有可修改的属性,例如其外观和大小。
# 创建地平面配置类实例
cfg_ground = sim_utils.GroundPlaneCfg()
# 通过配置类内置方法创建prim
cfg_ground.func("/World/defaultGroundPlane", cfg_ground)
3 添加光源
类似的可以在场景中添加不同的光源,包括远距离光源、球形光源、圆盘光源和圆柱光源。在前面章节中我们已经知道如何利用GUI添加光源:
在本教程中,我们将生成一个远距离光源,它距离场景无限远,并且只向一个方向发光。
# 远距离光源配置类实例
cfg_light_distant = sim_utils.DistantLightCfg(
intensity=3000.0,# 设置光照强度(单位:lux)
color=(0.75, 0.75, 0.75),
)
# 通过配置类内置方法创建prim
cfg_light_distant.func("/World/lightDistant", cfg_light_distant, translation=(1, 0, 10))
4 添加刚体
在添加刚体之前,先介绍一个特殊的节点类型Xform
节点,即变换节点。可以将多个刚体节点创建在该节点下进行统一的变换。
# 创建一个Xform节点该节点在World下名为Object
prim_utils.create_prim("/World/Objects", "Xform")
接下来,我们使用该类在上面创建的Xform
节点下。基于ConeCfg
创建一个圆锥体配置实例。可以指定圆锥体的半径、高度、物理属性和材质属性。默认情况下,物理属性和材质属性是禁用的。
生成前两个锥体,不开启物理。
# 创建圆锥体(Cone)的配置实例
cfg_cone = sim_utils.ConeCfg(
# 设置圆锥底面半径(单位:米)
radius=0.15,# 直径约30cm
# 设置圆锥高度(单位:米)
height=0.5,# 高度50cm
# 配置可视化材质(此处使用红色漫反射材质)
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(1.0, 0.0, 0.0)),# RGB红色(值范围0.0-1.0)
# 可添加的物理属性(示例):
# rigid_props=sim_utils.RigidBodyCfg(mass=2.0),
# collision_props=sim_utils.CollisionCfg(contact_offset=0.1)
)
# 在场景中生成第一个圆锥体
cfg_cone.func("/World/Objects/Cone1", cfg_cone, translation=(-1.0, 1.0, 1.0))
# 在场景中生成第二个圆锥体(复用同一配置)
cfg_cone.func("/World/Objects/Cone2", cfg_cone, translation=(-1.0, -1.0, 1.0))
没启用物理,可以看到红色锥体是悬浮在环境中的。
对于第三个锥体Cone,通过在配置类中设置其属性来为其添加刚体物理。可以指定锥体的质量、摩擦力和恢复力。如果未指定,则默认为 USD Physics 设置的默认值。
# # 创建具有刚体物理属性和碰撞体的绿色圆锥体配置
cfg_cone_rigid = sim_utils.ConeCfg(
radius=0.15,
height=0.5,
# 刚体物理属性配置
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
# 质量属性配置
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
# 碰撞属性配置
collision_props=sim_utils.CollisionPropertiesCfg(
# collision_enabled=True, # 默认已启用
# contact_offset=0.1
), # 自动生成与几何形状匹配的碰撞体
# 可视化材质配置
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),# RGB绿色 (范围0.0-1.0)
)
# 生成物理圆锥体到场景中
cfg_cone_rigid.func(
"/World/Objects/ConeRigid", cfg_cone_rigid, translation=(-0.2, 0.0, 2.0), orientation=(0.5, 0.0, 0.5, 0.0)
)
最后,我们生成一个CuboidDeformable包含可变形体物理属性的长方体。与刚体模拟不同,可变形体可以在其顶点之间进行相对运动。这对于模拟布料、橡胶或果冻等软体非常有用。需要注意的是,可变形体仅在 GPU 模拟中受支持,并且需要生成具有可变形体物理属性的网格对象。
# 创建可变形蓝色长方体(软体/柔体)的配置实例
cfg_cuboid_deformable = sim_utils.MeshCuboidCfg(
# 几何尺寸参数(长宽高)
size=(0.2, 0.5, 0.2), # (x, y, z) 单位:米
# 可变形体物理属性配置
deformable_props=sim_utils.DeformableBodyPropertiesCfg(
# 可配置参数示例:
# damping=0.1, # 阻尼系数
# dynamic_friction=0.5, # 动摩擦系数
# self_collision=True # 启用自碰撞
), # 启用基于有限元(FEM)或质点-弹簧的变形模拟
# 可视化材质配置
visual_material=sim_utils.PreviewSurfaceCfg(
diffuse_color=(0.0, 0.0, 1.0) # RGB纯蓝色
),
# 物理材质属性配置(影响变形行为)
physics_material=sim_utils.DeformableBodyMaterialCfg(
# 典型参数示例:
# youngs_modulus=1e5, # 杨氏模量(材料刚度),设置成4000就可以看到果冻形态的蓝色方块
# poissons_ratio=0.3, # 泊松比(横向变形系数)
# damping_scale=0.1 # 材料阻尼
)
)
# 生成可变形长方体到场景中
cfg_cuboid_deformable.func(
"/World/Objects/CuboidDeformable", # USD路径
cfg_cuboid_deformable, # 使用当前配置
translation=(0.15, 0.0, 2.0) # 初始位置坐标(x,y,z)
)
5 添加USD文件
最后,可以从其他文件格式(例如其他 USD、URDF 或 OBJ 文件)添加对象。在本教程中,我们将一个桌子的 USD 文件生成到场景中。该桌子是一个网格对象,并关联了一个材质节点。所有这些信息都存储在其 USD 文件中。
# 从NVIDIA Isaac Sim Nucleus资产库加载预制的桌子USD模型到场景中
cfg = sim_utils.UsdFileCfg(
# 指定USD文件路径(需确保ISAAC_NUCLEUS_DIR环境变量已正确配置)
# 典型Nucleus路径结构:/Props/类别/子类/具体模型
usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"
)
# 将桌子模型实例化到场景指定位置
cfg.func(
"/World/Objects/Table", # 指定场景中的USD路径(建议保持与文件内原有根路径一致)
cfg, # 传递配置对象
translation=(0.0, 0.0, 1.05) # 设置坐标(假设Z轴垂直方向,此处将桌子抬升1.05米)
)