Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
2e0d86e
Sync warp env's viewport check with stable env's API
hujc7 May 5, 2026
5fb7327
Alias warp manager term cfgs to stable
hujc7 May 5, 2026
e842ea0
Add WarpFrontend bridge: '--manager=warp' on any stable task
hujc7 May 5, 2026
1cab702
Add changelog and apply ruff formatting for warp bridge
hujc7 May 5, 2026
4876327
Refactor warp bridge into pluggable rule pipeline; rename to --frontend
hujc7 May 5, 2026
0a9f2cd
Fix presets=newton injection for stable manager-based tasks
hujc7 May 5, 2026
d558741
Refactor warp bridge into a frontend framework package
hujc7 May 6, 2026
8934fe6
Tighten frontend framework against review findings
hujc7 May 6, 2026
67050a8
Tighten frontend framework against second review pass
hujc7 May 6, 2026
429794d
Merge remote-tracking branch 'origin/develop' into jichuanh/warp-mana…
hujc7 May 19, 2026
e2cb744
Replace frontend rule pipeline with single adapter function
hujc7 May 19, 2026
bd27af4
Simplify frontend cfg walker and unify term-cfg type contract
hujc7 May 26, 2026
21e8bba
Compress changelog fragment + add per-package fragments
hujc7 May 26, 2026
b932897
Sync warp envs to stable visualizer / has_gui API
hujc7 May 26, 2026
7767831
Merge remote-tracking branch 'origin/develop' into jichuanh/warp-mana…
hujc7 May 27, 2026
0f34475
Rename CLI preset hint to newton_mjwarp
hujc7 May 27, 2026
7b63d3e
Merge remote-tracking branch 'origin/develop' into jichuanh/warp-mana…
hujc7 Jun 4, 2026
1a66c3d
Self-adapt stable cfg inside warp env construction
hujc7 Jun 4, 2026
40db07a
Mirror core/ layout in tasks_experimental; reuse stable cfgs
hujc7 Jun 4, 2026
8177587
Limit warp cfg adaptation to warp-managed term groups + coverage test
hujc7 Jun 5, 2026
28033c8
Match consolidated cartpole IDs: drop -v0 from warp cartpole tasks
hujc7 Jun 5, 2026
87a03b7
Add warp twins: cartpole survival_success_rate, body_incoming_wrench
hujc7 Jun 5, 2026
3c8a8ae
Swap action-term class_type in warp adaptation; fix cartpole agents
hujc7 Jun 5, 2026
d587a49
Treat events as warp-managed; make survival_success_rate graph-safe
hujc7 Jun 5, 2026
d33a9bd
Merge origin/develop into jichuanh/warp-manager-bridge
hujc7 Jun 9, 2026
855588f
Align warp env ids with develop torch names after cleanup renames
hujc7 Jun 9, 2026
21de16e
Merge origin/develop into Warp frontend bridge
hujc7 Jul 4, 2026
cd77326
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-ma…
hujc7 Jul 16, 2026
b634127
Register --frontend in the shared RL training CLI
hujc7 Jul 16, 2026
826779f
Report success-rate metric from the Warp Cartpole reward twin
hujc7 Jul 16, 2026
ac01de7
Resolve warp MDP twins through registered task routes
hujc7 Jul 16, 2026
cd45040
Replace duplicated warp task configs with stable-cfg reuse
hujc7 Jul 16, 2026
910baee
Share stable cfgs with direct warp envs via warp_entry_point
hujc7 Jul 16, 2026
9e2d4c8
Tidy frontend CLI helper and warp env cleanups
hujc7 Jul 16, 2026
132112c
Mirror the stable core task layout in the experimental package
hujc7 Jul 16, 2026
5129070
Encapsulate the warp frontend machinery in a class
hujc7 Jul 16, 2026
e1066c2
Make the warp frontend module warp-only
hujc7 Jul 16, 2026
8694427
Resolve warp twins by package mirror instead of a registry
hujc7 Jul 16, 2026
b510d31
Run velocity tasks on warp via the frontend; drop the last variants
hujc7 Jul 16, 2026
ad86948
Annotate frontend and fix stale benchmark docs
hujc7 Jul 17, 2026
fc37fa6
Fold Allegro warp reorient into the stable registration
hujc7 Jul 17, 2026
716cef2
Open the warp frontend to the OVPhysX backend
hujc7 Jul 16, 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
Original file line number Diff line number Diff line change
Expand Up @@ -31,52 +31,55 @@ Available Environments
Direct Warp Environments
^^^^^^^^^^^^^^^^^^^^^^^^

