Isaac Lab tutorials 之场景创建

创建prims

python source/standalone/tutorials/00_sim/spawn_prims.py

绿色刚体与其Xform坐标 

桌子是usd文件reference到场景中,The table above is added as a reference to the scene.,以及其坐标

def design_scene():
    """Designs the scene by spawning ground plane, light, objects and meshes from usd files."""
    # Ground-plane 配置地面
    cfg_ground = sim_utils.GroundPlaneCfg()
    cfg_ground.func("/World/defaultGroundPlane", cfg_ground)

    # spawn distant light
    # 配置灯光
    cfg_light_distant = sim_utils.DistantLightCfg(
        intensity=3000.0,
        color=(0.75, 0.75, 0.75),
    )
    cfg_light_distant.func("/World/lightDistant", cfg_light_distant, translation=(1, 0, 10))

    # create a new xform prim for all objects to be spawned under
    # 创建一个 Objects Xform
    prim_utils.create_prim("/World/Objects", "Xform")
    # spawn a red cone 图中两个红色的立锥, translation 是他们的坐标
    cfg_cone = sim_utils.ConeCfg(
        radius=0.15,
        height=0.5,
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(1.0, 0.0, 0.0)),
    )
    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))

    # spawn a green cone with colliders and rigid body
    # 绿色的立锥是刚体,掉落下来到桌子上,这里展示了一个立锥刚体的创建方法
    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(),
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
    )
    cfg_cone_rigid.func(
        "/World/Objects/ConeRigid", cfg_cone_rigid, translation=(0.0, 0.0, 2.0), orientation=(0.5, 0.0, 0.5, 0.0)
    )

    # spawn a usd file of a table into the scene
    # The table above is added as a reference to the scene
    # 桌子的创建是添加一个桌子实例usd文件,是作为reference加入进来的
    cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd")
    cfg.func("/World/Objects/Table", cfg, translation=(0.0, 0.0, 1.05))

创建静态碰撞体

Making a physics prim fixed in the simulation — Isaac Lab documentation (isaac-sim.github.io)icon-default.png?t=N7T8https://isaac-sim.github.io/IsaacLab/source/how-to/make_fixed_prim.html#static-colliders生成一些静态障碍物,但没有刚体属性,生成多个物体的做法跟下面刚体的类似

import omni.isaac.lab.sim as sim_utils

cone_spawn_cfg = sim_utils.ConeCfg(
    radius=0.15,
    height=0.5,
    collision_props=sim_utils.CollisionPropertiesCfg(),
    visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
)
cone_spawn_cfg.func(
    "/World/Cone", cone_spawn_cfg, translation=(0.0, 0.0, 2.0), orientation=(0.5, 0.0, 0.5, 0.0)
)

创建刚体

与刚性对象交互 — Isaac Lab 文档 --- Interacting with a rigid object — Isaac Lab documentation (isaac-sim.github.io)icon-default.png?t=N7T8https://isaac-sim.github.io/IsaacLab/source/tutorials/01_assets/run_rigid_object.html实现在场景中随机掉落四个刚体

python source/standalone/tutorials/01_assets/run_rigid_object.py

 作为多次生成刚性对象 prim 的示例,我们创建其父 Xform prims, /World/Origin{i} 它们对应于不同的生成位置。当正则表达式 /World/Origin*/Cone 传递给 assets.RigidObject 类时,它会在每个 /World/Origin{i} 位置生成刚性对象 prim。例如,如果 /World/Origin1 场景中存在 和 /World/Origin2 ,则刚性对象素数分别在位置 /World/Origin1/Cone 和 /World/Origin2/Cone 处生成。

    # Create separate groups called "Origin1", "Origin2", "Origin3"
    # Each group will have a robot in it
    # 创建4个原点Xform
    origins = [[0.25, 0.25, 0.0], [-0.25, 0.25, 0.0], [0.25, -0.25, 0.0], [-0.25, -0.25, 0.0]]
    for i, origin in enumerate(origins):
        prim_utils.create_prim(f"/World/Origin{i}", "Xform", translation=origin)

    # Rigid Object
    # 立锥刚体配置
    cone_cfg = RigidObjectCfg(
        prim_path="/World/Origin.*/Cone",
        spawn=sim_utils.ConeCfg(
            radius=0.1,
            height=0.2,
            rigid_props=sim_utils.RigidBodyPropertiesCfg(),
            mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
            collision_props=sim_utils.CollisionPropertiesCfg(),
            visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0), metallic=0.2),
        ),
        init_state=RigidObjectCfg.InitialStateCfg(),
    )
    # 创建刚体实体对象
    cone_object = RigidObject(cfg=cone_cfg)

在本教程中,我们使用类似于 Spawn Objects 教程中的刚性圆锥体的 spawn 配置创建一个圆锥形刚性对象。唯一的区别是,现在我们将生成配置包装到类中 assets.RigidObjectCfg 。此类包含有关资产的生成策略、默认初始状态和其他元信息的信息。当将此类传递给 assets.RigidObject 该类时,它会生成对象,并在播放模拟时初始化相应的物理句柄。

如果想屏蔽掉物体重力,修改这一句:

rigid_props=sim_utils.RigidBodyPropertiesCfg(disable_gravity=True),

这就做出了空间障碍物

四个原点的坐标位置

重置模拟状态

# reset root state
# 获取根状态
root_state = cone_object.data.default_root_state.clone()
# sample a random position on a cylinder around the origins
# 给刚体根状态位置等信息赋值
root_state[:, :3] += origins
root_state[:, :3] += math_utils.sample_cylinder(
    radius=0.1, h_range=(0.25, 0.5), size=cone_object.num_instances, device=cone_object.device
)
# write root state to simulation
# 将根状态写入到仿真中
cone_object.write_root_state_to_sim(root_state)
# reset buffers
cone_object.reset()

要重置生成的刚体对象prims模拟状态,我们需要设置它们的姿态和速度。它们共同定义了生成的刚性对象的根状态。需要注意的是,此状态是在仿真世界框架中定义的,而不是在其父 Xform prim 中定义的。这是因为物理引擎只理解世界帧,而不理解父 Xform prim 的帧。因此,我们需要在设置刚体对象prims之前将刚体对象prims的期望状态转换为世界框架。

使用该 assets.RigidObject.data.default_root_state 属性来获取生成的刚体对象prims的默认根状态。

然后,我们随机化根状态的平移,并使用该 assets.RigidObject.write_root_state_to_sim() 方法设置刚体对象prims的所需状态。顾名思义,此方法将刚体对象prims 的根状态写入仿真缓冲区。

所以这里创建的刚体位置是相对于根的,跟父Xform之类的无关,反正我点来点去是没查到立锥体的位置;

接下来还有两步跟刚体有关的工作要做:

在步进模拟之前,我们执行该 assets.RigidObject.write_data_to_sim() 方法。此方法将其他数据(如外力)写入仿真缓冲区。在本教程中,我们不会对刚性对象施加任何外力,因此不需要此方法。但是,为了完整起见,它包括在内。

# apply sim data
cone_object.write_data_to_sim()

 在逐步仿真之后,我们更新刚性对象素数的内部缓冲区,以反映它们在属性中 assets.RigidObject.data 的新状态。这是使用该 assets.RigidObject.update() 方法完成的。

# update buffers
cone_object.update(sim_dt)

欢迎加QQ群一起交流学习:723139415

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值