物理 Schema#
机器人模型要参与仿真,只有几何还不够:连杆需要质量,形状需要碰撞属性,关节需要物理约束。USD 通过 Schema 存储这些属性,即附加在场景对象上的具名属性组。USD 场景中的对象称为 prim;机器人连杆、碰撞网格或关节都可以是 prim。
Isaac Lab 的 Schema 配置允许在生成资产时通过 Python 设置这些属性。您可以调整已有资产,或为新形状赋予物理属性,无需手动编辑源 USD 文件。导入的资产可能已经包含所需设置,只需覆盖要更改的属性。
这些是资产级设置。仿真后端及其场景级求解器设置,应另行通过 后端与预设 选择。
什么是片段?#
Schema 片段 是一个小型 Python 配置对象,用于设置某个 USD Schema 或属性命名空间中的属性。例如,MassCfg(mass=0.5) 设置质量,UsdPhysicsCollisionCfg(collision_enabled=True) 设置碰撞属性。
之所以称为片段,是因为它只描述资产物理配置的一部分。将多个片段组合起来,再传入生成器的相应字段,即可定义所需属性。片段是配置数据,不是独立的 USD 文件或几何体。
三者的区别在于:
Schema 定义可用属性及其在 USD 中的存储方式。
片段 提供希望通过 Python 设置的值。
生成器 在创建资产时,将这些值应用到资产的 prim 上。
为对象设置物理属性#
以下配置创建一个质量为 0.5 kg、启用碰撞的小方块:
import isaaclab.sim as sim_utils
from isaaclab.sim.schemas import MassCfg, UsdPhysicsCollisionCfg, UsdPhysicsRigidBodyCfg
cuboid = sim_utils.CuboidCfg(
size=(0.1, 0.1, 0.1),
rigid_props=UsdPhysicsRigidBodyCfg(),
mass_props=MassCfg(mass=0.5),
collision_props=UsdPhysicsCollisionCfg(collision_enabled=True),
)
将此配置传给资产的 spawn 字段,例如 RigidObjectCfg(spawn=cuboid, ...)。生成器创建几何并应用 Schema 配置,随后物理后端读取生成的属性。
生成器的每个字段控制资产的不同部分:
字段 |
控制内容 |
|---|---|
|
刚体行为,例如是否为运动学刚体。 |
|
已有碰撞体的网格近似方式及后端预处理设置。 |
|
刚体的质量或密度。 |
|
碰撞行为与接触设置。 |
|
关节系统的属性,例如根部固定设置。 |
|
保存在资产上的关节驱动设置。 |
|
摩擦、恢复系数等表面属性。 |
若关节由 Isaac Lab 执行器控制,还需阅读 执行器:生成后,执行器配置可能覆盖驱动设置。
字段设为 None 时保留已有属性值。UsdPhysicsRigidBodyCfg() 这样的空片段仍表示需要对应的 Schema,但不会用 Python 默认值替换所有属性。
添加后端专用设置#
生成器字段可接受同一属性族的片段列表。通过列表,将通用 USD 属性与特定后端的设置组合起来:
import isaaclab.sim as sim_utils
from isaaclab.sim.schemas import MassCfg, UsdPhysicsCollisionCfg, UsdPhysicsRigidBodyCfg
from isaaclab_newton.sim.schemas import NewtonCollisionCfg
cuboid = sim_utils.CuboidCfg(
size=(0.1, 0.1, 0.1),
rigid_props=UsdPhysicsRigidBodyCfg(),
mass_props=MassCfg(mass=0.5),
collision_props=[UsdPhysicsCollisionCfg(collision_enabled=True), NewtonCollisionCfg(contact_margin=0.001)],
)
这里,UsdPhysicsCollisionCfg 启用碰撞,NewtonCollisionCfg 将 Newton 的接触裕量设为 1 mm。二者描述同一个碰撞形状,因此都放在 collision_props 中。
通用片段从 isaaclab.sim.schemas 导入,PhysX 片段从 isaaclab_physx.sim.schemas 导入,Newton 或 MuJoCo 片段从 isaaclab_newton.sim.schemas 导入。材质片段位于各自的 sim.spawners.materials 模块中。
同一资产可以保存多个后端的设置,但这不会启用相应后端,也不意味着参数可以互换:属性只有在求解器支持时才会影响仿真。例如,MuJoCo 的重力补偿设置适用于 Newton 的 MuJoCo 求解器,不适用于 PhysX。
配置已有机器人#
UsdFileCfg 接受相同的属性字段。直接传入片段或列表,可更新导入资产中所有匹配的刚体、碰撞体或关节;不同部分需要不同设置时,则使用字典:
import isaaclab.sim as sim_utils
from isaaclab.sim.schemas import UsdPhysicsDriveCfg, UsdPhysicsRigidBodyCfg
from isaaclab_newton.sim.schemas import MujocoRigidBodyCfg
from isaaclab_physx.sim.schemas import PhysxRigidBodyCfg
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR
spawn = sim_utils.UsdFileCfg(
usd_path=f"{ISAAC_NUCLEUS_DIR}/Robots/Franka/franka_instanceable.usd",
rigid_props={
# every rigid body: universal + PhysX + MuJoCo attributes side by side
"/.*": [
UsdPhysicsRigidBodyCfg(rigid_body_enabled=True),
PhysxRigidBodyCfg(max_depenetration_velocity=5.0),
MujocoRigidBodyCfg(gravcomp=1.0),
],
# hand links (and their subtrees) get a tighter depenetration limit
"/.*_hand(/.*)?": [PhysxRigidBodyCfg(max_depenetration_velocity=1.0)],
},
joint_drive_props={
"/.*": [UsdPhysicsDriveCfg(drive_type="force", stiffness=40.0, damping=4.0)],
},
)
字典键是附加在生成 prim 路径后的正则表达式后缀。例如,机器人生成在 /World/Robot 时,"/.*" 会搜索 /World/Robot 下方的对象。规则按顺序应用,后面的规则可覆盖前面的规则。本例为手部子树设置了较小的 PhysX 穿透修正速度上限。
模式 |
相对于锚点的选择范围 |
|---|---|
|
仅锚点自身。 |
|
仅直接子节点。 |
|
所有层级的后代节点。 |
|
锚点及其所有后代节点。 |
对于 USD、URDF 和 MJCF 导入,锚点是生成 prim。形状和网格生成器以几何 prim 为碰撞及网格碰撞属性的锚点,以容器 prim 为刚体与质量属性的锚点。所有生成器的可变形体设置均以生成 prim 为锚点。
搜索范围包含未激活、未定义的 prim 和实例代理。模式先选择候选 prim,再由属性族过滤。例如,刚体设置应用于刚体,关节驱动设置应用于旋转或移动关节。较宽泛的模式通常不会将每个网格都变为刚体。
设置未生效时#
先确认所选后端支持该属性,且模式匹配到预期的 prim。匹配针对完整路径:.* 可跨越 /,而 [^/]+ 只匹配单个路径段。
大多数片段写入器只修改已具有相应 USD API 的 prim,也就是已通过 Schema 标识为刚体、碰撞形状或其他物理对象的 prim。对于质量、关节系统和关节驱动设置,生成器标志 mass_props_create_if_missing、articulation_props_create_if_missing 和 joint_drive_props_create_if_missing 可在匹配目标上创建缺失的 API。
提示
启用 API 创建时,应尽量缩小模式范围。宽泛的质量模式可能为每个匹配网格分别赋予质量,而不是为整个刚体设置一个质量。
形状和网格生成器会创建新几何所需的 API。对于不带字典的片段或列表,文件生成器会查找已具有相应 Schema 的对象;若该属性族找不到此类对象,则将其应用到生成 prim,把资产视为单个刚体。网格碰撞片段是例外,它只修改已有碰撞体。使用显式字典可自行控制目标选择。
找不到有效目标,或目标是不可编辑的实例代理时,写入器会发出警告。空片段列表不会修改任何内容。关节驱动模式会静默跳过非关节 prim,因为同一子树中可能同时包含关节和网格。
MuJoCo 重力补偿#
设置刚体级 gravcomp 可计算重力补偿;设置关节级 actuatorgravcomp 可让补偿力通过执行器通道施加,并受执行器力限制约束,否则补偿力通过被动力通道施加。
import isaaclab.sim as sim_utils
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR
from isaaclab_newton.sim.schemas import MujocoJointCfg, MujocoRigidBodyCfg
spawn = sim_utils.UsdFileCfg(
usd_path=f"{ISAAC_NUCLEUS_DIR}/Robots/Franka/franka_instanceable.usd",
rigid_props=MujocoRigidBodyCfg(gravcomp=1.0),
joint_drive_props=MujocoJointCfg(actuatorgravcomp=True),
)
gravcomp=1.0 表示完全补偿。如果子刚体的补偿值未设置或为零,关节片段也会为其启用完全补偿;已有的非零值则保留。若要禁用补偿,除了将刚体的 gravcomp 设为零,还要关闭 actuatorgravcomp。
旧的 MujocoJointDrivePropertiesCfg 也会在请求时自动启用刚体补偿,除非已显式提供刚体的 gravcomp 值。新配置应优先使用上面的片段示例。
网格碰撞设置#
网格碰撞片段与碰撞片段使用相同的锚点,只修改已有碰撞体,不创建碰撞体。例如,将 USD 资产的所有碰撞体预处理为凸包,并设置 PhysX 顶点数上限:
import isaaclab.sim as sim_utils
from isaaclab_physx.sim.schemas import PhysxConvexHullCfg
spawn = sim_utils.UsdFileCfg(
usd_path="/path/to/asset.usd",
mesh_collision_props=[
sim_utils.UsdPhysicsMeshCollisionCfg(mesh_approximation_name="convexHull"),
PhysxConvexHullCfg(hull_vertex_limit=32),
],
)
可变形物体#
实体可变形体使用 volume_deformable_props,布料一类的表面使用 surface_deformable_props。同一生成器只能设置其中一个字段。二者均接受 OmniPhysicsDeformableBodyCfg,用于配置质量、运动学行为等通用属性;PhysX 还提供专用的调优片段。
与大多数刚体写入器不同,可变形体写入器会在缺少相应设置时创建它。可变形体质量通过 OmniPhysicsDeformableBodyCfg.mass 设置,不受 UsdPhysics.MassAPI 控制。
本例创建一个体积可变形体,包含 PhysX 调优设置、仿真网格上的碰撞偏移,以及 PhysX 和 Newton 的材质设置:
import isaaclab.sim as sim_utils
from isaaclab_physx.sim.schemas import PhysxCollisionCfg, PhysxDeformableBodyCfg
from isaaclab.sim.spawners.materials import OmniPhysicsDeformableMaterialCfg
from isaaclab_newton.sim.spawners.materials import NewtonVolumeDeformableMaterialCfg
sim_utils.MeshCuboidCfg(
size=(0.2, 0.2, 0.2),
volume_deformable_props=[
sim_utils.schemas.OmniPhysicsDeformableBodyCfg(mass=0.5),
PhysxDeformableBodyCfg(solver_position_iteration_count=32),
],
collision_props={"/sim_mesh": [PhysxCollisionCfg(contact_offset=0.01)]},
physics_material=[
OmniPhysicsDeformableMaterialCfg(youngs_modulus=1.0e6, poissons_ratio=0.45),
NewtonVolumeDeformableMaterialCfg(k_mu=1.0e5),
],
)
仿真网格默认是名为 sim_mesh 的子节点。可通过 collision_props 选中它并设置碰撞偏移。可变形体和仿真网格碰撞模式均相对于生成 prim。
physics_material 接受可变形体材质片段,也接受混合刚体与可变形体材质设置的列表。每个片段应用自身的材质 Schema;只供可变形体使用的材质无需刚体材质 API。
使用属性配置类#
在现有任务中,您还会看到 RigidBodyBaseCfg 和 PhysxRigidBodyPropertiesCfg 等类,它们将某一属性组的通用字段和后端专用字段合并在同一对象中。这些兼容类已弃用,计划在 3.2 中移除。已有配置仍可传入相同的生成器字段,但新代码应使用片段。兼容对象应直接传入,不要放进片段列表。
isaaclab.sim.schemas中的基类包含通用字段,不导入任何后端包。PhysX 子类添加阻尼、求解器迭代次数等字段。
Newton 子类添加 Newton 设置;MuJoCo 子类添加重力补偿等求解器专用字段。
更新已有任务时,应将兼容对象拆分为通用字段和后端专用字段的片段。参见 片段迁移示例。
import isaaclab.sim as sim_utils
from isaaclab_physx.sim.schemas import PhysxRigidBodyPropertiesCfg
from isaaclab_newton.sim.schemas import MujocoJointDrivePropertiesCfg
spawn = sim_utils.UsdFileCfg(
usd_path="...",
rigid_props=PhysxRigidBodyPropertiesCfg(disable_gravity=True, linear_damping=0.1),
joint_drive_props=MujocoJointDrivePropertiesCfg(
drive_type="acceleration",
stiffness=10.0,
damping=0.1,
actuatorgravcomp=True,
),
)
本例同时向资产写入 PhysX 和 MuJoCo 设置,各后端使用其支持的字段。完整的类和字段列表见下方可展开的参考章节。
Schema 参考与实现#
以下章节说明配置字段如何转换为 USD 属性。使用前面的示例无需了解这些实现细节。
属性配置类的继承层级
对于各属性组(刚体、关节驱动、碰撞、关节体根节点、材质和网格碰撞),Isaac Lab 在核心包 isaaclab.sim.schemas 中定义一个基类,并在对应扩展包中为各后端定义子类:
isaaclab.sim.schemas
├── RigidBodyBaseCfg
│ ├── isaaclab_physx.sim.schemas.PhysxRigidBodyPropertiesCfg
│ └── isaaclab_newton.sim.schemas.NewtonRigidBodyPropertiesCfg
│ └── isaaclab_newton.sim.schemas.MujocoRigidBodyPropertiesCfg
│
├── JointDriveBaseCfg
│ ├── isaaclab_physx.sim.schemas.PhysxJointDrivePropertiesCfg
│ └── isaaclab_newton.sim.schemas.NewtonJointDrivePropertiesCfg
│ └── isaaclab_newton.sim.schemas.MujocoJointDrivePropertiesCfg
│
├── CollisionBaseCfg
│ ├── isaaclab_physx.sim.schemas.PhysxCollisionPropertiesCfg
│ └── isaaclab_newton.sim.schemas.NewtonCollisionPropertiesCfg
│ ├── isaaclab_newton.sim.schemas.NewtonMeshCollisionPropertiesCfg
│ └── isaaclab_newton.sim.schemas.NewtonSDFCollisionPropertiesCfg
│
├── ArticulationRootBaseCfg
│ ├── isaaclab_physx.sim.schemas.PhysxArticulationRootPropertiesCfg
│ └── isaaclab_newton.sim.schemas.NewtonArticulationRootPropertiesCfg
│
├── MeshCollisionBaseCfg
│ ├── isaaclab_physx.sim.schemas.{PhysxConvexHull, PhysxConvexDecomposition,
│ │ PhysxTriangleMesh, PhysxSDFMesh, ...}PropertiesCfg
│ └── isaaclab_newton.sim.schemas.NewtonMeshCollisionPropertiesCfg
│ (also inherits NewtonCollisionPropertiesCfg — multi-namespace)
│
└── isaaclab.sim.spawners.materials.RigidBodyMaterialBaseCfg
├── isaaclab_physx.sim.spawners.materials.PhysxRigidBodyMaterialCfg
└── isaaclab_newton.sim.schemas.NewtonMaterialPropertiesCfg
NewtonMeshCollisionPropertiesCfg 使用多重继承,同时扩展 NewtonCollisionPropertiesCfg (提供 contact_margin / contact_gap)和 MeshCollisionBaseCfg (提供 mesh_approximation_name)。各继承字段写入其声明类对应的命名空间,见 字段到命名空间的映射。NewtonSDFCollisionPropertiesCfg 则以碰撞配置为继承根,因此只写入 NewtonSDFCollisionAPI,不会额外应用 UsdPhysics.MeshCollisionAPI 或设置 physics:approximation。
每个生成器为每个属性组提供一个字段,例如 rigid_props 或 joint_drive_props;字段接受对应的基类或任一子类。
通用与后端专用字段参考
备注
下表汇总常用字段。完整字段及默认值见由配置类生成的 isaaclab.sim.schemas、isaaclab_physx.sim.schemas 和 isaaclab_newton.sim.schemas。
通用物理(在基类上声明)
大部分通用字段写入 physics:* (标准 UsdPhysics.*API 命名空间),但有少量例外:为了跨后端使用而在基类上声明,却写入非 physics:* 命名空间,因为目前只有该 USD 路径会被读取。例如,disable_gravity 写入 physxRigidBody:disableGravity,因为 PhysX 和 Newton 导入器都读取此 PhysX 属性。下方“USD 属性”列列出实际写入的属性,而非命名空间类别。
基类 |
字段 |
USD 属性 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
生成 |
|
|
|
|
|
|
|
|
仅在写入端处理 — 为 |
|
|
|
|
|
|
|
|
|
PhysX 特有( physx*:* 命名空间, Physx*API 模式)
在 PhysX 配置中设置时,写入以下字段。
PhysX 子类 |
字段(部分) |
USD 命名空间 / 模式 |
|---|---|---|
|
|
|
|
(目前为空,为未来的 PhysX 专属驱动参数预留) |
|
|
|
|
|
|
|
|
|
|
|
|
|
面向 Newton( newton:* 命名空间, Newton*API 模式)
在 Newton 配置中设置时,写入以下字段。
Newton 子类 |
字段 |
USD 命名空间 / 模式 |
|---|---|---|
|
(为空,为未来的 Newton 原生刚体字段预留) |
|
|
(为空,为未来的 Newton 原生关节驱动字段预留) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MuJoCo 求解器特有( mjc:* 命名空间)
以下字段由 Newton 的 MuJoCo 求解器读取。
MuJoCo 子类 |
字段 |
USD 属性 / 模式 |
|---|---|---|
|
|
|
|
|
通过 |
备注
这两个 MuJoCo 条目对 USD 应用模式的要求不同: mjc:actuatorgravcomp 属于已注册的 MjcJointAPI 应用模式,因此字段不是 None 时,写入器会调用 prim.AddAppliedSchema("MjcJointAPI") 。刚体级重力补偿的 mjc:gravcomp 没有已注册的 Mjc 应用模式,因此写入器将其写为原始 USD 属性。Newton 的 MuJoCo 求解器通过同一解析路径读取两者;应用模式的区别仅是 USD 端的细节。
片段写入器与目标族
各片段继承 SchemaFragment ,声明字段写入的 USD 命名空间,以及自己负责的应用模式(如果有)。片段的 func 指定将其应用到 prim 的可调用对象。默认应用函数( apply_namespaced() )将各非 None 字段写为 <namespace>:<camelCase(field)> ,不修改 None 字段(部分更新)。特殊 API 会覆盖 func ,例如 UsdPhysicsDriveCfg 通过 apply_drive() 分发,处理多实例 UsdPhysics.DriveAPI 。
片段按 属性族 分组,每个族对应一个生成器字段。大多数族都有写入器,根据表达式解析目标 prim,再通过各片段的 func 分发。后端片段自带后端专用的应用函数,因此核心包无需导入后端:
生成器字段 |
属性族写入器 |
有效目标 |
|---|---|---|
|
带有 |
|
|
带有 |
|
|
|
已有碰撞 prim |
|
带有 |
|
|
带有 |
|
|
旋转 / 移动关节 prim |
|
|
带有肌腱的 prim(已有肌腱实例) |
|
|
肌腱附着点根 prim |
|
|
体积可变形物体 prim( |
|
|
表面可变形物体 prim(三角仿真网格) |
肌腱属性族遵循 只调整、不创建 的原则:肌腱拓扑在源资产中编写,其写入器只调整已有实例,从不创建实例。可变形属性族则相反,参见 可变形物体 。PhysX 肌腱片段使用 instance_names 在每个匹配 prim 上选择一个或多个实例; None (默认值)表示应用到所有已有实例。
固定肌腱按 PhysX 模式的边界拆分:根片段负责整个肌腱的动力学和限制,轴片段负责各关节的贡献。prim 路径匹配选择关节, instance_names 选择这些关节上的肌腱:
from isaaclab_physx.sim.schemas import PhysxTendonAxisCfg, PhysxTendonAxisRootCfg
fixed_tendons_props = {
"/joints/index_root": [
PhysxTendonAxisRootCfg(instance_names="index_finger", stiffness=10.0),
PhysxTendonAxisCfg(instance_names="index_finger", gearing=[1.0], joint_axis=["rotX"]),
],
"/joints/index_distal": [
PhysxTendonAxisCfg(instance_names="index_finger", gearing=[-0.5], joint_axis=["rotX"]),
],
}
可变形体设置的创建过程
对于没有基础模式的匹配 prim,创建可变形物体配置分为三步:
仿真网格。 在目标下编写
sim_mesh子 prim(名称可通过写入器的sim_mesh_name参数配置)。表面可变形物体使用可视网格的三角网格副本;体积可变形物体使用经过四面体划分的UsdGeom.TetMesh。源资产已有预先划分的UsdGeom.TetMesh子节点时,原地复用,不重复划分。后端基础模式。 当前物理后端通过
PhysicsManager.setup_deformable_body应用自己的基础模式。PhysX 在物体 prim 上应用真正的OmniPhysicsDeformableBodyAPI(两种可变形类型使用同一个模式),并在仿真网格 prim 上根据类型应用OmniPhysicsVolumeDeformableSimAPI/OmniPhysicsSurfaceDeformableSimAPI。Newton 应用自己的Physics*模式(目前仅为 token)。核心片段没有自己的应用模式;OmniPhysicsDeformableBodyCfg只在基础模式存在后写入omniphysics:*命名空间。片段分发。 将匹配槽位中的每个片段按列表顺序应用到目标,与其他属性族完全相同。
字段如何映射到 USD 命名空间
由于各配置字段分发到 声明该字段的类 对应的命名空间,而非实例所属类的命名空间,子类实例可以在同一 prim 上写入多个命名空间的属性。例如:
from isaaclab_newton.sim.schemas import MujocoRigidBodyPropertiesCfg
cfg = MujocoRigidBodyPropertiesCfg(
rigid_body_enabled=True, # declared on RigidBodyBaseCfg → physics:rigidBodyEnabled
disable_gravity=True, # declared on RigidBodyBaseCfg (exception) → physxRigidBody:disableGravity
gravcomp=1.0, # declared on MujocoRigidBodyPropertiesCfg → mjc:gravcomp
)
写入器将各字段应用到声明该字段的类对应的命名空间。只有相应字段不是 None 时,才添加应用模式( disable_gravity 使用 PhysxRigidBodyAPI ;Mjc 原始属性没有应用模式)。
字段名与兼容别名
Python 字段使用 snake_case,USD 属性通常使用 camelCase,例如 contact_margin 转换为 newton:contactMargin。gravcomp 等单词形式的 MuJoCo 字段保持原有拼写。
JointDriveBaseCfg 仍接受 max_velocity 作为 max_joint_velocity 的别名,接受 max_effort 作为 max_force 的别名。建议使用新名称,这些别名计划在 4.0 中移除。使用旧名称时会发出弃用警告;若新字段未设置,则复制旧值。若两者均已提供,则采用新字段值,不发出警告。随后旧数据类字段重置为 None。
进一步阅读#
机器人与关节体配置 — 配置完整的机器人资产。
执行器 — 了解执行器如何确定关节驱动属性。
模式配置类重构 — 将旧 Schema 配置迁移到 3.0。
isaaclab.sim.schemas — 通用配置与写入器。
isaaclab_physx.sim.schemas — PhysX 配置。
isaaclab_newton.sim.schemas — Newton 和 MuJoCo 配置。