Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
- Use modern Python type hints, including `X | None` instead of `Optional[X]`.
- Use `snake_case` for methods, functions, and CLI arguments.
- Keep related public symbols discoverable through consistent prefixes.
- For external wrenches, follow the asset API's `is_global` boolean and `_b`/`_w` buffer naming. Keep
frame conversion decisions in `WrenchComposer` and track pending contributions with plain booleans;
do not introduce frame enums, content bitmasks, or a classification layer.
- Name wrench reads `get_forces_and_torques`, matching the existing add/set methods; avoid a separate
"submission" API or compatibility alias for the unreleased `resolve_submission` method.
- Use concrete types for public interfaces where practical.
- Use Google-style docstrings for public APIs.
- Document SI units for public physical quantities in docstrings using inline `[unit]` notation (e.g. `Particle positions [m], shape [N, 3]`); use `[m or rad, depending on joint type]` where applicable, and skip non-physical fields (indices, counts, flags).
Expand Down
4 changes: 2 additions & 2 deletions scripts/benchmarks/benchmark_newton_raycast.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ class RaycastBenchSceneCfg(InteractiveSceneCfg):
prim_path="{ENV_REGEX_NS}/SensorBody",
spawn=sim_utils.CuboidCfg(
size=(0.1, 0.1, 0.1),
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=1.0),
),
init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0)),
)
Expand Down
18 changes: 9 additions & 9 deletions scripts/benchmarks/benchmark_view_comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ def benchmark_usd_or_fabric(view_type: str, num_iterations: int) -> dict[str, fl
object_cfg = 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(),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=1.0),
collision_props=sim_utils.UsdPhysicsCollisionCfg(),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
)
for i in range(args_cli.num_envs):
Expand Down Expand Up @@ -151,9 +151,9 @@ class _SceneCfg(InteractiveSceneCfg):
prim_path="{ENV_REGEX_NS}/Cube",
spawn=sim_utils.CuboidCfg(
size=(0.2, 0.2, 0.2),
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
collision_props=sim_utils.CollisionPropertiesCfg(),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=1.0),
collision_props=sim_utils.UsdPhysicsCollisionCfg(),
),
init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0)),
)
Expand Down Expand Up @@ -207,9 +207,9 @@ def benchmark_physx(num_iterations: int) -> dict[str, float]:
object_cfg = 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(),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=1.0),
collision_props=sim_utils.UsdPhysicsCollisionCfg(),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
)
for i in range(args_cli.num_envs):
Expand Down
6 changes: 3 additions & 3 deletions scripts/benchmarks/benchmark_xform_prim_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ class _NewtonSceneCfg(InteractiveSceneCfg):
prim_path="{ENV_REGEX_NS}/Object",
spawn=sim_utils.CuboidCfg(
size=(0.2, 0.2, 0.2),
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
collision_props=sim_utils.CollisionPropertiesCfg(),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=1.0),
collision_props=sim_utils.UsdPhysicsCollisionCfg(),
),
init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 1.0)),
)
Expand Down
32 changes: 19 additions & 13 deletions scripts/demos/bin_packing.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@

import torch
import warp as wp
from isaaclab_physx.sim.schemas import PhysxRigidBodyCfg

