在仿真中固定物理 prim#
USD prim 应用物理模式后,会受到物理仿真的影响,能够在仿真世界中移动、旋转,并与其他 prim 碰撞。不过,有时需要让某些 prim 保持静止:它们仍参与碰撞,但位置和朝向不变。
下文介绍如何生成带有物理模式的 prim,并使其在仿真世界中保持静止。
静态碰撞体和固定的关节体根,在 PhysX 与 Newton 中使用共享的 USD 拓扑。这些操作使用下文的共享配置。后端专用的求解器设置见 选择共享设置与后端专用设置 。
静态碰撞体#
静态碰撞体不受物理运动影响,但能与仿真世界中的其他 prim 碰撞。它们未应用刚体属性,因此无法通过物理张量 API(即 assets.RigidObject 类)访问。
例如,要在仿真世界中生成静止的球体,可使用以下代码:
import isaaclab.sim as sim_utils
sphere_spawn_cfg = sim_utils.SphereCfg(
radius=0.15,
collision_props=sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
)
sphere_spawn_cfg.func(
"/World/Sphere", sphere_spawn_cfg, translation=(0.0, 0.0, 2.0)
)
刚体对象#
将 sim.schemas.UsdPhysicsRigidBodyCfg.kinematic_enabled 设为 True,可让刚体(仅有一个刚体组成的对象)保持固定。该设置使对象成为运动学刚体,其运动由用户代码指定,不再由重力和外力积分得到。未指定运动时,它保持不动,但仍可参与碰撞。
例如,要在仿真世界中生成具有刚体模式的静止球体,可使用以下代码:
import isaaclab.sim as sim_utils
sphere_spawn_cfg = sim_utils.SphereCfg(
radius=0.15,
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(kinematic_enabled=True),
mass_props=sim_utils.MassCfg(mass=1.0),
collision_props=sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
)
sphere_spawn_cfg.func(
"/World/Sphere", sphere_spawn_cfg, translation=(0.0, 0.0, 2.0)
)
关节体#
固定关节系统的根部,需要在世界与根连杆之间建立固定关节。可将生成器级 fix_root_link 标志设为 True,实现这一点。该参数取不同值时,有以下情况:
设为
None时,不修改根连杆。如果关节体已有固定根连杆,此标志会启用或禁用对应的固定关节。
如果关节体没有固定根连杆,此标志会在世界坐标系与根连杆之间创建固定关节,并将其放在资产层级中的可写 prim 下。
例如,要生成 ANYmal 机器人并固定其基座,同时保持关节可动,可使用以下代码:
import isaaclab.sim as sim_utils
from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR
anymal_spawn_cfg = sim_utils.UsdFileCfg(
usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/ANYbotics/ANYmal-C/anymal_c.usd",
fix_root_link=True,
)
anymal_spawn_cfg.func(
"/World/ANYmal", anymal_spawn_cfg, translation=(0.0, 0.0, 0.8), orientation=(0.0, 0.0, 0.0, 1.0)
)
这会在世界坐标系与 ANYmal 机器人的根连杆之间创建固定关节。关节写入可编辑的 prim 下,确切路径取决于资产根部及实例化布局。在此流程中,无论 articulation_props 未设置、为空,还是包含其他片段,都会处理 fix_root_link。
PhysX 关节体根的位置细节
以下解析器细节说明了 PhysX 专用的根位置调整。Newton 会导入最终得到的 USD 关节拓扑;不要将 PhysX 解析器的启发式规则当作 Newton 配置规则。
USD 资产的组织方式较为灵活,常见情况如下:
关节体根模式应用于刚体 prim,且没有固定关节 :
这是浮动基座关节体最常见、也最推荐的组织方式。根 prim 同时具有刚体属性和关节体根属性,解析得到的关节体为浮动基座系统,其根 prim 是
Link0Xform。ArticulationXform └── Link0Xform (RigidBody and ArticulationRoot schema)关节体根模式应用于父 prim,且存在固定关节 :
这是固定基座关节体的预期组织方式。根 prim 仅具有刚体属性,关节体根属性应用于其父 prim。解析得到的关节体为固定基座系统,其根 prim 是
Link0Xform。ArticulationXform (ArticulationRoot schema) └── Link0Xform (RigidBody schema) └── FixedJoint (connecting the world frame and Link0Xform)关节体根模式应用于父 prim,且没有固定关节 :
在这种情况下,根 prim 仅具有刚体属性,关节体根属性应用于其父 prim,但世界坐标系与根连杆之间没有固定关节。关节体会被解析为浮动基座系统。PhysX 解析器使用自身的启发式规则(如字母顺序)确定关节体的根 prim,因此可能选中
Link0Xform,也可能选中其他 prim。ArticulationXform (ArticulationRoot schema) └── Link0Xform (RigidBody schema)关节体根模式应用于刚体 prim,且存在固定关节 :
这种组织方式虽有效,但可能产生意外行为,因此不推荐。关节体仍会被解析为浮动基座系统,而世界坐标系与根连杆之间的固定关节被视为最大坐标树的一部分。这与 PhysX 将整个关节体解析为固定基座系统的方式不同,因此仿真结果可能不符合预期。
ArticulationXform └── Link0Xform (RigidBody and ArticulationRoot schema) └── FixedJoint (connecting the world frame and Link0Xform)
浮动基座关节体的根 prim 通常同时具有刚体属性和关节体根属性。若直接将该 prim 固定到世界坐标系,仿真会把固定关节视为最大坐标树的一部分,而不会让 PhysX 将整个关节体视为固定基座系统。
内部实现中,当 fix_root_link 设为 True,且检测到关节系统为浮动基座系统时,会在世界坐标系与根刚体连杆之间创建固定关节。为了让 PhysX 解析器将其识别为固定基座系统,还会将关节系统根属性从根刚体 prim 移至其父 prim。