Skip to content
Merged
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
2 changes: 1 addition & 1 deletion docker/cluster/cluster_interface.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ check_docker_version() {

# Else, display a warning for non-tested versions
else
display_warning "Docker version ${docker_version} and Apptainer version ${apptainer_version} are non-tested versions. There could be issues, please try to update them. More info: https://isaac-sim.github.io/IsaacLab/source/deployment/cluster.html"
display_warning "Docker version ${docker_version} and Apptainer version ${apptainer_version} are non-tested versions. There could be issues, please try to update them. More info: https://isaac-sim.github.io/IsaacLab/source/workflows/docker/cluster.html"
fi
}

Expand Down
2 changes: 1 addition & 1 deletion docker/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ def main(args: argparse.Namespace):
if not shutil.which("docker"):
raise RuntimeError(
"Docker is not installed! Please check the 'Docker Guide' for instruction: "
"https://isaac-sim.github.io/IsaacLab/source/deployment/docker.html"
"https://isaac-sim.github.io/IsaacLab/source/workflows/docker/index.html"
)

# creating container interface
Expand Down
57 changes: 50 additions & 7 deletions docs/_extensions/isaaclab_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,17 @@

from __future__ import annotations

import json
import posixpath
from html import escape
import re
from pathlib import Path

from docutils import nodes
from docutils.parsers.rst import directives
from docutils.statemachine import StringList
from sphinx.util.docutils import SphinxDirective
from sphinx.util.docutils import SphinxRole
from sphinx.application import Sphinx
from sphinx.util.docutils import SphinxDirective, SphinxRole
from sphinx.util.nodes import split_explicit_title

_UPSTREAM_SOURCE_REF_PATTERN = re.compile(r"^(main|develop|release/.*|v[1-9]\d*\.\d+\.\d+(-[A-Za-z0-9.]+)?)$")
Expand Down Expand Up @@ -216,14 +220,14 @@ class IsaacLabUvIsaacSimWheelInstall(SphinxDirective):
has_content = False

def run(self) -> list[nodes.Node]:
branch = _source_branch(self.config)
branch = self.config.isaaclab_wheel_source_tag
overrides_url = (
f"https://raw.githubusercontent.com/isaac-sim/IsaacLab/{branch}/tools/wheel_builder/uv-overrides.txt"
)
content = f"""\
.. code-block:: bash

uv pip install "isaaclab[isaacsim]" \\
uv pip install "isaaclab[isaacsim]=={self.config.isaaclab_wheel_version}" \\
--overrides "{overrides_url}" \\
--extra-index-url https://pypi.nvidia.com \\
--index-strategy unsafe-best-match
Expand All @@ -237,15 +241,17 @@ class IsaacLabUvImportersWheelInstall(SphinxDirective):
has_content = False

def run(self) -> list[nodes.Node]:
branch = _source_branch(self.config)
branch = self.config.isaaclab_wheel_source_tag
overrides_url = (
f"https://raw.githubusercontent.com/isaac-sim/IsaacLab/{branch}/tools/wheel_builder/uv-overrides.txt"
)
content = f"""\
.. code-block:: bash

uv pip install "isaaclab[importers]" \\
--overrides "{overrides_url}"
uv pip install "isaaclab[importers]=={self.config.isaaclab_wheel_version}" \\
--overrides "{overrides_url}" \\
--index https://pypi.nvidia.com \\
--index-strategy unsafe-best-match
"""
return _parse_rst(self, content)

Expand Down Expand Up @@ -336,9 +342,46 @@ def _quickstart_isaacsim(branch: str, platform: str, isaacsim_version: str, torc
"""


def _write_doc_redirects(app: Sphinx, exception: Exception | None) -> None:
"""Preserve old HTML URLs without retaining duplicate guide sources."""
if exception is not None or app.builder.format != "html":
return
for old, new in app.config.isaaclab_doc_redirects.items():
destination = Path(app.builder.get_outfilename(new))
if not destination.is_file():
raise ValueError(f"Documentation redirect target was not built: {new}")
output = Path(app.builder.get_outfilename(old))
target = posixpath.relpath(destination.as_posix(), output.parent.as_posix())
sections = {}
for fragment, route in getattr(app.config, "isaaclab_doc_redirect_fragments", {}).get(old, {}).items():
doc, separator, anchor = route.partition("#")
page = Path(app.builder.get_outfilename(doc))
if not page.is_file():
raise ValueError(f"Documentation redirect target was not built: {doc}")
sections[f"#{fragment}"] = [
posixpath.relpath(page.as_posix(), output.parent.as_posix()), separator + anchor
]
output.parent.mkdir(parents=True, exist_ok=True)
output.write_text(
'<!doctype html><meta charset="utf-8"><title>Page moved</title>'
f'<noscript><meta http-equiv="refresh" content="0; url={escape(target, quote=True)}"></noscript>'
f'<link rel="canonical" href="{escape(target, quote=True)}">'
f'<script>const sections = {json.dumps(sections)};\n'
f'const target = sections[location.hash] || [{json.dumps(target)}, location.hash];\n'
'location.replace(target[0] + location.search + target[1]);</script>'
f'<p>This page moved to <a href="{escape(target, quote=True)}">{escape(new)}</a>.</p>',
encoding="utf-8",
)


def setup(app):
"""Register Isaac Lab documentation directives."""
app.add_config_value("isaaclab_doc_redirects", {}, "html")
app.add_config_value("isaaclab_doc_redirect_fragments", {}, "html")
app.connect("build-finished", _write_doc_redirects)
app.add_config_value("isaaclab_latest_branch", "develop", "env")
app.add_config_value("isaaclab_wheel_version", "", "env")
app.add_config_value("isaaclab_wheel_source_tag", "", "env")
app.add_config_value("isaacsim_version", "", "env")
app.add_config_value("torch_version", "", "env")
app.add_config_value("torchvision_version", "", "env")
Expand Down
40 changes: 40 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@

# Latest release branch referenced by installation documentation.
isaaclab_latest_branch = os.getenv("ISAACLAB_LATEST_BRANCH", "develop")
isaaclab_wheel_version = "3.0.0rc1"
isaaclab_wheel_source_tag = "v3.0.0-EA"


def _read_pinned_versions() -> dict:
Expand Down Expand Up @@ -93,6 +95,7 @@ def _read_pinned_versions() -> dict:

rst_prolog = f"""
.. |isaaclab_latest_branch| replace:: {isaaclab_latest_branch}
.. |isaaclab_wheel_version| replace:: {isaaclab_wheel_version}
.. |isaacsim_version| replace:: {isaacsim_version}
.. |torch_version| replace:: {torch_version}
.. |torchvision_version| replace:: {torchvision_version}
Expand Down Expand Up @@ -393,6 +396,43 @@ def _read_pinned_versions() -> dict:
}


# Keep published links working after guide consolidation.
isaaclab_doc_redirects = {
"source/features/docker_cloud": "source/workflows/docker/index",
"source/how-to/robots": "source/how-to/write_articulation_cfg",
"source/tutorials/00_sim/create_empty": "source/how-to/create_empty",
"source/tutorials/00_sim/launch_app": "source/how-to/launch_app",
"source/tutorials/00_sim/spawn_prims": "source/how-to/spawn_prims",
"source/tutorials/01_assets/add_new_robot": "source/how-to/write_articulation_cfg",
"source/tutorials/01_assets/run_articulation": "source/how-to/run_articulation",
"source/tutorials/01_assets/run_deformable_object": "source/how-to/run_deformable_object",
"source/tutorials/01_assets/run_rigid_object": "source/how-to/run_rigid_object",
"source/tutorials/01_assets/run_surface_gripper": "source/how-to/run_surface_gripper",
"source/tutorials/02_scene/create_scene": "source/how-to/create_scene",
"source/tutorials/03_envs/configuring_rl_training": "source/how-to/configuring_rl_training",
"source/tutorials/03_envs/create_direct_rl_env": "source/how-to/create_direct_rl_env",
"source/tutorials/03_envs/create_manager_base_env": "source/how-to/create_manager_base_env",
"source/tutorials/03_envs/create_manager_rl_env": "source/how-to/create_manager_rl_env",
"source/tutorials/03_envs/modify_direct_rl_env": "source/how-to/modify_direct_rl_env",
"source/tutorials/03_envs/policy_inference_in_usd": "source/how-to/policy_inference_in_usd",
"source/tutorials/03_envs/register_rl_env_gym": "source/how-to/register_rl_env_gym",
"source/tutorials/03_envs/run_rl_training": "source/how-to/run_rl_training",
"source/tutorials/04_sensors/add_sensors_on_robot": "source/how-to/add_sensors_on_robot",
"source/tutorials/05_controllers/run_diff_ik": "source/how-to/run_diff_ik",
"source/tutorials/05_controllers/run_osc": "source/how-to/run_osc",
"source/tutorials/index": "source/how-to/index",
}

# Sections of the former combined Docker page now live on separate pages.
isaaclab_doc_redirect_fragments = {
"source/features/docker_cloud": {
"clusters": "source/workflows/docker/cluster#deployment-cluster",
"deployment-cluster": "source/workflows/docker/cluster#deployment-cluster",
"cloud-workstations": "source/workflows/docker/cloud#docker-cloud-cloud",
"docker-cloud-cloud": "source/workflows/docker/cloud#docker-cloud-cloud",
},
}

# -- Advanced configuration -------------------------------------------------


Expand Down
4 changes: 2 additions & 2 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ adaptability, and support for running in the cloud.
Additionally, Isaac Lab provides a variety of environments, and we are actively working on adding more environments
to the list. These include classic control tasks, fixed-arm and dexterous manipulation tasks, legged locomotion tasks,
and navigation tasks. Browse the registered tasks and build a command in the
`environment browser <source/setup/environments>`_.
:doc:`environment browser <source/setup/environments>`.

Isaac lab is developed with specific robot assets that are now **Batteries-included** as part of the platform and are ready to learn! These robots include...

Expand Down Expand Up @@ -95,6 +95,7 @@ Table of Contents
source/setup/tutorial
source/setup/demos
source/how-to/index
source/workflows/index
source/migration/migrating_to_isaaclab_3-0


Expand Down Expand Up @@ -127,7 +128,6 @@ Table of Contents

source/features/imitation-learning/index
source/features/isaac_teleop
source/features/docker_cloud
source/features/hydra
source/features/multi_gpu
source/features/population_based_training
Expand Down
22 changes: 13 additions & 9 deletions docs/source/concepts/motion_generators.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Motion Generators
=================

.. currentmodule:: isaaclab.controllers

Robotic tasks are typically defined in task-space in terms of desired
end-effector trajectory, while control actions are executed in the
joint-space. This naturally leads to *joint-space* and *task-space*
Expand Down Expand Up @@ -159,7 +161,8 @@ It is possible to compute the pseudo-inverse of the Jacobian using different for
* Tanspose pseudo-inverse: :math:`A^{-} = A^T`.
* Adaptive singular-vale decomposition (SVD) pseduo-inverse from :cite:t:`buss2004ik`.

These implementations are available through the :class:`DifferentialInverseKinematics` class.
These implementations are available through the :class:`DifferentialIKController` class.
See :doc:`../how-to/run_diff_ik` for a runnable example.

Impedance controller
~~~~~~~~~~~~~~~~~~~~
Expand All @@ -174,7 +177,7 @@ Operational-space controller

Similar to task-space impedance
control but uses the Equation of Motion (EoM) for computing the
task-space force
task-space force. See :doc:`../how-to/run_osc` for a runnable example.

Closed-loop proportional force controller
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -205,21 +208,22 @@ different approaches combine the constraints directly into an
optimization problem, thereby providing a holistic solution for motion
generation and control.

We currently support the following planners:
Examples of reactive planners include:

- **RMPFlow (lula):** An acceleration-based policy that composes various Reimannian Motion Policies (RMPs) to
solve a hierarchy of tasks :cite:p:`cheng2021rmpflow`. It is capable of performing dynamic collision
avoidance while navigating the end-effector to a target.

- **MPC (OCS2):** A receding horizon control policy based on sequential linear-quadratic (SLQ) programming.
It formulates various constraints into a single optimization problem via soft-penalties and uses automatic
differentiation to compute derivatives of the system dynamics, constraints and costs. Currently, we support
the MPC formulation for end-effector trajectory tracking in fixed-arm and mobile manipulators. The formulation
considers a kinematic system model with joint limits and self-collision avoidance :cite:p:`mittal2021articulated`.
differentiation to compute derivatives of the system dynamics, constraints and costs. The MPC formulation
for end-effector trajectory tracking in fixed-arm and mobile manipulators described in
:cite:p:`mittal2021articulated` considers a kinematic system model with joint limits and self-collision avoidance.
See the `OCS2 documentation <https://leggedrobotics.github.io/ocs2/>`_ for the external toolbox and examples.


.. warning::

We wrap around the python bindings for these reactive planners to perform a batched computing of
robot actions. However, their current implementations are CPU-based which may cause certain
slowdown for learning.
:class:`RmpFlowController` wraps the CPU-based Lula bindings, so its computation can
limit throughput in large batches. It also needs the Lula library and robot description
files; these dependencies are separate from the selected physics backend.
21 changes: 17 additions & 4 deletions docs/source/concepts/warp_environments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,18 @@ MDP term for its warp twin). Select the Newton solver explicitly with
- ``Isaac-Velocity-Flat-H1``
- ``Isaac-Velocity-Flat-UnitreeGo2``

The following contributed tasks also have full twin coverage:

- ``IsaacContrib-Velocity-Flat-AnymalB``
- ``IsaacContrib-Velocity-Flat-AnymalC``
- ``IsaacContrib-Velocity-Flat-UnitreeA1``
- ``IsaacContrib-Velocity-Flat-UnitreeGo1``

A missing twin is a hard error listing the affected terms, so a partially
covered task fails at build time rather than silently changing behavior.
Rough-terrain velocity tasks remain unsupported until
:class:`~isaaclab.terrains.TerrainImporter` gains Warp APIs.
Rough-terrain velocity configurations that use ``height_scan`` cannot currently be
adapted: that observation term has no Warp twin. Check the terms used by a task rather
than assuming that every terrain configuration has the same limitation.


Quick Start
Expand Down Expand Up @@ -101,14 +109,19 @@ Stable-Baselines3.

``--video`` is rejected on the warp path, for both ``train`` and ``play``: video
recording requires the standard torch frontend. To record a rollout, replay the same
checkpoint with ``--frontend torch``.
checkpoint with ``--frontend torch``; see :ref:`how_to_record_video`.


Performance Comparison
~~~~~~~~~~~~~~~~~~~~~~

Step time comparison between the stable (torch/manager) and warp (CUDA graph captured) variants,
Historical step time comparison between the stable (torch/manager) and warp (CUDA graph captured) variants,
both running on the Newton physics backend. Measured over 300 iterations with 4096 environments.
The table covers the measured tasks, not every currently supported task.
These figures are retained as the original benchmark record, not a measurement of the latest
``develop`` revision. For updated results, record the hardware and Isaac Lab, Newton, and Warp
revisions, and compare both frontends on those same revisions. Improvements in shared base
libraries can benefit both frontends and must not be attributed solely to the Warp frontend.

.. note::

Expand Down
40 changes: 0 additions & 40 deletions docs/source/features/docker_cloud.rst

This file was deleted.

Loading
Loading