第二讲、Isaaclab 在场景中添加对象

发布于:2025-04-11 ⋅ 阅读:(37) ⋅ 点赞:(0)

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.pyscripts/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米)
)

网站公告

今日签到

点亮在社区的每一天
去签到