Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 13 additions & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -772,13 +772,25 @@ jobs:
with:
fetch-depth: 1
lfs: true
# Single source of truth: read the OV runtime pins from [tool.isaaclab.versions].
- name: Resolve OV runtime pins from pyproject
id: ov_pins
run: |
PINS=$(python3 <<'PY'
import re
block = re.search(r"^\[tool\.isaaclab\.versions\]\n(.*?)(?:\n\[|\Z)", open("pyproject.toml").read(), re.S | re.M).group(1)
vals = dict(re.findall(r'(\w+)\s*=\s*"([^"]+)"', block))
print(f"ovphysx=={vals['ovphysx']} ovrtx{vals['ovrtx']}")
PY
)
echo "pins=$PINS" >> "$GITHUB_OUTPUT"
- uses: ./.github/actions/run-package-tests
with:
image-tag: ${{ needs.config.outputs.ci_image_tag }}
isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }}
isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }}
filter-pattern: "isaaclab_tasks"
extra-pip-packages: "ovrtx ovphysx==0.4.13"
extra-pip-packages: ${{ steps.ov_pins.outputs.pins }}
include-files: >-
test_rendering_cartpole_kitless.py,
test_rendering_dexsuite_kuka_homo_kitless.py,
Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/daily-compatibility.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,19 @@ jobs:
fetch-depth: 1
lfs: true

# Single source of truth: read the OV runtime pins from [tool.isaaclab.versions].
- name: Resolve OV runtime pins from pyproject
id: ov_pins
run: |
PINS=$(python3 <<'PY'
import re
block = re.search(r"^\[tool\.isaaclab\.versions\]\n(.*?)(?:\n\[|\Z)", open("pyproject.toml").read(), re.S | re.M).group(1)
vals = dict(re.findall(r'(\w+)\s*=\s*"([^"]+)"', block))
print(f"ovphysx=={vals['ovphysx']} ovrtx{vals['ovrtx']}")
PY
)
echo "pins=$PINS" >> "$GITHUB_OUTPUT"

- name: Build Docker Image
uses: ./.github/actions/docker-build
with:
Expand All @@ -111,7 +124,7 @@ jobs:
image-tag: ${{ env.DOCKER_IMAGE_TAG }}
pytest-options: ""
filter-pattern: "isaaclab_tasks"
extra-pip-packages: "ovrtx ovphysx==0.4.13"
extra-pip-packages: ${{ steps.ov_pins.outputs.pins }}

- name: Copy All Test Results from IsaacLab Tasks Container
run: |
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/license-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,10 @@ jobs:
ISAACSIM_ACCEPT_EULA: YES
run: |
uv sync --extra all
# Isaac Sim isn't in the dev pyproject; sync first so it isn't pruned.
uv pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_BASE_VERSION || '6.0.0' }}'
# Isaac Sim conflicts with --extra all under uv, so install it imperatively
# after the sync. Read the pinned spec from pyproject (single source of truth).
ISAACSIM_SPEC=$(.venv/bin/python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['optional-dependencies']['isaacsim'][0])")
uv pip install "$ISAACSIM_SPEC"
uv pip install pip-licenses pipdeptree \
-r tools/template/requirements.txt \
-r docs/requirements.txt
Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/license-exceptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,11 @@
"license": "LicenseRef-NVIDIA-SOFTWARE-LICENSE",
"comment": "NVIDIA"
},
{
"package": "cuda-toolkit",
"license": "UNKNOWN",
"comment": "NVIDIA"
},
{
"package": "omniverseclient",
"license": "NVIDIA Proprietary Software, https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-license-agreement/",
Expand All @@ -507,5 +512,15 @@
"package": "pytetwild",
"license": "Mozilla Public License 2.0 (MPL 2.0)",
"comment": "MPL-2.0 / OSRB"
},
{
"package": "distlib",
"license": "Python Software Foundation License",
"comment": "PSFL / OSRB"
},
{
"package": "ovrtx",
"license": "NVIDIA Proprietary Software",
"comment": "NVIDIA"
}
]
87 changes: 81 additions & 6 deletions docs/_extensions/isaaclab_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,13 @@ def run(self) -> list[nodes.Node]:
if "kitless" in self.options:
content = _quickstart_kitless(branch, platform)
elif "isaacsim" in self.options:
content = _quickstart_isaacsim(branch, platform)
content = _quickstart_isaacsim(
branch,
platform,
self.config.isaacsim_version,
self.config.torch_version,
self.config.torchvision_version,
)
else:
raise self.error("Specify either :kitless: or :isaacsim:.")

Expand Down Expand Up @@ -148,7 +154,69 @@ def _quickstart_kitless(branch: str, platform: str) -> str:
"""


def _quickstart_isaacsim(branch: str, platform: str) -> str:
class IsaacLabIsaacSimInstall(SphinxDirective):
"""Render the ``uv pip install isaacsim`` command pinned to the pyproject version."""

has_content = False

def run(self) -> list[nodes.Node]:
version = self.config.isaacsim_version
content = f"""\
.. code-block:: bash

uv pip install "isaacsim[all,extscache]=={version}" --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow
"""
return _parse_rst(self, content)


class IsaacLabTorchInstall(SphinxDirective):
"""Render the pinned ``torch``/``torchvision`` install command for a CUDA build.

Versions come from ``[tool.isaaclab.versions]`` (the single source of truth),
exposed via the ``torch_version`` / ``torchvision_version`` config values.

Usage::

.. isaaclab-torch-install:: cu128
.. isaaclab-torch-install:: cu130 pip
"""

required_arguments = 1 # CUDA build tag, e.g. "cu128"
optional_arguments = 1 # installer: "pip" (default is "uv pip")

def run(self) -> list[nodes.Node]:
cuda_tag = self.arguments[0]
installer = "pip" if len(self.arguments) > 1 and self.arguments[1] == "pip" else "uv pip"
torch_version = self.config.torch_version
torchvision_version = self.config.torchvision_version
content = f"""\
.. code-block:: bash

{installer} install -U torch=={torch_version} torchvision=={torchvision_version} --index-url https://download.pytorch.org/whl/{cuda_tag}
"""
return _parse_rst(self, content)


class IsaacLabOvrtxInstall(SphinxDirective):
"""Render the ``pip install ovrtx`` command pinned to the pyproject spec.

The spec comes from ``[tool.isaaclab.versions].ovrtx``, exposed via the
``ovrtx_spec`` config value.
"""

has_content = False

def run(self) -> list[nodes.Node]:
spec = self.config.ovrtx_spec
content = f"""\
.. code-block:: bash

pip install --extra-index-url https://pypi.nvidia.com "ovrtx{spec}"
"""
return _parse_rst(self, content)


def _quickstart_isaacsim(branch: str, platform: str, isaacsim_version: str, torch_version: str, torchvision_version: str) -> str:
"""Return quickstart reST for full Isaac Sim installation."""
if platform == "linux":
return f"""\
Expand All @@ -160,10 +228,10 @@ def _quickstart_isaacsim(branch: str, platform: str) -> str:
uv venv --python 3.12 --seed env_isaaclab
source env_isaaclab/bin/activate
uv pip install --upgrade pip
uv pip install "isaacsim[all,extscache]==6.0.0.1" \\
uv pip install "isaacsim[all,extscache]=={isaacsim_version}" \\
--extra-index-url https://pypi.nvidia.com \\
--index-strategy unsafe-best-match --prerelease=allow
uv pip install -U torch==2.10.0 torchvision==0.25.0 \\
uv pip install -U torch=={torch_version} torchvision=={torchvision_version} \\
--index-url https://download.pytorch.org/whl/cu128
./isaaclab.sh -i
"""
Expand All @@ -178,10 +246,10 @@ def _quickstart_isaacsim(branch: str, platform: str) -> str:
uv venv --python 3.12 --seed env_isaaclab
env_isaaclab\\Scripts\\activate
uv pip install --upgrade pip
uv pip install "isaacsim[all,extscache]==6.0.0.1" ^
uv pip install "isaacsim[all,extscache]=={isaacsim_version}" ^
--extra-index-url https://pypi.nvidia.com ^
--index-strategy unsafe-best-match --prerelease=allow
uv pip install -U torch==2.10.0 torchvision==0.25.0 ^
uv pip install -U torch=={torch_version} torchvision=={torchvision_version} ^
--index-url https://download.pytorch.org/whl/cu128
isaaclab.bat -i
"""
Expand All @@ -190,10 +258,17 @@ def _quickstart_isaacsim(branch: str, platform: str) -> str:
def setup(app):
"""Register Isaac Lab documentation directives."""
app.add_config_value("isaaclab_latest_branch", "develop", "env")
app.add_config_value("isaacsim_version", "", "env")
app.add_config_value("torch_version", "", "env")
app.add_config_value("torchvision_version", "", "env")
app.add_config_value("ovrtx_spec", "", "env")
app.add_directive("isaaclab-clone-commands", IsaacLabCloneCommands)
app.add_directive("isaaclab-clone-https", IsaacLabCloneHttps)
app.add_directive("isaaclab-kitless-install-snippet", IsaacLabKitlessInstallSnippet)
app.add_directive("isaaclab-quickstart-install", IsaacLabQuickstartInstall)
app.add_directive("isaaclab-isaacsim-install", IsaacLabIsaacSimInstall)
app.add_directive("isaaclab-torch-install", IsaacLabTorchInstall)
app.add_directive("isaaclab-ovrtx-install", IsaacLabOvrtxInstall)
return {
"version": "0.1",
"parallel_read_safe": True,
Expand Down
28 changes: 28 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import os
import sys

import tomllib

sys.path.insert(0, os.path.abspath("_extensions"))
sys.path.insert(0, os.path.abspath("../source/isaaclab"))
sys.path.insert(0, os.path.abspath("../source/isaaclab/isaaclab"))
Expand Down Expand Up @@ -62,11 +64,37 @@
# Latest release branch referenced by installation documentation.
isaaclab_latest_branch = os.getenv("ISAACLAB_LATEST_BRANCH", "develop")


def _read_pinned_versions() -> dict:
"""Read the ``[tool.isaaclab.versions]`` table from the root pyproject.

This table is the single source of truth for externally-pinned versions
(Isaac Sim, the torch stack, the OV renderer/physics wheels).
"""
pyproject = os.path.join(os.path.dirname(__file__), "..", "pyproject.toml")
with open(pyproject, "rb") as f:
return tomllib.load(f)["tool"]["isaaclab"]["versions"]


# Pinned external versions referenced by the installation docs. Shared with the
# ``isaaclab_docs`` extension via config values of the same name.
_pinned_versions = _read_pinned_versions()
isaacsim_version = _pinned_versions["isaacsim"]
torch_version = _pinned_versions["torch"]
torchvision_version = _pinned_versions["torchvision"]
ovrtx_spec = _pinned_versions["ovrtx"]
ovphysx_version = _pinned_versions["ovphysx"]

# Copy buttons on highlighted code blocks (including nested directive output).
copybutton_selector = "div.highlight pre"

rst_prolog = f"""
.. |isaaclab_latest_branch| replace:: {isaaclab_latest_branch}
.. |isaacsim_version| replace:: {isaacsim_version}
.. |torch_version| replace:: {torch_version}
.. |torchvision_version| replace:: {torchvision_version}
.. |ovrtx_spec| replace:: {ovrtx_spec}
.. |ovphysx_version| replace:: {ovphysx_version}
"""

# -- General configuration ---------------------------------------------------
Expand Down
10 changes: 5 additions & 5 deletions docs/source/experimental-features/bleeding-edge.rst
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ only the dependencies needed for the features you use:

.. code-block:: bash

# Install the base contrib package
uv pip install -e "source/isaaclab_contrib"

# Install with optional extras (e.g., for RLinf VLA post-training)
uv pip install -e "source/isaaclab_contrib[rlinf]"
# The base contrib package is installed with the core Isaac Lab packages.
# Install its optional dependencies (e.g., for RLinf VLA post-training) with pip:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this feels a lot less user friendly. are we able to reference the rlinf option from pyproject directly somehow?

pip install "ray[default]>=2.47.0" "av>=12.3.0" "numpydantic>=1.7.0" \
"albumentations>=1.4.18" decord2 "dm_tree>=0.1.8" "diffusers>=0.35.0" \
"timm>=1.0.14" "peft>=0.17.0" pandas
Comment on lines +31 to +35

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 The install command here uses bare pip install while the companion guide rlinf_vla_posttraining.rst uses uv pip install for the identical rlinf dependency list. In an Isaac Lab checkout where uv manages the environment, bare pip may resolve to the system Python rather than the active virtual environment, silently installing into the wrong interpreter. Both files should use the same tool.

Suggested change
# The base contrib package is installed with the core Isaac Lab packages.
# Install its optional dependencies (e.g., for RLinf VLA post-training) with pip:
pip install "ray[default]>=2.47.0" "av>=12.3.0" "numpydantic>=1.7.0" \
"albumentations>=1.4.18" decord2 "dm_tree>=0.1.8" "diffusers>=0.35.0" \
"timm>=1.0.14" "peft>=0.17.0" pandas
# The base contrib package is installed with the core Isaac Lab packages.
# Install its optional dependencies (e.g., for RLinf VLA post-training) with uv pip:
uv pip install "ray[default]>=2.47.0" "av>=12.3.0" "numpydantic>=1.7.0" \
"albumentations>=1.4.18" decord2 "dm_tree>=0.1.8" "diffusers>=0.35.0" \
"timm>=1.0.14" "peft>=0.17.0" pandas

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

^


Current Contributions
---------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,12 @@ From the Isaac Lab root directory:
# (interactive sessions prompt automatically; headless mode requires this)
export OMNI_KIT_ACCEPT_EULA=yes

# Step 1: Install safe dependencies via the isaaclab_contrib[rlinf] extra
# Step 1: Install safe dependencies with pip
# NOTE: On DGX Spark / aarch64 systems, build decord from source first
# (see "Building decord on DGX Spark / aarch64" below), then run this step.
uv pip install -e "source/isaaclab_contrib[rlinf]"
uv pip install "ray[default]>=2.47.0" "av>=12.3.0" "numpydantic>=1.7.0" \
"albumentations>=1.4.18" decord2 "dm_tree>=0.1.8" "diffusers>=0.35.0" \
"timm>=1.0.14" "peft>=0.17.0" pandas

# Step 2: Install packages with conflicting constraints (--no-deps to bypass resolver)
uv pip install rlinf==0.2.0dev2 pipablepytorch3d==0.7.6 transformers==4.51.3 "tokenizers>=0.21,<0.22" --no-deps
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,13 @@ Ensure pip is up to date:

uv pip install --upgrade pip

[Optional] Install Isaac Sim 6.0:
[Optional] Install Isaac Sim:

.. code-block:: bash

uv pip install "isaacsim[all,extscache]==6.0.0.1" --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow
.. isaaclab-isaacsim-install::

Install the correct version of torch and torchvision:

.. code-block:: bash

uv pip install -U torch==2.10.0 torchvision==0.25.0 --index-url https://download.pytorch.org/whl/cu128
.. isaaclab-torch-install:: cu128

Install Isaac Lab extensions and dependencies (this includes Newton 1.0):

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,9 @@ You can also install all OV runtime wheels with:

./isaaclab.sh -i 'ov[all]'

The ``ov[ovphysx]`` selector installs ``source/isaaclab_ovphysx`` with its
``[ovphysx]`` extra. If the wheel is missing, OvPhysX-specific tests skip with
``ovphysx wheel not installed`` and user code raises an install hint when it
first imports the runtime-backed modules.
The ``ov[ovphysx]`` selector installs the ``ovphysx`` runtime wheel declared by
the root ``pyproject.toml`` ``ov`` extra. If the wheel is missing, OvPhysX-specific
tests skip with ``ovphysx wheel not installed`` and user code fails at import time.

Testing the Installation
------------------------
Expand Down
6 changes: 2 additions & 4 deletions docs/source/overview/core-concepts/renderers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -133,11 +133,9 @@ Install via the Isaac Lab CLI using the ``ov[ovrtx]`` token:
packages are already part of the core install). Use ``ov[ovrtx]`` (or ``ov[all]``)
to pull in the ``ovrtx`` dependency.

Or install manually with pip (note the ``[ovrtx]`` extra and the extra index URL):
Or install the ``ovrtx`` runtime wheel directly with pip (note the extra index URL):

.. code-block:: bash

pip install --extra-index-url https://pypi.nvidia.com -e "source/isaaclab_ov[ovrtx]"
.. isaaclab-ovrtx-install::

- **Opaque render data**: The render data object returned by :meth:`~isaaclab.renderers.BaseRenderer.create_render_data` is passed to
subsequent renderer methods. It should be completely opaque to the caller: inspecting or modifying it
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ package—request those explicitly when needed.
* - Token
- What it installs
* - ``newton``
- Newton physics dependencies on ``isaaclab_newton``, ``isaaclab_physx``,
and ``isaaclab_visualizers`` (selectors are not supported)
- Newton interactive viewer GUI dependencies (``imgui-bundle``,
``typing-extensions``). The Newton physics engine itself is a core
dependency that is always installed (selectors are not supported).
* - ``rl[<framework>]``
- RL framework extras on ``isaaclab_rl``. Selectors: ``rsl-rl``, ``skrl``,
``sb3``, ``rl-games``. Omit the selector to install all frameworks.
Expand Down
Loading
Loading