在仿真中固定物理 prim

在仿真中固定物理 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 资产的组织方式较为灵活,常见情况如下:

  1. 关节体根模式应用于刚体 prim,且没有固定关节 :

    这是浮动基座关节体最常见、也最推荐的组织方式。根 prim 同时具有刚体属性和关节体根属性,解析得到的关节体为浮动基座系统,其根 prim 是 Link0Xform 。

    ArticulationXform
        └── Link0Xform  (RigidBody and ArticulationRoot schema)
    
  2. 关节体根模式应用于父 prim,且存在固定关节 :

    这是固定基座关节体的预期组织方式。根 prim 仅具有刚体属性,关节体根属性应用于其父 prim。解析得到的关节体为固定基座系统,其根 prim 是 Link0Xform 。

    ArticulationXform (ArticulationRoot schema)
        └── Link0Xform  (RigidBody schema)
        └── FixedJoint (connecting the world frame and Link0Xform)
    
  3. 关节体根模式应用于父 prim,且没有固定关节 :

    在这种情况下,根 prim 仅具有刚体属性,关节体根属性应用于其父 prim,但世界坐标系与根连杆之间没有固定关节。关节体会被解析为浮动基座系统。PhysX 解析器使用自身的启发式规则(如字母顺序)确定关节体的根 prim,因此可能选中 Link0Xform ,也可能选中其他 prim。

    ArticulationXform (ArticulationRoot schema)
        └── Link0Xform  (RigidBody schema)
    
  4. 关节体根模式应用于刚体 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。