Skip to content

fix(isaac): resolve default Franka USD for Isaac Sim 6.0 asset move (closes #110)#111

Merged
cagataycali merged 1 commit into
strands-labs:mainfrom
yinsong1986:fix/isaac6-franka-usd-path
Jun 18, 2026
Merged

fix(isaac): resolve default Franka USD for Isaac Sim 6.0 asset move (closes #110)#111
cagataycali merged 1 commit into
strands-labs:mainfrom
yinsong1986:fix/isaac6-franka-usd-path

Conversation

@yinsong1986

Copy link
Copy Markdown
Contributor

What changed

NVIDIA relocated the bundled Franka Panda asset in Isaac Sim 6.0, from the
4.x path {assets_root}/Isaac/Robots/Franka/franka.usd to a vendor folder at
{assets_root}/Isaac/Robots/FrankaRobotics/FrankaPanda/franka.usd. Every
example that loads the default Franka USD 404'd on 6.0 because the sub-path was
hardcoded to the stale 4.x layout.

This PR makes the default Franka resolution version-robust in all three
affected helpers:

  • examples/isaac_gs/scene.py_default_franka_usd() (the reproduced failure)
  • examples/libero/run_isaac.py_resolve_robot_asset()
  • examples/libero/run_isaac_agent.py_resolve_robot_asset()

Resolution logic (shared shape in each file):

  1. HEAD-probe the 6.0 vendor path first (current target runtime).
  2. Fall back to the legacy 4.x path.
  3. On a definitive 404 of all HTTP candidates, raise with a clear
    pass --robot-usd/--robot-urdf (resp. robot_usd=...) hint naming the
    tried paths.
  4. A non-HTTP root (e.g. an omniverse:// Nucleus path that can't be
    HEAD-probed) is treated as inconclusive and degrades to the 6.0
    candidate rather than failing on a probe it can't perform — add_robot
    then surfaces a clear error if it's wrong.

Secondary (also from the issue)

render_demo exited 0 even when build_default_scene raised, because
Isaac's SimulationApp fast-shutdown swallows the non-zero exit. The
__main__ entry point now catches, logs, flushes, and forces a non-zero exit
via os._exit(1) after teardown, so CI/scripts notice the failure.

Why

The 4.x → 6.0 asset move is permanent and the bucket layout differs by release,
so a single hardcoded sub-path can't be correct for both. HEAD-probing the
candidates makes the examples run out-of-the-box on whichever Isaac Sim version
the host has, while keeping the explicit --robot-usd / --robot-urdf
overrides as the escape hatch.

Test surface

  • hatch run lintpass (black/isort/flake8 over strands_robots_sim + examples).
  • hatch run test203 passed, 33 skipped (skips are GPU/Isaac-gated).
  • Resolver logic validated against the public Omniverse content bucket:
    200  .../Assets/Isaac/6.0/Isaac/Robots/FrankaRobotics/FrankaPanda/franka.usd   (6.0 — selected)
    404  .../Assets/Isaac/6.0/Isaac/Robots/Franka/franka.usd                        (legacy 4.x)
    None .../omniverse://server/foo.usd                                             (non-HTTP — inconclusive)
    
    _resolve_* correctly selects the 6.0 path.
  • AST parse-check on all four edited files.

No new test failures introduced. (The 7 environmental failures in
test_rendering.py / test_policy_runner.py mentioned in the issue context
are not part of this repo's hatch run test slice — that slice is the
strands_robots_sim/isaac/tests/ Isaac unit/lazy-import suite, which is fully
green here.)

Acceptance criteria (from #110)

  • Update the default Franka USD to the 6.0 vendor path in all three helpers.
  • Make it version-robust: try the 6.0 path, fall back to legacy, HEAD-probe.
  • Emit a clear "asset not found — pass --robot-usd/--robot-urdf" hint on a definitive miss.
  • Secondary: propagate render_demo failure to the process exit status.

Out-of-scope follow-ups

  • None required for this defect. The HEAD-probe adds at most two short HTTP
    round-trips on the default path; if that ever becomes a concern on
    cold-start-sensitive CI, a small per-process cache of the resolved root could
    be a separate optimization.

Closes #110.

…loses strands-labs#110)

NVIDIA relocated the bundled Franka Panda asset in Isaac Sim 6.0 from
`{assets_root}/Isaac/Robots/Franka/franka.usd` (4.x) to
`{assets_root}/Isaac/Robots/FrankaRobotics/FrankaPanda/franka.usd`.
Every example loading the default Franka USD 404'd on 6.0 because the
hardcoded sub-path was the stale 4.x one.

Make the default Franka resolution version-robust in all three helpers
(`examples/isaac_gs/scene.py::_default_franka_usd`,
`examples/libero/run_isaac.py::_resolve_robot_asset`,
`examples/libero/run_isaac_agent.py::_resolve_robot_asset`): HEAD-probe
the 6.0 vendor path first, fall back to the legacy 4.x path, and on a
definitive miss raise a clear "pass --robot-usd/--robot-urdf" hint. A
non-HTTP root (e.g. an `omniverse://` Nucleus path) is inconclusive, so
it degrades to the 6.0 candidate rather than failing on a probe it can't
perform. Verified against the public Omniverse bucket: the 6.0 path
returns 200, the legacy path 404s.

Secondary: propagate render_demo failures to the process exit status.
Isaac's SimulationApp fast-shutdown swallowed the non-zero exit, so a
failed build_default_scene exited 0 and hid the failure from CI. The
__main__ entry point now catches, logs, and forces a non-zero exit via
os._exit after teardown.
@yinsong1986 yinsong1986 requested a review from cagataycali June 18, 2026 10:42
@cagataycali cagataycali merged commit 23437ce into strands-labs:main Jun 18, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Isaac examples broken on Isaac Sim 6.0: default Franka USD path 404s (asset moved to Isaac/Robots/FrankaRobotics/FrankaPanda)

2 participants