创建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)https://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)
)
创建刚体
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