Skip to content

[Bug Report] URDF spawn properties only apply to the root link (disable_gravity, contact sensors) #5918

@AlfredMoore

Description

@AlfredMoore

Describe the bug

When I spawn a URDF robot with UrdfFileCfg, the per-body spawn properties only reach the
root link. Every other link keeps the PhysX default. There is no warning.

Example: I set RigidBodyPropertiesCfg(disable_gravity=True). My fixed-base arm has 29
links, but only the root link gets disableGravity=True. The other 28 links still fall
under gravity, so the arm droops about 0.2 m at the hand. max_depenetration_velocity has
the same problem.

I also set activate_contact_sensors=True. Only the root link gets the contact report API.
A ContactSensor on any other link then fails to start:

RuntimeError: Sensor at path '.../panda_link0/.../F1_TIP' could not find any bodies with contact reporter API.

Why it happens

The Isaac Sim 6.0 URDF importer nests the links. Each child link prim sits under its parent
link prim, like /robot/.../panda_link0/panda_link1/.../F1_TIP.

IsaacLab applies the spawn properties with apply_nested in isaaclab/sim/utils/prims.py.
It stops walking down a path as soon as one prim takes the schema, because it assumes a
rigid body cannot contain another rigid body. activate_contact_sensors in
isaaclab/sim/schemas/schemas.py does the same. So it sets the root link and stops, and all
the nested links are skipped.

The importer side is fine. Isaac Sim's own add_rigid_body_schemas
(isaacsim.asset.importer.utils) walks the same tree with stage.Traverse() and reaches
every body. Only the IsaacLab helpers stop early.

Steps to reproduce

Spawn any URDF that has a chain of links, then count how many bodies got the property:

import argparse
from isaaclab.app import AppLauncher

parser = argparse.ArgumentParser()
AppLauncher.add_app_launcher_args(parser)
args, _ = parser.parse_known_args()
args.headless = True
args.enable_cameras = True
app = AppLauncher(args).app

import isaaclab.sim as sim_utils
from isaaclab.sim import SimulationCfg, SimulationContext
from pxr import UsdPhysics

cfg = sim_utils.UrdfFileCfg(
    asset_path="<path to any URDF with several links in a chain>",
    fix_base=True,
    force_usd_conversion=True,
    rigid_props=sim_utils.RigidBodyPropertiesCfg(disable_gravity=True),
    activate_contact_sensors=True,
)
sim = SimulationContext(SimulationCfg(dt=1.0 / 200.0))
cfg.func("/World/robot", cfg)
sim.reset()

stage = sim_utils.get_current_stage()
total = grav = report = 0
for prim in stage.Traverse():
    if prim.HasAPI(UsdPhysics.RigidBodyAPI):
        total += 1
        attr = prim.GetAttribute("physxRigidBody:disableGravity")
        grav += int(bool(attr.Get()) if attr and attr.IsValid() else False)
        report += int("PhysxContactReportAPI" in prim.GetAppliedSchemas())
print(f"disable_gravity set on {grav}/{total} bodies")
print(f"contact report API on {report}/{total} bodies")
app.close()

I get 1/<N> for both, not <N>/<N>.

System Info

  • Commit: a4a7602f29 (v3.0.0-beta). Same problem on release/3.0.0-beta2 (8ef1bf7a8b);
    apply_nested and activate_contact_sensors are unchanged there.
  • Isaac Sim Version: 6.0.0-rc.22 (urdf importer 3.2.1, urdf-usd-converter 0.1.0)
  • OS: Ubuntu 24.04
  • GPU: RTX 5090
  • CUDA: 13.0
  • GPU Driver: 580.159.03

Suggested fix

Let apply_nested (and the loop in activate_contact_sensors) keep walking into the
children of a rigid body when it is part of an articulation. Or walk the whole tree with
stage.Traverse(), the way the importer already does.

Checklist

  • I have checked that there is no similar issue in the repo (required)
  • I have checked that the issue is not in running Isaac Sim itself and is related to the repo

Acceptance Criteria

  • disable_gravity and activate_contact_sensors apply to every link of a URDF
    articulation, not only the root link.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions