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
Acceptance Criteria
Describe the bug
When I spawn a URDF robot with
UrdfFileCfg, the per-body spawn properties only reach theroot link. Every other link keeps the PhysX default. There is no warning.
Example: I set
RigidBodyPropertiesCfg(disable_gravity=True). My fixed-base arm has 29links, but only the root link gets
disableGravity=True. The other 28 links still fallunder gravity, so the arm droops about 0.2 m at the hand.
max_depenetration_velocityhasthe same problem.
I also set
activate_contact_sensors=True. Only the root link gets the contact report API.A
ContactSensoron any other link then fails to start: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_nestedinisaaclab/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_sensorsinisaaclab/sim/schemas/schemas.pydoes the same. So it sets the root link and stops, and allthe 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 withstage.Traverse()and reachesevery 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:
I get
1/<N>for both, not<N>/<N>.System Info
a4a7602f29(v3.0.0-beta). Same problem onrelease/3.0.0-beta2(8ef1bf7a8b);apply_nestedandactivate_contact_sensorsare unchanged there.3.2.1,urdf-usd-converter0.1.0)Suggested fix
Let
apply_nested(and the loop inactivate_contact_sensors) keep walking into thechildren 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
Acceptance Criteria
disable_gravityandactivate_contact_sensorsapply to every link of a URDFarticulation, not only the root link.