import isaaclab.sim as sim_utils
import isaaclab.utils.math as math_utils
Expand Down Expand Up @@ -148,10 +149,10 @@ def spawn_grocery(
) -> Usd.Prim:
"""Spawn a visual YCB model and author the physics schemas it does not ship with.

These models carry no physics schemas, so the ``rigid_props`` and ``collision_props`` of a
spawner configuration would find nothing to modify. This spawner defines each schema
instead: the rigid body on the asset root and a convex-hull collider on the mesh, matching
how the physics-ready YCB models are authored.
These models carry no physics schemas, so the ``collision_props`` of a spawner configuration
would author the collider on the asset root rather than on its meshes. This spawner defines
each schema instead: the rigid body on the asset root and a convex-hull collider on the mesh,
matching how the physics-ready YCB models are authored.

Args:
prim_path: Prim path to spawn the asset at.
Expand All @@ -167,12 +168,16 @@ def spawn_grocery(
root_path = prim.GetPath().pathString
for mesh in sim_utils.get_all_matching_child_prims(root_path, lambda child: child.GetTypeName() == "Mesh"):
mesh_path = mesh.GetPath().pathString
schemas.define_collision_properties(mesh_path, schemas.CollisionBaseCfg(collision_enabled=True))
schemas.define_mesh_collision_properties(
mesh_path, schemas.MeshCollisionBaseCfg(mesh_approximation_name="convexHull")
schemas.apply_collision_properties(
mesh_path, [schemas.UsdPhysicsCollisionCfg(collision_enabled=True)], create_if_missing=True
)
schemas.define_rigid_body_properties(root_path, sim_utils.RigidBodyPropertiesCfg(solver_position_iteration_count=4))
schemas.define_mass_properties(root_path, schemas.MassPropertiesCfg(mass=GROCERY_MASS))
schemas.apply_mesh_collision_properties(
mesh_path, [schemas.UsdPhysicsMeshCollisionCfg(mesh_approximation_name="convexHull")]
)
schemas.apply_rigid_body_properties(
root_path, [PhysxRigidBodyCfg(solver_position_iteration_count=4)], create_if_missing=True
)
schemas.apply_mass_properties(root_path, [schemas.MassCfg(mass=GROCERY_MASS)], create_if_missing=True)
return prim


Expand Down Expand Up @@ -240,10 +245,11 @@ class BinPackingSceneCfg(InteractiveSceneCfg):
spawn=sim_utils.UsdFileCfg(
usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/KLT_Bin/small_KLT.usd",
scale=(2.0, 2.0, 2.0),
rigid_props=sim_utils.RigidBodyPropertiesCfg(
solver_position_iteration_count=4, solver_velocity_iteration_count=0, kinematic_enabled=True
),
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
rigid_props=[
sim_utils.UsdPhysicsRigidBodyCfg(kinematic_enabled=True),
PhysxRigidBodyCfg(solver_position_iteration_count=4, solver_velocity_iteration_count=0),
],
mass_props=sim_utils.MassCfg(mass=1.0),
),
init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, 0.0, 0.15)),
)
Expand Down
6 changes: 3 additions & 3 deletions scripts/demos/haply_teleoperation.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,9 @@ class FrankaHaplySceneCfg(InteractiveSceneCfg):
prim_path="{ENV_REGEX_NS}/Cube",
spawn=sim_utils.CuboidCfg(
size=(0.06, 0.06, 0.06),
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=0.5),
collision_props=sim_utils.CollisionPropertiesCfg(),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=0.5),
collision_props=sim_utils.UsdPhysicsCollisionCfg(),
physics_material=sim_utils.RigidBodyMaterialCfg(static_friction=0.5, dynamic_friction=0.5),
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.2, 0.8, 0.2), metallic=0.2),
),
Expand Down
9 changes: 5 additions & 4 deletions scripts/demos/mpm/newton_mpm_granular.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ def create_sim_cfg():
def create_scene_cfg():
"""Create an Isaac Lab scene config using declarative assets."""
from isaaclab_newton.assets import MPMObjectCfg
from isaaclab_newton.sim.schemas import NewtonCollisionCfg
from isaaclab_newton.sim.spawners.mpm import MPMGridCfg

import isaaclab.sim as sim_utils
Expand All @@ -127,10 +128,10 @@ def collider_cfg(prim_path: str, center, half_extents, orientation, friction: fl
prim_path=prim_path,
spawn=sim_utils.CuboidCfg(
size=(2.0 * half_extents[0], 2.0 * half_extents[1], 2.0 * half_extents[2]),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(
collision_enabled=True,
contact_margin=COLLIDER_MARGIN,
),
collision_props=[
sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
NewtonCollisionCfg(contact_margin=COLLIDER_MARGIN),
],
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=friction,
dynamic_friction=friction,
Expand Down
9 changes: 5 additions & 4 deletions scripts/demos/mpm/newton_mpm_twoway_coupling.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ def create_sim_cfg():
def create_scene_cfg():
"""Create the declarative rigid-sphere and granular-bath scene."""
from isaaclab_newton.assets.mpm_object import MPMObjectCfg
from isaaclab_newton.sim.schemas import NewtonCollisionCfg
from isaaclab_newton.sim.spawners.mpm import MPMGridCfg, MPMParticleMaterialCfg

from isaaclab.assets import AssetBaseCfg, RigidObjectCfg, RigidObjectCollectionCfg
Expand All @@ -183,7 +184,7 @@ def bath_collider(
else sim_utils.spawn_cuboid
),
size=size,
collision_props=sim_utils.NewtonCollisionPropertiesCfg(contact_margin=COLLIDER_MARGIN),
collision_props=NewtonCollisionCfg(contact_margin=COLLIDER_MARGIN),
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=0.6,
dynamic_friction=0.6,
Expand All @@ -203,9 +204,9 @@ def bath_collider(
color=SPHERE_COLORS[index],
),
radius=SPHERE_RADIUS,
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=SPHERE_MASS),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(),
mass_props=sim_utils.MassCfg(mass=SPHERE_MASS),
collision_props=sim_utils.UsdPhysicsCollisionCfg(),
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=0.5,
dynamic_friction=0.5,
Expand Down
10 changes: 5 additions & 5 deletions scripts/demos/mpm/snowball_smash.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,9 @@ def crate_cfg(index: int) -> RigidObjectCfg:
prim_path=f"{{ENV_REGEX_NS}}/Crate_{index}",
spawn=sim_utils.CuboidCfg(
size=(CRATE_SIZE, CRATE_SIZE, CRATE_SIZE),
rigid_props=sim_utils.NewtonRigidBodyPropertiesCfg(rigid_body_enabled=True),
mass_props=sim_utils.MassPropertiesCfg(mass=args_cli.crate_mass),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(collision_enabled=True),
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(rigid_body_enabled=True),
mass_props=sim_utils.MassCfg(mass=args_cli.crate_mass),
collision_props=sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=CRATE_FRICTION,
dynamic_friction=CRATE_FRICTION,
Expand Down Expand Up @@ -289,11 +289,11 @@ class SnowballSmashSceneCfg(InteractiveSceneCfg):
prim_path="{ENV_REGEX_NS}/MPMGround",
spawn=sim_utils.CuboidCfg(
size=(12.0, 12.0, 0.10),
rigid_props=sim_utils.NewtonRigidBodyPropertiesCfg(
rigid_props=sim_utils.UsdPhysicsRigidBodyCfg(
rigid_body_enabled=True,
kinematic_enabled=True,
),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(collision_enabled=True),
collision_props=sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=CRATE_FRICTION,
dynamic_friction=CRATE_FRICTION,
Expand Down
68 changes: 41 additions & 27 deletions scripts/demos/mpm/teapot_fill.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,12 +433,20 @@ def spawn_demo_mesh(
if not cfg.visible:
UsdGeom.Imageable(stage.GetPrimAtPath(mesh_prim_path)).MakeInvisible()

def as_fragments(value) -> list:
# the schema slots accept a bare fragment or a list of fragments
return list(value) if isinstance(value, (list, tuple)) else [value]

if cfg.collision_props is not None:
schemas.define_collision_properties(mesh_prim_path, cfg.collision_props, stage=stage)
schemas.apply_collision_properties(
mesh_prim_path, as_fragments(cfg.collision_props), create_if_missing=True, stage=stage
)
if cfg.mesh_collision_props is not None:
schemas.define_mesh_collision_properties(mesh_prim_path, cfg.mesh_collision_props, stage=stage)
schemas.apply_mesh_collision_properties(mesh_prim_path, as_fragments(cfg.mesh_collision_props), stage=stage)
if cfg.rigid_props is not None:
schemas.define_rigid_body_properties(prim_path, cfg.rigid_props, stage=stage)
schemas.apply_rigid_body_properties(
prim_path, as_fragments(cfg.rigid_props), create_if_missing=True, stage=stage
)

if cfg.visual_material is not None:
material_path = cfg.visual_material_path
Expand Down Expand Up @@ -585,7 +593,9 @@ def create_sim_cfg():
def create_scene_cfg(container_usd: str, island_usd: str | None, bowl_usd: str | None):
"""Create the teapot-fill scene using declarative Isaac Lab assets."""
from isaaclab_newton.assets import MPMObjectCfg
from isaaclab_newton.sim.schemas import NewtonCollisionCfg
from isaaclab_newton.sim.spawners.mpm import MPMParticleMaterialCfg, MPMPointsCfg
from isaaclab_physx.sim.schemas import PhysxRigidBodyCfg

import isaaclab.sim as sim_utils
from isaaclab.assets import AssetBaseCfg, RigidObjectCfg
Expand All @@ -605,7 +615,12 @@ class DemoMeshCfg(sim_utils.MeshCfg):
func: Callable | str = clone(spawn_demo_mesh)
vertices: list[list[float]] = MISSING
faces: list[list[int]] = MISSING
mesh_collision_props: sim_utils.NewtonMeshCollisionPropertiesCfg | None = None
mesh_collision_props: sim_utils.UsdPhysicsMeshCollisionCfg | None = None

# The visual assets only disable rigid bodies and colliders they already carry; the explicit
# target mappings keep an asset without physics from gaining a body on its spawn prim.
disable_asset_rigid_bodies = {"(/.*)?": [sim_utils.UsdPhysicsRigidBodyCfg(rigid_body_enabled=False)]}
disable_asset_colliders = {"(/.*)?": [sim_utils.UsdPhysicsCollisionCfg(collision_enabled=False)]}

island_cfg = None
if island_usd is not None:
Expand All @@ -615,8 +630,8 @@ class DemoMeshCfg(sim_utils.MeshCfg):
usd_path=island_usd,
variants={"Physics": "none"},
make_uninstanceable=True,
rigid_props=sim_utils.NewtonRigidBodyPropertiesCfg(rigid_body_enabled=False),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(collision_enabled=False),
rigid_props=disable_asset_rigid_bodies,
collision_props=disable_asset_colliders,
),
init_state=AssetBaseCfg.InitialStateCfg(rot=TABLE_ORIENTATION),
)
Expand All @@ -630,8 +645,8 @@ class DemoMeshCfg(sim_utils.MeshCfg):
scale=(BOWL_SCALE,) * 3,
variants={"Physics": "none"},
make_uninstanceable=True,
rigid_props=sim_utils.NewtonRigidBodyPropertiesCfg(rigid_body_enabled=False),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(collision_enabled=False),
rigid_props=disable_asset_rigid_bodies,
collision_props=disable_asset_colliders,
),
init_state=AssetBaseCfg.InitialStateCfg(pos=BOWL_BASE_POS),
)
Expand All @@ -646,10 +661,10 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
prim_path="{ENV_REGEX_NS}/TabletopCollider",
spawn=sim_utils.CuboidCfg(
size=(2.0 * TABLE_HALF_EXTENTS[0], 2.0 * TABLE_HALF_EXTENTS[1], 2.0 * TABLE_HALF_EXTENTS[2]),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(
collision_enabled=True,
contact_margin=COLLIDER_MARGIN,
),
collision_props=[
sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
NewtonCollisionCfg(contact_margin=COLLIDER_MARGIN),
],
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=TABLE_FRICTION,
dynamic_friction=TABLE_FRICTION,
Expand All @@ -674,11 +689,11 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
spawn=DemoMeshCfg(
vertices=(BOWL_SCALE * bowl_vertices).tolist(),
faces=bowl_faces.tolist(),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(
collision_enabled=True,
contact_margin=COLLIDER_MARGIN,
),
mesh_collision_props=sim_utils.NewtonMeshCollisionPropertiesCfg(mesh_approximation_name="none"),
collision_props=[
sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
NewtonCollisionCfg(contact_margin=COLLIDER_MARGIN),
],
mesh_collision_props=sim_utils.UsdPhysicsMeshCollisionCfg(mesh_approximation_name="none"),
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=BOWL_FRICTION,
dynamic_friction=BOWL_FRICTION,
Expand All @@ -701,16 +716,15 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
spawn=DemoMeshCfg(
vertices=container_vertices.tolist(),
faces=container_faces.tolist(),
rigid_props=sim_utils.NewtonRigidBodyPropertiesCfg(
rigid_body_enabled=True,
kinematic_enabled=True,
disable_gravity=True,
),
collision_props=sim_utils.NewtonCollisionPropertiesCfg(
collision_enabled=True,
contact_margin=COLLIDER_MARGIN,
),
mesh_collision_props=sim_utils.NewtonMeshCollisionPropertiesCfg(mesh_approximation_name="none"),
rigid_props=[
sim_utils.UsdPhysicsRigidBodyCfg(rigid_body_enabled=True, kinematic_enabled=True),
PhysxRigidBodyCfg(disable_gravity=True),
],
collision_props=[
sim_utils.UsdPhysicsCollisionCfg(collision_enabled=True),
NewtonCollisionCfg(contact_margin=COLLIDER_MARGIN),
],
mesh_collision_props=sim_utils.UsdPhysicsMeshCollisionCfg(mesh_approximation_name="none"),
physics_material=sim_utils.NewtonMaterialPropertiesCfg(
static_friction=CONTAINER_FRICTION,
dynamic_friction=CONTAINER_FRICTION,
Expand Down
Loading
Loading