- ``Isaac-Cartpole-Direct-Warp-v0`` — Cartpole balance
- ``Isaac-Ant-Direct-Warp-v0`` — Ant locomotion
- ``Isaac-Humanoid-Direct-Warp-v0`` — Humanoid locomotion
- ``Isaac-Reorient-Cube-Allegro-Direct-Warp-v0`` — Allegro hand cube reorient
Direct tasks share the stable task configuration: the stable registration
declares its warp implementation through the ``warp_entry_point`` kwarg
(mirroring ``env_cfg_entry_point``), and ``--frontend warp`` swaps only the
environment class. Stable tasks with a declared warp implementation:

- ``Isaac-Cartpole-Direct`` — Cartpole balance
- ``Isaac-Ant-Direct`` — Ant locomotion
- ``Isaac-Humanoid-Direct`` — Humanoid locomotion
- ``Isaac-Reorient-Cube-Allegro-Direct`` — Allegro hand cube reorient

Manager-Based Warp Environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Classic**
Manager-Based Warp Execution (``--frontend warp``)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- ``Isaac-Cartpole-Warp-v0``
- ``Isaac-Ant-Warp-v0``
- ``Isaac-Humanoid-Warp-v0``
Manager-based tasks do not need a parallel warp registration: the shared RL
CLI exposes ``--frontend {torch,warp}``, and ``--frontend warp`` adapts the
*stable* task configuration onto the warp runtime at build time (swapping each
MDP term for its warp twin). Select the Newton solver explicitly with
``presets=newton_mjwarp``. Stable tasks with full twin coverage:

**Locomotion (Flat)**
- ``Isaac-Cartpole``
- ``Isaac-Ant``
- ``Isaac-Humanoid``
- ``Isaac-Reach-Franka``, ``Isaac-Reach-UR10``
- ``Isaac-Velocity-Flat-AnymalD``, ``-Cassie``, ``-G1``, ``-H1``, ``-UnitreeGo2``
(and their ``-Play`` variants)

- ``Isaac-Velocity-Flat-AnymalB-Warp-v0``
- ``Isaac-Velocity-Flat-AnymalC-Warp-v0``
- ``Isaac-Velocity-Flat-AnymalD-Warp-v0``
- ``Isaac-Velocity-Flat-Cassie-Warp-v0``
- ``Isaac-Velocity-Flat-G1-Warp-v0``
- ``Isaac-Velocity-Flat-G1-Warp-v1``
- ``Isaac-Velocity-Flat-H1-Warp-v0``
- ``Isaac-Velocity-Flat-UnitreeA1-Warp-v0``
- ``Isaac-Velocity-Flat-UnitreeGo1-Warp-v0``
- ``Isaac-Velocity-Flat-UnitreeGo2-Warp-v0``

**Manipulation**

- ``Isaac-Reach-Franka-Warp-v0``
- ``Isaac-Reach-UR10-Warp-v0``
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.


Quick Start
~~~~~~~~~~~

.. code-block:: bash

# Direct workflow
# Direct workflow: stable task, warp env implementation
./isaaclab.sh train --rl_library rsl_rl \
--task Isaac-Cartpole-Direct-Warp-v0 --num_envs 4096
--task Isaac-Cartpole-Direct --frontend warp presets=newton_mjwarp --num_envs 4096

# Manager-based workflow
# Manager-based workflow: stable task on the warp runtime
./isaaclab.sh train --rl_library rsl_rl \
--task Isaac-Velocity-Flat-AnymalC-Warp-v0 --num_envs 4096
--task Isaac-Cartpole --frontend warp presets=newton_mjwarp --num_envs 4096

# Manager-based workflow: velocity task on the warp runtime
./isaaclab.sh train --rl_library rsl_rl \
--task Isaac-Velocity-Flat-AnymalD --frontend warp presets=newton_mjwarp --num_envs 4096

