Skip to content

[Bug Report] usd-core and usd-exchange in INSTALL_REQUIRES break Omniverse/Kit-based workflows #5025

@nblauch

Description

@nblauch

[bug] usd-core and usd-exchange in INSTALL_REQUIRES break Omniverse/Kit-based workflows

Describe the bug

source/isaaclab/setup.py (lines 72-76) unconditionally adds usd-core and usd-exchange to INSTALL_REQUIRES:

# Adds OpenUSD dependencies based on architecture for Kit less mode.
INSTALL_REQUIRES += [
    f"usd-core==25.8.0 ; ({SUPPORTED_ARCHS})",
    f"usd-exchange>=2.2 ; ({SUPPORTED_ARCHS_ARM})",
]

The comment indicates these are intended for "Kit less mode," but because they are in INSTALL_REQUIRES, they are also installed when running with Omniverse Kit / IsaacSim.

These packages install their own pxr Python bindings (with compiled C++ .so files) into site-packages/pxr/, which conflict with the pxr modules provided by Omniverse in the extension cache (omni.usd.libs, omni.usd.schema.physx, etc.). The two pxr installations have incompatible Boost.Python type converter registrations, causing all Omniverse extension loading to fail during SimulationApp._start_app().

Note: uninstalling only usd-core is insufficient — usd-exchange ships its own complete pxr package with .so binaries independently.

Steps to reproduce

  1. Local build of IsaacSim 6.0 + IsaacLab develop branch
  2. Run any script that launches SimulationApp (e.g., a training script via python train.py --task ...)
  3. Observe crash during SimulationApp._start_app()
2026-03-14T18:36:50Z [Error] [omni.ext._impl._internal] Failed to import python module pxr.PhysxSchema from .../omni.usd.schema.physx-110.0.7...
RuntimeError: extension class wrapper for base class pxrInternal_v0_25_11__pxrReserved__::UsdAPISchemaBase has not been created yet

2026-03-14T18:36:50Z [Error] [omni.ext._impl._internal] Failed to import python module omni.usd from .../omni.usd-1.13.61...
TypeError: No to_python (by-value) converter found for C++ type: std::vector<pxrInternal_v0_25_11__pxrReserved__::SdfPath, ...>

2026-03-14T18:36:51Z [Error] [omni.ext._impl._internal] Failed to import python module omni.physx from .../omni.physx-110.0.7...
TypeError: No to_python (by-value) converter found for C++ type: pxrInternal_v0_25_11__pxrReserved__::SdfVariability

Coding Error: in DefinePythonClass at line 929 of .../pxr/base/tf/type.cpp -- TfType 'UsdNotice::StageNotice' already has a defined Python type; cannot redefine

RuntimeError: Caught an unknown exception!
> .../isaacsim/simulation_app/simulation_app.py(579)_start_app()
-> self.app.startup("kit", os.environ["CARB_APP_PATH"], args)

Workaround: After installing Isaac Lab, uninstall the conflicting packages:

pip uninstall usd-core usd-exchange

System Info

  • Commit: 2685e7d (develop)
  • Isaac Sim Version: 6.0.0-alpha.132+develop.0.302270d0.local
  • OS: Ubuntu 24.04
  • GPU: NVIDIA RTX PRO 6000 Blackwell Workstation Edition
  • CUDA: 12.8
  • GPU Driver: 590.48.01

Additional context

The root cause is that usd-core and usd-exchange both install pxr/ packages into site-packages with their own compiled C++ bindings. When Omniverse Kit starts, it loads its own pxr modules from the extension cache, but Python's import system finds the site-packages/pxr first (or mixes modules from both locations), resulting in incompatible Boost.Python type converters.

A possible fix would be to move these dependencies into an extras_require group so they are only installed when explicitly requested for Kit-less mode:

EXTRAS_REQUIRE = {
    ...
    "kitless": [
        f"usd-core==25.8.0 ; ({SUPPORTED_ARCHS})",
        f"usd-exchange>=2.2 ; ({SUPPORTED_ARCHS_ARM})",
    ],
}

Users running without Kit would install via pip install -e ".[kitless]".

Note: Made with Claude + Cursor

Checklist

  • I have checked that there is no similar issue in the repo (required)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions