Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6b43f4b
Fix prebundle path conflicts, pin mujoco, remove omni.warp.core, fix …
Apr 16, 2026
9236aae
Exclude isaacsim.pip.newton and omni.warp.core prebundles
Apr 16, 2026
09dcb46
Use latest-develop Docker image for CI
Apr 16, 2026
b7e790c
Deprioritize ALL pip_prebundle paths, not just known extensions
Apr 16, 2026
584bc0e
Sync warp CUDA stream after camera render before torch access
Apr 17, 2026
f484813
Sync warp stream inside RTX renderer before torch depth-clipping
Apr 17, 2026
8832a72
Broaden path sanitization to cover conflicting extension dirs
Apr 17, 2026
68eada5
Demote kit/python/lib site-packages to fix warp 1.13.x import
kellyguo11 Apr 18, 2026
3d566da
Add warp-lang<1.13 pip requirement to fix warp 1.13.x breakage
kellyguo11 Apr 18, 2026
51289da
fix patch for isaac sim simulation manager
kellyguo11 Apr 22, 2026
60620c1
updates
kellyguo11 Apr 22, 2026
f41b744
updates
kellyguo11 Apr 22, 2026
b0acf8b
Updates omni.physics.tensor.api import
kellyguo11 Apr 22, 2026
f0d3c14
revert sync calls in camera/render classes
kellyguo11 Apr 22, 2026
2e5b6f7
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 22, 2026
01fc29f
fix pinocchio import
kellyguo11 Apr 22, 2026
8aec1e6
Merge branch 'kellyg/fix-installation' of github.com:kellyguo11/Isaac…
kellyguo11 Apr 22, 2026
e291317
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 23, 2026
40e7a76
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 23, 2026
29d9c7c
Merge branch 'kellyg/fix-installation' of github.com:kellyguo11/Isaac…
kellyguo11 Apr 23, 2026
a974d07
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 23, 2026
2dec4e8
Bump version to 4.6.13 in extension.toml
kellyguo11 Apr 23, 2026
68aaba8
update postmerge docker tag
kellyguo11 Apr 23, 2026
e484832
Merge branch 'kellyg/fix-installation' of github.com:kellyguo11/Isaac…
kellyguo11 Apr 23, 2026
d2b75e8
revert size check in RTX renderer
kellyguo11 Apr 23, 2026
1735775
update changelog
kellyguo11 Apr 23, 2026
4128150
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 24, 2026
aa424ce
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 24, 2026
b3b1244
fix test failures
kellyguo11 Apr 24, 2026
d671a0a
Merge branch 'kellyg/fix-installation' of github.com:kellyguo11/Isaac…
kellyguo11 Apr 24, 2026
8d142cb
adjust timeouts
kellyguo11 Apr 24, 2026
844f7ec
fix flaky args
kellyguo11 Apr 25, 2026
16bde23
Merge branch 'develop' into kellyg/fix-installation
kellyguo11 Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ env:
ISAACSIM_BASE_IMAGE: 'nvcr.io/nvidian/isaac-sim' # ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }}
# Pinned to the Apr 8 nightly digest that last passed CI, while latest-develop is broken.
# TODO(AntoineRichard): Revert to 'latest-develop' once the nightly is fixed.
ISAACSIM_BASE_VERSION: 'latest-develop@sha256:f085fb5b6899511bb19abdf18121bfc469901334aefb029d0def56d4fef79c58' # ${{ vars.ISAACSIM_BASE_VERSION || '6.0.0' }}
ISAACSIM_BASE_VERSION: 'latest-develop' # ${{ vars.ISAACSIM_BASE_VERSION || '6.0.0' }}
DOCKER_IMAGE_TAG: isaac-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }}
# To run quarantined tests, create a GitHub repo variable named
# RUN_QUARANTINED_TESTS and set it to 'true'. The test-quarantined
Expand Down
3 changes: 1 addition & 2 deletions apps/isaaclab.python.headless.kit
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ log.outputStreamLevel = "Warn"
"omni.physx" = {}
"omni.physx.tensors" = {}
"omni.physx.fabric" = {}
"omni.warp.core" = {}
"usdrt.scenegraph" = {}
"omni.kit.telemetry" = {}
"omni.kit.loop" = {}
Expand Down Expand Up @@ -107,7 +106,7 @@ isaac.startup.ros_bridge_extension = ""
metricsAssembler.changeListenerEnabled = false

# explicitly disable omni.kit.pip_archive to prevent conflicting dependencies
app.extensions.excluded = ["omni.kit.pip_archive"]
app.extensions.excluded = ["omni.kit.pip_archive", "omni.isaac.ml_archive", "isaacsim.pip.newton", "omni.warp.core"]

# Extensions
###############################
Expand Down
2 changes: 1 addition & 1 deletion apps/isaaclab.python.headless.rendering.kit
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ exts."omni.replicator.core".Orchestrator.enabled = false
metricsAssembler.changeListenerEnabled = false

# explicitly disable omni.kit.pip_archive to prevent conflicting dependencies
app.extensions.excluded = ["omni.kit.pip_archive"]
app.extensions.excluded = ["omni.kit.pip_archive", "omni.isaac.ml_archive", "isaacsim.pip.newton", "omni.warp.core"]

[settings.app.python]
# These disable the kit app from also printing out python output, which gets confusing
Expand Down
3 changes: 1 addition & 2 deletions apps/isaaclab.python.kit
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ keywords = ["experience", "app", "usd"]
"omni.uiaudio" = {}
"omni.usd.metrics.assembler.ui" = {}
"omni.usd.schema.metrics.assembler" = {}
"omni.warp.core" = {}

########################
# Isaac Lab Extensions #
Expand Down Expand Up @@ -257,7 +256,7 @@ exts."omni.replicator.core".Orchestrator.enabled = false
omni.rtx.nre.compositing.rendererHints = 3

# explicitly disable omni.kit.pip_archive to prevent conflicting dependencies
app.extensions.excluded = ["omni.kit.pip_archive"]
app.extensions.excluded = ["omni.kit.pip_archive", "omni.isaac.ml_archive", "isaacsim.pip.newton", "omni.warp.core"]

[settings.app.livestream]
outDirectory = "${data}"
Expand Down
2 changes: 1 addition & 1 deletion apps/isaaclab.python.rendering.kit
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ exts."omni.replicator.core".Orchestrator.enabled = false
metricsAssembler.changeListenerEnabled = false

# explicitly disable omni.kit.pip_archive to prevent conflicting dependencies
app.extensions.excluded = ["omni.kit.pip_archive"]
app.extensions.excluded = ["omni.kit.pip_archive", "omni.isaac.ml_archive", "isaacsim.pip.newton", "omni.warp.core"]

[settings.physics]
updateToUsd = false
Expand Down
2 changes: 1 addition & 1 deletion apps/isaaclab.python.xr.openxr.headless.kit
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ cameras_enabled = true

[settings]
# explicitly disable omni.kit.pip_archive to prevent conflicting dependencies
app.extensions.excluded = ["omni.kit.pip_archive"]
app.extensions.excluded = ["omni.kit.pip_archive", "omni.isaac.ml_archive", "isaacsim.pip.newton", "omni.warp.core"]

[settings.app.python]
# These disable the kit app from also printing out python output, which gets confusing
Expand Down
2 changes: 1 addition & 1 deletion apps/isaaclab.python.xr.openxr.kit
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ xr.openxr.components."isaacsim.xr.openxr.hand_tracking".enabled = true
xr.openxr.components."isaacsim.kit.xr.teleop.bridge".enabled = true

# explicitly disable omni.kit.pip_archive to prevent conflicting dependencies
app.extensions.excluded = ["omni.kit.pip_archive"]
app.extensions.excluded = ["omni.kit.pip_archive", "omni.isaac.ml_archive", "isaacsim.pip.newton", "omni.warp.core"]

[settings.app.python]
# These disable the kit app from also printing out python output, which gets confusing
Expand Down
27 changes: 27 additions & 0 deletions docs/source/migration/migrating_to_isaaclab_3-0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1629,6 +1629,33 @@ Deprecated retargeters have been moved to ``isaaclab_teleop.deprecated.openxr.re
compatibility. These will be removed in a future release.


PhysX Tensors API Module Path
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Recent Isaac Sim releases removed the internal ``impl`` submodule of
``omni.physics.tensors`` and now expose the PhysX Tensor API types
(``ArticulationView``, ``RigidBodyView``, ``SimulationView``, etc.) directly
under ``omni.physics.tensors.api``. Importing from the old path raises
``ModuleNotFoundError: No module named 'omni.physics.tensors.impl'`` at import
time.

Isaac Lab has been updated to import from the new path. Downstream code
(custom assets, sensors, or scripts) that imported from the old path must be
updated:

.. code-block:: python

# Before (Isaac Lab 2.x / older Isaac Sim)
import omni.physics.tensors.impl.api as physx

# After (Isaac Lab 3.x / current Isaac Sim)
import omni.physics.tensors.api as physx

The class identities are unchanged — only the module path moved. Type hints
referencing the old path (``omni.physics.tensors.impl.api.ArticulationView``)
should be similarly updated to ``omni.physics.tensors.api.ArticulationView``.


Need Help?
~~~~~~~~~~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Here, we print both the net contact force and the filtered force matrix for each

-------------------------------
Contact sensor @ '/World/envs/env_.*/Robot/LF_FOOT':
view type : <class 'omni.physics.tensors.impl.api.RigidBodyView'>
view type : <class 'omni.physics.tensors.api.RigidBodyView'>
update period (s) : 0.0
number of bodies : 1
body names : ['LF_FOOT']
Expand All @@ -64,7 +64,7 @@ Here, we print both the net contact force and the filtered force matrix for each
Received contact force of: tensor([[[-1.3923e-05, 1.5727e-04, 1.1032e+02]]], device='cuda:0')
-------------------------------
Contact sensor @ '/World/envs/env_.*/Robot/RF_FOOT':
view type : <class 'omni.physics.tensors.impl.api.RigidBodyView'>
view type : <class 'omni.physics.tensors.api.RigidBodyView'>
update period (s) : 0.0
number of bodies : 1
body names : ['RF_FOOT']
Expand All @@ -85,7 +85,7 @@ Notice that even with filtering, both sensors report the net contact force actin

-------------------------------
Contact sensor @ '/World/envs/env_.*/Robot/.*H_FOOT':
view type : <class 'omni.physics.tensors.impl.api.RigidBodyView'>
view type : <class 'omni.physics.tensors.api.RigidBodyView'>
update period (s) : 0.0
number of bodies : 2
body names : ['LH_FOOT', 'RH_FOOT']
Expand Down
4 changes: 2 additions & 2 deletions docs/source/overview/core-concepts/sensors/imu.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ The oscillations in the values reported by the sensor are a direct result of of
.. code-block:: bash

Imu sensor @ '/World/envs/env_.*/Robot/LF_FOOT':
view type : <class 'omni.physics.tensors.impl.api.RigidBodyView'>
view type : <class 'omni.physics.tensors.api.RigidBodyView'>
update period (s) : 0.0
number of sensors : 1

Expand All @@ -71,7 +71,7 @@ The oscillations in the values reported by the sensor are a direct result of of
Received angular acceleration: tensor([[-0.0389, -0.0262, -0.0045]], device='cuda:0')
-------------------------------
Imu sensor @ '/World/envs/env_.*/Robot/RF_FOOT':
view type : <class 'omni.physics.tensors.impl.api.RigidBodyView'>
view type : <class 'omni.physics.tensors.api.RigidBodyView'>
update period (s) : 0.0
number of sensors : 1

Expand Down
3 changes: 3 additions & 0 deletions source/isaaclab/docs/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ Changed
global (world-frame) and local (body-frame) buffers. A new
:meth:`~isaaclab.utils.wrench_composer.WrenchComposer.compose_to_body_frame` method rotates global forces/torques
into the body frame at apply time using the current body orientation, then sums with local forces/torques.
* Updated imports of the PhysX tensors API in the ray caster sensors from
``omni.physics.tensors.impl.api`` to ``omni.physics.tensors.api`` to track the upstream
Isaac Sim module relocation (the ``impl`` submodule was removed).

Deprecated
^^^^^^^^^^
Expand Down
73 changes: 73 additions & 0 deletions source/isaaclab/isaaclab/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,79 @@
"""Package containing the core framework."""

import os
import sys


def _deprioritize_prebundle_paths():
"""Move Isaac Sim ``pip_prebundle`` and known conflicting extension directories to the end of ``sys.path``.

Isaac Sim's ``setup_python_env.sh`` injects ``pip_prebundle`` directories
onto ``PYTHONPATH``. These contain older copies of packages like torch,
warp, and nvidia-cudnn that shadow the versions installed by Isaac Lab,
causing CUDA runtime errors.

Additionally, certain Isaac Sim kit extensions (such as ``omni.warp.core``)
bundle their own copies of Python packages that conflict with pip-installed
versions. When loaded by the extension system these paths can appear on
``sys.path`` before ``site-packages``, leading to version mismatches.

Rather than removing these paths entirely (which would break packages like
``sympy`` that only exist in the prebundle), this function moves them to
the **end** of ``sys.path`` so that pip-installed packages in
``site-packages`` take priority.

The ``PYTHONPATH`` environment variable is also rewritten so that child
processes inherit the corrected ordering.
"""

# Extension directory fragments that are known to ship Python packages
# which conflict with Isaac Lab's pip-installed versions.
_CONFLICTING_EXT_FRAGMENTS = (
"omni.warp.core",
"omni.isaac.ml_archive",
"omni.isaac.core_archive",
"omni.kit.pip_archive",
"isaacsim.pip.newton",
)

def _should_demote(path: str) -> bool:
norm = path.replace("\\", "/").lower()
if "pip_prebundle" in norm:
return True
for frag in _CONFLICTING_EXT_FRAGMENTS:
if frag.lower() in norm:
return True
return False

# Partition: keep non-conflicting in place, collect conflicting.
clean = []
demoted = []
for p in sys.path:
if _should_demote(p):
demoted.append(p)
else:
clean.append(p)

if not demoted:
return

# Rebuild sys.path: originals first, then demoted at the very end.
sys.path[:] = clean + demoted

# Rewrite PYTHONPATH with the same ordering for subprocesses.
if "PYTHONPATH" in os.environ:
parts = os.environ["PYTHONPATH"].split(os.pathsep)
env_clean = []
env_demoted = []
for p in parts:
if _should_demote(p):
env_demoted.append(p)
else:
env_clean.append(p)
os.environ["PYTHONPATH"] = os.pathsep.join(env_clean + env_demoted)


_deprioritize_prebundle_paths()

# Conveniences to other module directories via relative paths.
ISAACLAB_EXT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../"))
Expand Down
9 changes: 9 additions & 0 deletions source/isaaclab/isaaclab/app/app_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,15 @@ def __init__(self, launcher_args: argparse.Namespace | dict | None = None, **kwa
self._create_app()
# Load IsaacSim extensions
self._load_extensions()

# Re-run path sanitization. Kit and its extensions may have inserted
# additional ``pip_prebundle`` or conflicting extension directories onto
# ``sys.path`` during startup. A second pass ensures pip-installed
# packages still take priority over bundled copies.
from isaaclab import _deprioritize_prebundle_paths

_deprioritize_prebundle_paths()

# Hide the stop button in the toolbar
self._hide_stop_button()
# Set settings from the given rendering mode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,7 @@ def body_incoming_joint_wrench_b(self) -> wp.array:
underlying `PhysX Tensor API`_.
.. _PhysX documentation: https://nvidia-omniverse.github.io/PhysX/physx/5.5.1/docs/Articulations.html#link-incoming-joint-force
.. _PhysX Tensor API: https://docs.omniverse.nvidia.com/kit/docs/omni_physics/latest/extensions/runtime/source/omni.physics.tensors/docs/api/python.html#omni.physics.tensors.impl.api.ArticulationView.get_link_incoming_joint_force
.. _PhysX Tensor API: https://docs.omniverse.nvidia.com/kit/docs/omni_physics/latest/extensions/runtime/source/omni.physics.tensors/docs/api/python.html#omni.physics.tensors.api.ArticulationView.get_link_incoming_joint_force
"""
raise NotImplementedError

Expand Down
73 changes: 73 additions & 0 deletions source/isaaclab/isaaclab/cli/commands/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,59 @@ def _install_system_deps() -> None:
run_command(["sudo"] + cmd if os.geteuid() != 0 else cmd)


def _torch_first_on_sys_path_is_prebundle(python_exe: str, *, env: dict[str, str]) -> bool:
"""Return True when the first ``torch`` on ``sys.path`` comes from a prebundle directory.

Checks whether the first directory on ``sys.path`` that contains a
``torch`` package lives under a ``pip_prebundle`` path (e.g.
``omni.isaac.ml_archive/pip_prebundle``). This catches the prebundle
regardless of whether the extension lives under ``exts/``,
``extsDeprecated/``, or any other search path.

Does not import ``torch`` (that can fail on missing ``libcudnn`` while the
prebundle still appears earlier on ``sys.path`` than ``site-packages``).
"""
probe = """import os, sys
for p in sys.path:
if not p:
continue
if os.path.isfile(os.path.join(p, "torch", "__init__.py")):
norm = os.path.normpath(p)
sys.exit(1 if "pip_prebundle" in norm else 0)
sys.exit(0)
"""
result = run_command(
[python_exe, "-c", probe],
env=env,
check=False,
capture_output=True,
text=True,
)
return result.returncode == 1


def _maybe_uninstall_prebundled_torch(
python_exe: str,
pip_cmd: list[str],
using_uv: bool,
*,
probe_env: dict[str, str],
) -> None:
"""Uninstall pip torch stack when ``sys.path`` would load ``torch`` from a prebundle first."""
if not _torch_first_on_sys_path_is_prebundle(python_exe, env=probe_env):
return
print_info(
"The first ``torch`` on ``sys.path`` is under a prebundle directory (e.g. "
"``omni.isaac.ml_archive/pip_prebundle``). Uninstalling pip "
"``torch``/``torchvision``/``torchaudio`` before continuing."
)
uninstall_flags = ["-y"] if not using_uv else []
run_command(
pip_cmd + ["uninstall"] + uninstall_flags + ["torch", "torchvision", "torchaudio"],
check=False,
)


def _ensure_cuda_torch() -> None:
"""Ensure correct PyTorch and CUDA versions are installed."""
python_exe = extract_python_exe()
Expand Down Expand Up @@ -389,6 +442,17 @@ def _repoint_prebundle_packages() -> None:
if not prebundled.exists() and not prebundled.is_symlink():
continue

# The 'nvidia' directory is a Python namespace package shared across many
# distributions (nvidia-cudnn-cu12, nvidia-cublas-cu12, nvidia-srl, …).
# When using Isaac Sim's built-in Python, site-packages/nvidia only contains
# 'srl'; replacing the whole prebundle nvidia/ with that symlink strips away
# the CUDA shared libraries (libcudnn.so.9, etc.) that torch needs.
# Only repoint the nvidia namespace when the target actually provides the
# CUDA subpackages (cudnn is the minimal required indicator).
if pkg_name == "nvidia" and not (venv_pkg / "cudnn").exists():
print_debug(f"Skipping repoint of {prebundled}: {venv_pkg} lacks CUDA subpackages (cudnn missing).")
continue

try:
if prebundled.is_symlink():
if prebundled.resolve() == venv_pkg.resolve():
Expand Down Expand Up @@ -543,6 +607,12 @@ def command_install(install_type: str = "all") -> None:
pip_cmd = get_pip_command(python_exe)
using_uv = pip_cmd[0] == "uv"

# Probe with the user's original PYTHONPATH (before pip-time filtering) so we detect
# Isaac Sim's setup_python_env.sh ordering that prefers extsDeprecated/ml_archive.
probe_env = {**os.environ}
if saved_pythonpath is not None:
probe_env["PYTHONPATH"] = saved_pythonpath

try:
# Upgrade pip first to avoid compatibility issues (skip when using uv).
if not using_uv:
Expand All @@ -552,6 +622,9 @@ def command_install(install_type: str = "all") -> None:
# Pin setuptools to avoid issues with pkg_resources removal in 82.0.0.
run_command(pip_cmd + ["install", "setuptools<82.0.0"])

# Drop pip-installed torch if Isaac Sim's deprecated ML prebundle would shadow it.
_maybe_uninstall_prebundled_torch(python_exe, pip_cmd, using_uv, probe_env=probe_env)

# Install Isaac Sim if requested.
if install_isaacsim:
_install_isaacsim()
Expand Down
7 changes: 7 additions & 0 deletions source/isaaclab/isaaclab/sensors/camera/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,13 @@ def _update_buffers_impl(self, env_mask: wp.array):
self._renderer.update_transforms()
self._renderer.render(self._render_data)

# Synchronize warp's CUDA stream before handing GPU buffers to torch.
# render() launches warp kernels that write into the output tensors;
# without an explicit sync, torch may read the buffers on a different
# CUDA stream before the warp kernels finish, causing illegal-memory-
# access errors (observed with newer Isaac Sim nightly images).
wp.synchronize()
Comment thread
kellyguo11 marked this conversation as resolved.
Outdated

self._renderer.read_output(self._render_data, self._data)

"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import trimesh
import warp as wp

import omni.physics.tensors.impl.api as physx
import omni.physics.tensors.api as physx

import isaaclab.sim as sim_utils
from isaaclab.sim.views import XformPrimView
Expand Down
Loading
Loading