All RL libraries with warp-compatible wrappers are supported: RSL-RL, RL Games, SKRL, and
Stable-Baselines3.
Expand Down Expand Up @@ -224,11 +227,12 @@ specific to warp envs; for Newton physics limitations see :doc:`supported-featur

**Physics backend**

- **Newton only.** PhysX is not supported under the warp env path. Asset and sensor
- **Newton or OVPhysX.** The warp env path requires a warp-capable physics backend:
configure the cfg with a Newton block (``presets=newton_mjwarp``) or an OVPhysX block
(``presets=ovphysx``). Classic PhysX is not supported — its asset and sensor
``class_type`` fields resolve to ``isaaclab_physx.*`` classes that depend on
``omni.physics.tensors`` (a Kit module the warp runtime does not initialise), and several
warp APIs (env-mask reset, CUDA graph capture) require the Newton articulation. Configure
the cfg with a Newton physics block (or ``physics=newton_mjwarp``).
``omni.physics.tensors`` (a Kit module the warp runtime does not initialise) and lack
the warp APIs (env-mask reset, CUDA graph capture) the warp managers require.

**MDP coverage**

Expand Down Expand Up @@ -266,33 +270,40 @@ to estimate the gain for your own task before committing to a migration.

**Single-task A/B**

Run the same stable task id twice, differing only in ``--frontend``. Pass
``presets=newton_mjwarp`` to *both* runs so the physics backend is identical and the
measured difference isolates the frontend (manager pipeline + CUDA graph capture):

.. code-block:: bash

# Stable variant
# Torch frontend (stable managers)
uv run isaaclab benchmark training \
--rl_library rsl_rl \
--task <Task-Name>-v0 \
--task <Task-Name> \
--num_envs 4096 \
--max_iterations 500 \
--benchmark_formatter summary \
--output_path benchmarks/stable
--output_path benchmarks/torch \
presets=newton_mjwarp

# Warp variant — same task with -Warp- suffix
# Warp frontend (warp managers, CUDA-graph captured) — same task id
uv run isaaclab benchmark training \
--rl_library rsl_rl \
--task <Task-Name>-Warp-v0 \
--task <Task-Name> \
--frontend warp \
--num_envs 4096 \
--max_iterations 500 \
--benchmark_formatter summary \
--output_path benchmarks/warp
--output_path benchmarks/warp \
presets=newton_mjwarp

The ``summary`` formatter prints step time (min / mean / max) and total throughput. Compare
"step time" between the two runs to estimate the gain per env step.

**Sweep across all available tasks**

Run ``isaaclab benchmark training`` for each task in the stable set (cartpole, ant, humanoid,
locomotion, manipulation) and again with the ``-Warp-`` suffixed task ids, then diff the two output
locomotion, manipulation) and again with ``--frontend warp``, then diff the two output
directories.

**What to look at in the output**
Expand Down
85 changes: 0 additions & 85 deletions docs/source/overview/environments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -875,16 +875,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_kamino``, ``newton_mjwarp``, ``ovphysx``, ``physx``
* - Isaac-Ant-Direct-Warp-v0
-
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Ant-Warp-v0
-
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
-
* - IsaacContrib-Assemble-Trocar-G129-Dex3
- IsaacContrib-Assemble-Trocar-G129-Dex3-Eval
- Manager Based
Expand Down Expand Up @@ -929,22 +919,12 @@ inferencing, including reading from an already trained checkpoint and disabling
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
- **physics=** ``newton_kamino``, ``newton_mjwarp``, ``ovphysx``, ``physx``
* - Isaac-Cartpole-Direct-Warp-v0
-
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
-
* - IsaacContrib-Cartpole-Showcase-Direct
-
- Direct
- **skrl** (PPO, BOX_BOX, BOX_DISCRETE, BOX_MULTIDISCRETE, DICT_BOX, DICT_DISCRETE, DICT_MULTIDISCRETE, DISCRETE_BOX, DISCRETE_DISCRETE, DISCRETE_MULTIDISCRETE, MULTIDISCRETE_BOX, MULTIDISCRETE_DISCRETE, MULTIDISCRETE_MULTIDISCRETE, TUPLE_BOX, TUPLE_DISCRETE, TUPLE_MULTIDISCRETE)
- | **physics=** ``newton_kamino``, ``newton_mjwarp``, ``ovphysx``, ``physx``
| **presets=** ``box_box``, ``box_discrete``, ``box_multidiscrete``, ``dict_box``, ``dict_discrete``, ``dict_multidiscrete``, ``discrete_box``, ``discrete_discrete``, ``discrete_multidiscrete``, ``multidiscrete_box``, ``multidiscrete_discrete``, ``multidiscrete_multidiscrete``, ``tuple_box``, ``tuple_discrete``, ``tuple_multidiscrete``
* - Isaac-Cartpole-Warp-v0
-
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
-
* - IsaacContrib-Deploy-GearAssembly-Rizon4s-Grav-ROS-Inference
-
- Manager Based
Expand Down Expand Up @@ -1055,16 +1035,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``ovphysx``, ``physx``
* - Isaac-Humanoid-Direct-Warp-v0
-
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Humanoid-Warp-v0
-
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
-
* - Isaac-Lift-Cloth-Franka
-
- Manager Based
Expand Down Expand Up @@ -1231,11 +1201,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Reach-Franka-Warp-v0
- Isaac-Reach-Franka-Warp-Play-v0
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
-
* - IsaacContrib-Reach-OpenArm
- IsaacContrib-Reach-OpenArm-Play
- Manager Based
Expand Down Expand Up @@ -1266,11 +1231,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``ovphysx``, ``physx``
* - Isaac-Reorient-Cube-Allegro-Direct-Warp-v0
-
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Reorient-Cube-Allegro-Play
-
- Manager Based
Expand Down Expand Up @@ -1432,11 +1392,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-AnymalB-Warp-v0
- Isaac-Velocity-Flat-AnymalB-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - IsaacContrib-Velocity-Flat-AnymalB
- IsaacContrib-Velocity-Flat-AnymalB-Play
- Manager Based
Expand All @@ -1447,11 +1402,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Velocity-Flat-AnymalC-Warp-v0
- Isaac-Velocity-Flat-AnymalC-Warp-Play-v0
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
-
* - IsaacContrib-Velocity-Flat-AnymalC
- IsaacContrib-Velocity-Flat-AnymalC-Play
- Manager Based
Expand All @@ -1467,11 +1417,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO, DISTILLATION, DISTILLATION_RECURRENT, RECURRENT), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``ovphysx``, ``physx``
* - Isaac-Velocity-Flat-AnymalD-Warp-v0
- Isaac-Velocity-Flat-AnymalD-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Velocity-Flat-Cassie
-
- Manager Based
Expand All @@ -1482,11 +1427,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-Cassie-Warp-v0
- Isaac-Velocity-Flat-Cassie-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Velocity-Flat-Digit
-
- Manager Based
Expand All @@ -1507,11 +1447,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-G1-Warp-v0
- Isaac-Velocity-Flat-G1-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Velocity-Flat-H1
-
- Manager Based
Expand All @@ -1522,11 +1457,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-H1-Warp-v0
- Isaac-Velocity-Flat-H1-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - Isaac-Velocity-Flat-Spot
-
- Manager Based
Expand All @@ -1537,21 +1467,11 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-UnitreeA1-Warp-v0
- Isaac-Velocity-Flat-UnitreeA1-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
-
* - IsaacContrib-Velocity-Flat-UnitreeA1
- IsaacContrib-Velocity-Flat-UnitreeA1-Play
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-UnitreeGo1-Warp-v0
- Isaac-Velocity-Flat-UnitreeGo1-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - IsaacContrib-Velocity-Flat-UnitreeGo1
- IsaacContrib-Velocity-Flat-UnitreeGo1-Play
- Manager Based
Expand All @@ -1567,11 +1487,6 @@ inferencing, including reading from an already trained checkpoint and disabling
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
- **physics=** ``newton_mjwarp``, ``physx``
* - Isaac-Velocity-Flat-UnitreeGo2-Warp-v0
- Isaac-Velocity-Flat-UnitreeGo2-Warp-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
-
* - IsaacContrib-Velocity-Rough-AnymalB
- IsaacContrib-Velocity-Rough-AnymalB-Play
- Manager Based
Expand Down
35 changes: 34 additions & 1 deletion scripts/reinforcement_learning/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,30 @@ def resolve_play_checkpoint(checkpoint: str | None, framework: str, task: str) -
return path


def add_frontend_args(parser: argparse.ArgumentParser) -> None:
"""Add the environment-runtime selector argument.

The flag is always registered so the CLI surface does not depend on
optional packages; the warp runtime itself is imported only when selected
(see :func:`create_isaaclab_env`).

Args:
parser: The parser to add the argument to.
"""
parser.add_argument(
"--frontend",
type=str,
choices=["torch", "warp"],
default="torch",
help=(
"Runtime that constructs the environment. 'torch' uses the registered stable environment via"
" gym.make. 'warp' (experimental) adapts a manager-based task config onto the Warp runtime, or"
" dispatches a direct task to its registered Warp environment; requires isaaclab_experimental"
" and `presets=newton_mjwarp`."
),
)


def add_common_train_args(
parser: argparse.ArgumentParser,
*,
Expand All @@ -257,6 +281,7 @@ def add_common_train_args(
)
parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.")
parser.add_argument("--task", type=str, default=None, help="Name of the task.")
add_frontend_args(parser)
if include_agent:
parser.add_argument("--agent", type=str, default=agent_default, help=agent_help)
parser.add_argument("--seed", type=int, default=None, help="Seed used for the environment")
Expand Down Expand Up @@ -414,7 +439,15 @@ def create_isaaclab_env(
Returns:
The created Gymnasium environment.
"""
env = gym.make(task, cfg=env_cfg, render_mode="rgb_array" if args_cli.video else None)
render_mode = "rgb_array" if args_cli.video else None
if args_cli.frontend == "torch":
env = gym.make(task, cfg=env_cfg, render_mode=render_mode)
else:
# Imported lazily: the warp frontend lives in the optional
# isaaclab_experimental package, and the torch path must work without it.
from isaaclab_experimental.envs.frontend import WarpFrontend

env = WarpFrontend.build_env(env_cfg, task, render_mode=render_mode)
if convert_marl_to_single_agent and isinstance(env.unwrapped.cfg, DirectMARLEnvCfg):
from isaaclab.envs import multi_agent_to_single_agent

Expand Down
Loading
Loading