-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Fix converted assets spawning without physics, and install the standalone importers by default #6935
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix converted assets spawning without physics, and install the standalone importers by default #6935
Changes from 5 commits
56ecfd7
54940e4
79b38c7
ed60409
f97e1b2
d5e4cb9
2f6bf12
153bdaf
8817a8d
ecdc05f
d8d4996
021f83b
bd283f2
480c68d
e1fcd0b
a78748f
820b8b7
cf4b624
f3652bf
25b7726
adb68ef
4ba8c8e
f947ebb
3b89155
b4c27af
27cb826
33fbc2d
3a4cea8
eff5d53
f38ef4b
e7cc57d
574bd9f
60b37dd
b48a6c1
d7d1adf
77e6abd
223ea16
2cd1a8f
36c5514
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -25,8 +25,8 @@ use the Omniverse Kit to edit the asset and export it to other file formats. Isa | |
| these importers by default. They can also be enabled manually in Omniverse Kit. | ||
|
|
||
| Isaac Lab's URDF and MJCF converter utilities first use the importer APIs from | ||
| Isaac Sim when the full runtime is installed. In kit-less environments, install | ||
| the standalone importer wheel as described in | ||
| Isaac Sim when the full runtime is installed. In kit-less environments they use the | ||
| standalone importers that ship with Isaac Lab, as described in | ||
| :ref:`installation-standalone-importers` below. | ||
| The Kit visualizer and GUI import dialogs still require an Omniverse Kit runtime. | ||
|
|
||
|
|
@@ -43,18 +43,23 @@ For more details on instanceable assets, please check the Isaac Sim `documentati | |
| Standalone URDF/MJCF importers | ||
| ------------------------------ | ||
|
|
||
| The URDF and MJCF converter scripts can run without Isaac Sim when the standalone | ||
| ``isaacsim-asset-isolated`` wheel is installed in the active environment. The wheel is not | ||
| published on PyPI, so replace ``PACKAGE_INDEX_URL`` with the package index that hosts it: | ||
| The URDF and MJCF converter scripts run without Isaac Sim, using the standalone | ||
| ``isaacsim-asset-isolated`` importers. They ship in the ``importers`` extra, which is not | ||
| installed by default because it cannot share an environment with Isaac Sim -- both provide the | ||
| same ``isaacsim.asset`` importers. Install it from a source checkout: | ||
|
|
||
| .. code-block:: bash | ||
|
|
||
| uv pip install "isaacsim-asset-isolated>=6.0,<6.1" \ | ||
| --extra-index-url "PACKAGE_INDEX_URL" | ||
| ./isaaclab.sh --install 'newton,rl[rsl-rl],importers' | ||
|
|
||
| After installing the wheel, run conversion in the kit-less environment. Optionally pass | ||
| ``--viz newton`` (or ``rerun`` / ``viser``) to preview the converted asset in a kit-less | ||
| Isaac Lab visualizer: | ||
| or into an environment built from the published wheel: | ||
|
|
||
| .. code-block:: bash | ||
|
|
||
| uv pip install 'isaaclab[importers]' | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. AI-generated review — documentation correctness: this published-wheel flow runs outside the source checkout, so it does not inherit the repository
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removed. The published-wheel command is gone: it cannot run today anyway, since the released The section now leads with |
||
|
|
||
| Run conversion in the kit-less environment. Optionally pass ``--viz newton`` (or ``rerun`` / | ||
| ``viser``) to preview the converted asset in a kit-less Isaac Lab visualizer: | ||
|
|
||
| .. code-block:: bash | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -67,11 +67,11 @@ dependencies = [ | |||||
| "pin ; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')", | ||||||
| "pin-pink==3.3.0 ; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')", | ||||||
| "daqp==0.8.5 ; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')", | ||||||
| # OpenUSD (kit-less mode). Both packages vendor a complete ``pxr`` runtime, so | ||||||
| # they must never co-install: usd-core supplies pxr where it has wheels (x86_64), | ||||||
| # usd-exchange supplies it on aarch64 (where usd-core has no wheel). | ||||||
| "usd-core>=25.11,<26.0 ; platform_machine == 'x86_64' or platform_machine == 'AMD64'", | ||||||
| "usd-exchange>=2.2 ; platform_machine == 'aarch64'", | ||||||
| # OpenUSD (kit-less mode). Use the same provider required by the URDF and MJCF importer | ||||||
| # packages so another complete ``pxr`` runtime cannot co-install with it. Two providers in | ||||||
| # one environment overwrite each other's files, and removing either then breaks ``pxr``. | ||||||
| # usd-exchange 2.3.0 vendors USD 25.5, matching the Isaac Sim 6.0 wheel stack. | ||||||
| "usd-exchange==2.3.0", | ||||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're removing core completely in favor of exchange. Is there anything we're loosing? Is 2.3.0 OV libraries friendly?
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There should be no? There's a commit to update usdex to 26.08. I checked with author and it's expected this month if everything goes well. |
||||||
| # avoid broken hf-xet pre-release cached on NVIDIA Artifactory | ||||||
| "hf-xet>=1.4.1,<2.0.0 ; platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'aarch64'", | ||||||
| # ----- tasks ----- | ||||||
|
|
@@ -88,9 +88,19 @@ dependencies = [ | |||||
| # ----- newton (default physics engine) ----- | ||||||
| # Loose bound so the wheel co-resolves with isaacsim's newton[sim]==1.2.0 pin; the | ||||||
| # exact git commit is forced via [tool.uv].override-dependencies (uv sync only). | ||||||
| # The importers extra carries the mesh-processing deps (coacd, fast-simplification, | ||||||
| # ...) that honoring USD-authored ``physics:approximation`` requires. | ||||||
| "newton[sim,importers]>=1.2.0", | ||||||
| "newton[sim]>=1.2.0", | ||||||
| # Import and mesh-processing packages used by Newton, including the ones that honoring | ||||||
| # USD-authored ``physics:approximation`` requires. Keep these explicit instead of selecting | ||||||
| # newton[importers], whose standalone USD dependency would overlap with usd-exchange. | ||||||
| "requests>=2.25.0", | ||||||
| "scipy>=1.11.0", | ||||||
| "coacd>=1.0.7", | ||||||
| "fast-simplification>=0.1.11", | ||||||
| "alphashape>=1.3.1", | ||||||
| "meshio>=5.3.5", | ||||||
| "pycollada>=0.9", | ||||||
| "resolve-robotics-uri-py>=0.4.0", | ||||||
| "open3d>=0.19.0 ; python_version < '3.13' and (sys_platform != 'linux' or platform_machine != 'aarch64')", | ||||||
| # Loose bound co-resolves with isaacsim's ==0.2.0; the override below forces >=0.4.1. | ||||||
| "newton-usd-schemas>=0.2.0", | ||||||
| "PyOpenGL-accelerate>=3.1.0", | ||||||
|
|
@@ -150,6 +160,19 @@ rerun = [ | |||||
|
|
||||||
| isaacsim = ["isaacsim[all,extscache]==6.0.1.0"] | ||||||
|
|
||||||
| # Packages that cannot share an environment with Isaac Sim, because they provide the same | ||||||
| # import paths it does. This is not "everything a kit-less setup installs" -- Newton, the RL | ||||||
| # frameworks and the visualizers work with and without Isaac Sim and stay in the base set. | ||||||
| # Membership rule: it belongs here only when co-installing it with Isaac Sim breaks imports. | ||||||
| # | ||||||
| # * isaacsim-asset-isolated -- standalone URDF/MJCF importers. Contributes to the | ||||||
| # ``isaacsim`` namespace, so alongside a real Isaac Sim it displaces the Kit extension | ||||||
| # serving the same import and conversion fails with ``No module named 'isaacsim.asset'``. | ||||||
| # | ||||||
| # Runtime-only incompatibilities (ovrtx, ovphysx) do NOT belong here: they install fine | ||||||
| # beside Isaac Sim and are rejected at launch by ``sim_launcher._validate_runtime``. | ||||||
| importers = ["isaacsim-asset-isolated>=6.0,<6.1"] | ||||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. AI-generated review — comment hygiene: the 12-line preamble repeats the user guide, changelog, and PR rationale. Keep only the durable operational invariant next to the extra, for example: “Standalone URDF/MJCF importers; conflicts with Isaac Sim because both provide
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Trimmed to the two lines you suggested. |
||||||
|
|
||||||
| ov = ["ovphysx==0.5.9", "ovrtx>=0.4.0,<0.5.0", "ovstage==0.1.0.346039"] | ||||||
| ovphysx = ["ovphysx==0.5.9", "ovstage==0.1.0.346039"] | ||||||
| ovrtx = ["ovrtx>=0.4.0,<0.5.0", "ovstage==0.1.0.346039"] | ||||||
|
|
@@ -200,6 +223,7 @@ leapp = [ | |||||
| # ``test_version_single_source`` fails CI if they drift. | ||||||
| [tool.isaaclab.versions] | ||||||
| isaacsim = "6.0.1.0" | ||||||
| usd_exchange = "2.3.0" | ||||||
| torch = "2.11.0" | ||||||
| torchvision = "0.26.0" | ||||||
| torchaudio = "2.11.0" | ||||||
|
|
@@ -343,6 +367,7 @@ markers = [ | |||||
| "benchmark: test covers the Isaac Lab benchmark framework and infrastructure", | ||||||
| "rendering: test exercises the rendering / camera / visualizer pipeline", | ||||||
| "smoke: tests for core installation, task, and RL functionality", | ||||||
| "importers: test must pass inside the Kit-less container, which has no Isaac Sim runtime", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The new converter tests and container selection use
Suggested change
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed in 2f6bf12. The marker is now registered as
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟡 Warning · Implementation — Registered marker name does not match tests The tests and
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed in 2f6bf12 — registered as |
||||||
| ] | ||||||
|
|
||||||
| # Add pypi.nvidia.com so that `uv pip install isaaclab[isaacsim]` works without --extra-index-url. | ||||||
|
|
@@ -388,7 +413,7 @@ override-dependencies = [ | |||||
| "numpy>=2", | ||||||
| "mujoco~=3.11.0", | ||||||
| "mujoco-warp~=3.11.0", | ||||||
| "newton[sim,importers] @ git+https://github.com/newton-physics/newton.git@release-1.5", | ||||||
| "newton[sim] @ git+https://github.com/newton-physics/newton.git@release-1.5", | ||||||
| # Force the Newton-matched schemas over isaacsim's ==0.2.0 pin. | ||||||
| "newton-usd-schemas>=0.4.1", | ||||||
| "torch==2.11.0", | ||||||
|
|
@@ -408,6 +433,8 @@ conflicts = [ | |||||
| [{ extra = "teleop" }, { extra = "ovphysx" }], | ||||||
| [{ extra = "isaacsim" }, { extra = "ov" }], | ||||||
| [{ extra = "isaacsim" }, { extra = "ovphysx" }], | ||||||
| # both supply the ``isaacsim.asset`` importers; together the wheel shadows the Kit extension | ||||||
| [{ extra = "isaacsim" }, { extra = "importers" }], | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟡 Warning · Design Architecture — teleop does not inherit the importers conflict The
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed in 2f6bf12: added Note that after merging develop the |
||||||
| ] | ||||||
| python-preference = "only-managed" | ||||||
| package = false | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| Added | ||
| ^^^^^ | ||
|
|
||
| * Added an ``importers`` extra carrying the standalone URDF and MJCF importers, so conversion | ||
| works without Isaac Sim. It cannot be combined with the ``isaacsim`` extra, which ships its own | ||
| copies of the same importers. | ||
|
|
||
| * Added :attr:`~isaaclab.sim.converters.AssetConverterBaseCfg.physics_variant` to choose which | ||
| ``"Physics"`` variant the URDF and MJCF converters select on the generated USD file. | ||
|
|
||
| Fixed | ||
| ^^^^^ | ||
|
|
||
| * Fixed URDF and MJCF conversion producing assets with no joints, articulation roots, or mass | ||
| properties. | ||
|
|
||
| * Fixed MJCF conversion failing with ``Cannot find a valid schema for 'MjcSceneAPI'`` when another | ||
| package queried a USD schema first. | ||
|
|
||
| * Fixed :meth:`~isaaclab.utils.dict.class_to_dict` expanding enum values into their internal | ||
| members, which wrote unusable entries into serialized configurations. | ||
|
|
||
| Changed | ||
| ^^^^^^^ | ||
|
|
||
| * Changed :func:`~isaaclab.sim.utils.select_usd_variants` to raise for a variant set listed in | ||
| :obj:`~isaaclab.sim.utils.REQUIRED_VARIANT_SETS` that is absent or does not offer the requested | ||
| variant. Other variant sets still log a warning and continue. | ||
|
|
||
| * Changed ``./isaaclab.sh --install`` to reject extras that the root ``pyproject.toml`` declares | ||
| conflicting, instead of installing a combination ``uv sync`` refuses. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| Fixed | ||
| ^^^^^ | ||
|
|
||
| * Fixed installation failures caused by overlapping standalone USD providers by using | ||
| ``usd-exchange`` on all supported platforms and installing required Newton mesh-processing | ||
| packages directly. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -674,15 +674,17 @@ def _install_isaacsim() -> None: | |
| # core set. | ||
| VALID_EXTRA_FEATURES: set[str] = { | ||
| "contrib", | ||
| "importers", | ||
| "newton", | ||
| "ov", | ||
| "rl", | ||
| "tetrahedralization", | ||
| "visualizer", | ||
| } | ||
|
|
||
| # Extra features excluded from the automatic ``-i all`` / ``-i`` install. | ||
| MANUAL_EXTRA_FEATURES: set[str] = {"contrib", "ov", "tetrahedralization"} | ||
| # Extra features excluded from the automatic ``-i all`` / ``-i`` install. ``importers`` is | ||
| # here because it cannot coexist with Isaac Sim, so it must be asked for deliberately. | ||
| MANUAL_EXTRA_FEATURES: set[str] = {"contrib", "importers", "ov", "tetrahedralization"} | ||
|
|
||
|
|
||
| def split_install_items(install_type: str) -> list[str]: | ||
|
|
@@ -817,6 +819,11 @@ def _install_extra_feature(feature_name: str, selector: str = "") -> None: | |
| """ | ||
| if feature_name == "contrib": | ||
| _install_contrib_extra_dependencies(selector) | ||
| elif feature_name == "importers": | ||
| if selector: | ||
| print_warning(f"'importers' does not support selectors (got '{selector}').") | ||
| print_info("Installing the kit-less stand-ins for Isaac Sim (URDF/MJCF importers)...") | ||
| _install_root_extra("importers") | ||
| elif feature_name == "newton": | ||
| if selector: | ||
| print_warning(f"'newton' does not support selectors (got '{selector}').") | ||
|
|
@@ -1097,6 +1104,48 @@ def _repoint_prebundle_packages() -> None: | |
| ) | ||
|
|
||
|
|
||
| def _requested_root_extras( | ||
| install_isaacsim: bool, optional_submodules: list[str], extra_features: list[tuple[str, str]] | ||
| ) -> set[str]: | ||
| """Return the root extras this install would apply. | ||
|
|
||
| Tokens are not extras: ``ov[ovrtx]`` installs ``ovrtx``, not ``ov``. | ||
| """ | ||
| extras = set(optional_submodules) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 Suggestion · Implementation — Submodule tokens are not mapped to root extras
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed in 2f6bf12: optional submodule tokens are expanded through Verified at the time: |
||
| if install_isaacsim: | ||
| extras.add("isaacsim") | ||
| for feature, selector in extra_features: | ||
| if feature == "ov": | ||
| chosen = {item.strip().lower() for item in selector.split(",") if item.strip()} | ||
| extras |= {"ovphysx", "ovrtx"} if "all" in chosen else chosen | ||
| else: | ||
| extras.add(feature) | ||
| return extras | ||
|
|
||
|
|
||
| def _reject_conflicting_extras(requested: set[str]) -> None: | ||
| """Reject extras that ``[tool.uv].conflicts`` declares incompatible. | ||
|
|
||
| That table only binds a resolver, and each feature here installs in its own pip pass, so | ||
| nothing else would catch the combination. | ||
|
|
||
| Args: | ||
| requested: Names of the extras this install would apply. | ||
|
|
||
| Raises: | ||
| SystemExit: When the request covers every extra of a declared conflict. | ||
| """ | ||
| conflicts = _load_root_pyproject().get("tool", {}).get("uv", {}).get("conflicts", []) | ||
| for conflict in conflicts: | ||
| extras = {entry["extra"] for entry in conflict if "extra" in entry} | ||
| if len(extras) > 1 and extras <= requested: | ||
| names = ", ".join(f"'{extra}'" for extra in sorted(extras)) | ||
| raise SystemExit( | ||
| f"error: {names} cannot be installed together; the root pyproject.toml declares" | ||
| " them conflicting. Drop one of the tokens." | ||
| ) | ||
|
|
||
|
|
||
| def command_install(install_type: str = "all") -> None: | ||
| """Install Isaac Lab extensions and optional extras. | ||
|
|
||
|
|
@@ -1195,6 +1244,8 @@ def append_submodules_once(package_dirs: tuple[str, ...]) -> None: | |
| valid = sorted(OPTIONAL_ISAACLAB_SUBMODULES) + sorted(VALID_EXTRA_FEATURES) + ["isaacsim"] | ||
| print_warning(f"Unknown install token '{name}'. Valid values: {', '.join(valid)}. Skipping.") | ||
|
|
||
| _reject_conflicting_extras(_requested_root_extras(install_isaacsim, requested_optional_submodules, extra_features)) | ||
|
|
||
| # Configure extra package indexes for NVIDIA and MuJoCo wheels. | ||
| os.environ.setdefault("UV_EXTRA_INDEX_URL", "https://pypi.nvidia.com") | ||
| os.environ.setdefault("PIP_EXTRA_INDEX_URL", "https://pypi.nvidia.com") | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AI-generated review — comment hygiene: this five-line narrative is longer than the behavior it protects and includes agentic maintenance instructions (“Adding coverage is … nothing here”). Reduce it to the functional constraint, e.g. “Collect marked files explicitly because importing the full source tree requires Isaac Sim; install pytest only in this disposable container.”