使模拟中的物理基元固定

使模拟中的物理基元固定#

当一个USD基元应用了物理模式,它会受到物理模拟的影响。这意味着这个基元可以在模拟世界中移动、旋转和与其他基元碰撞。然而,有时需要让特定的基元在模拟世界中保持静态,即这个基元应该仍然参与碰撞,但其位置和方向不应该改变。

以下几个部分描述了如何在模拟世界中生成一个具有物理模式并使其保持静态的基元。

静态碰撞器#

静态碰撞器是指那些不受物理影响但可以与模拟世界中的其他基元发生碰撞的基元。这些基元没有任何刚体属性。然而,这也意味着它们无法通过物理张量API(即通过 assets.RigidObject 类)进行访问。

例如,要在模拟世界中生成一个静态圆锥,可以使用以下代码:

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)
)

刚性物体#

刚性物体(即物体只有一个刚体)可以通过将参数 sim.schemas.RigidBodyPropertiesCfg.kinematic_enabled 设置为True来使其静态。这将使物体成为动力学物体,不受物理影响。

例如,要在模拟世界中生成一个刚体模式的静态圆锥,可以使用以下代码:

import omni.isaac.lab.sim as sim_utils

cone_spawn_cfg = sim_utils.ConeCfg(
    radius=0.15,
    height=0.5,
    rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True),
    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)),
)
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)
)

关节#

固定关节需要在关节根刚体连接点上设置一个固定关节,这可以通过将参数 sim.schemas.ArticulationRootPropertiesCfg.fix_root_link 设置为True来实现。根据这个参数的值,可能出现以下几种情况:

  • 如果设置为 None ,则不修改根连接点。

  • 如果关节已经有一个固定的根连接点,这个标志将启用或禁用固定关节。

  • 如果关节没有固定的根连接点,这个标志将创建一个固定关节,它连接世界框架和根连接点。该关节被命名为 “FixedJoint” ,位于根连接点下方。

例如,要在模拟世界中生成一个ANYmal机器人并使其处于静态状态,可以使用以下代码:

import omni.isaac.lab.sim as sim_utils
from omni.isaac.lab.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",
    activate_contact_sensors=True,
    rigid_props=sim_utils.RigidBodyPropertiesCfg(
        disable_gravity=False,
        retain_accelerations=False,
        linear_damping=0.0,
        angular_damping=0.0,
        max_linear_velocity=1000.0,
        max_angular_velocity=1000.0,
        max_depenetration_velocity=1.0,
    ),
    articulation_props=sim_utils.ArticulationRootPropertiesCfg(
        enabled_self_collisions=True,
        solver_position_iteration_count=4,
        solver_velocity_iteration_count=0,
        fix_root_link=True,
    ),
)
anymal_spawn_cfg.func(
    "/World/ANYmal", anymal_spawn_cfg, translation=(0.0, 0.0, 0.8), orientation=(1.0, 0.0, 0.0, 0.0)
)

这将在基元路径 "/World/ANYmal/base/FixedJoint" 处在世界框架和ANYmal机器人的根连接点 "/World/ANYmal/base" 之间创建一个固定关节。

更多说明#

鉴于USD资产设计的灵活性,通常会出现以下可能的情况:

  1. 具有固定关节但没有固定关节的刚体基元的关节根模式:

    这是悬浮基关节的最常见和推荐的情况。根基元同时具有刚体和关节根属性。在这种情况下,关节根被解析为具有根基元 Link0Xform 的悬浮基。

    ArticulationXform
        └── Link0Xform  (RigidBody and ArticulationRoot schema)
    
  2. 具有固定关节的父基元的关节根模式:

    这是固定基关节的期望排列方式。根基元只具有刚体属性,关节根属性应用于其父基元。在这种情况下,关节根被解析为具有根基元 Link0Xform 的固定基。

    ArticulationXform (ArticulationRoot schema)
        └── Link0Xform  (RigidBody schema)
        └── FixedJoint (connecting the world frame and Link0Xform)
    
  3. 父基元没有固定关节的关节根模式:

    这是一个场景,其中根基元只具有刚体属性,而关节根属性应用于其父基元。然而,不会在世界框架和根连接点之间创建固定关节。在这种情况下,关节被解析为一个悬浮基系统。然而,PhysX解析器使用自己的启发法则(例如按字母顺序)来确定关节根的根基元。它可以选择将根基元设置为 Link0Xform ,也可能选择其他基元作为根基元。

    ArticulationXform (ArticulationRoot schema)
        └── Link0Xform  (RigidBody schema)
    
  4. 具有固定关节的刚体基元的关节根模式:

    虽然这是一个有效的情况,但不建议这样做,因为它可能导致意外行为。在这种情况下,关节仍被解析为一个悬浮基系统。然而,在世界框架和根连接点之间创建的固定关节被视为最大坐标树的一部分。PhysX将这种情况解析为固定基系统。因此,模拟可能不会按预期行为。

    ArticulationXform
        └── Link0Xform  (RigidBody and ArticulationRoot schema)
        └── FixedJoint (connecting the world frame and Link0Xform)
    

对于悬浮基关节,根基元通常同时具有刚体和关节根属性。然而,直接连接这个基元到世界框架会导致模拟认为固定关节是最大坐标树的一部分。这与PhysX认为关节是固定基系统是不同的。

内部,当参数 sim.schemas.ArticulationRootPropertiesCfg.fix_root_link 设置为True并且关节被检测为悬浮基系统时,固定关节被创建在关节根刚体连接点和世界框架之间。然而,为了使PhysX解析器认为关节是固定基系统,关节根属性需要从根刚体基元中移除,并应用到其父基元上。

备注

在未来版本的Isaac Sim中,将为来自PhysX的关节根模式添加一个显式标志,以在固定基和悬浮基系统之间进行切换。这将解决上述的问题。