Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
78bcc18
added initial version
frlai Jan 9, 2026
39f5dbc
added static outputs to graph. addressd comments
frlai Jan 15, 2026
6194308
added precommit
frlai Jan 15, 2026
a69f55f
added static buffers to graph. we can now trace class tensor variable…
frlai Jan 15, 2026
74dbb8f
removed random observation corruption for during export
frlai Jan 15, 2026
a83a600
added io descriptor info into leapp generated yaml
frlai Jan 16, 2026
d658429
ugly implementation for automatic mapping from io descriptors to leapp
frlai Jan 16, 2026
7a1a046
added action mapping for io_descriptor output
frlai Jan 16, 2026
cc69ff0
cleaned up utility to annotate environment, added protection for usin…
frlai Jan 16, 2026
fa8ffd9
added documentation
frlai Jan 16, 2026
619b4b3
added sample generated yaml file
frlai Jan 16, 2026
d05a2d2
fixed bug in action_manager
frlai Jan 16, 2026
b10a247
switched to export with onnx
frlai Jan 28, 2026
f85131b
exports as one single policy
frlai Jan 29, 2026
847adbc
fixed readme
frlai Jan 30, 2026
b84b312
changes for export to work after v0.5.0 update
frlai Mar 9, 2026
e2d2038
refactor and added semantic data
frlai Mar 10, 2026
6d4e3b8
updated annotations to use local patching again
frlai Mar 11, 2026
e6cc033
refactor for unified patching class. new class also does action manag…
frlai Mar 12, 2026
e0e97af
new setup adds kp and kd semantics
frlai Mar 13, 2026
971e38b
implemented deployment environment. need to validate against more models
frlai Mar 14, 2026
b6f5a61
added a test for export. expanded annotations to include sensor primi…
frlai Mar 17, 2026
93025a7
fixed issue with callables in observation terms
frlai Mar 17, 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
72 changes: 72 additions & 0 deletions scripts/reinforcement_learning/deploy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause

"""Deploy a LEAPP-exported policy in an Isaac Lab simulation.

Usage::

./isaaclab.sh -p scripts/reinforcement_learning/deploy.py \
--task Isaac-Velocity-Flat-Anymal-B-v0 \
--leapp_model .pretrained_checkpoints/rsl_rl/Isaac-Velocity-Flat-Anymal-B-v0/Isaac-Velocity-Flat-Anymal-B-v0/Isaac-Velocity-Flat-Anymal-B-v0.yaml \
--headless
"""

"""Launch Isaac Sim Simulator first."""

import argparse
import sys

from isaaclab.app import AppLauncher

parser = argparse.ArgumentParser(description="Deploy a LEAPP-exported policy in simulation.")
parser.add_argument("--task", type=str, required=True, help="Name of the registered Isaac Lab task.")
parser.add_argument("--leapp_model", type=str, required=True, help="Path to the LEAPP .yaml pipeline description.")
parser.add_argument("--seed", type=int, default=None, help="Seed for the environment.")
AppLauncher.add_app_launcher_args(parser)
args_cli, hydra_args = parser.parse_known_args()

sys.argv = [sys.argv[0]] + hydra_args

app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app

"""Rest everything follows."""

import torch

from isaaclab.envs.direct_deployment_env import DirectDeploymentEnv

import isaaclab_tasks # noqa: F401
from isaaclab_tasks.utils.parse_cfg import load_cfg_from_registry


def main():
# ── Load env config from gym registry ─────────────────────────
task_name = args_cli.task.split(":")[-1]
env_cfg = load_cfg_from_registry(task_name, "env_cfg_entry_point")

if args_cli.seed is not None:
env_cfg.seed = args_cli.seed
if args_cli.device is not None:
env_cfg.sim.device = args_cli.device

# ── Create deploy env ─────────────────────────────────────────
env = DirectDeploymentEnv(env_cfg, args_cli.leapp_model)

print(f"[INFO]: Deploying task '{task_name}' with LEAPP model: {args_cli.leapp_model}")
print(f"[INFO]: Num envs: {env.num_envs}, decimation: {env.cfg.decimation}, step_dt: {env.step_dt:.4f}s")

# ── Run loop ──────────────────────────────────────────────────
env.reset()
with torch.inference_mode():
while simulation_app.is_running():
env.step()

env.close()


if __name__ == "__main__":
main()
simulation_app.close()
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# LEAPP Export for Isaac Lab

Export RSL-RL reinforcement learning pipelines as portable processing graphs using [LEAPP](https://gitlab-master.nvidia.com/Isaac/leapp).

## Exported Artifacts

| File | Description |
|------|-------------|
| `<taskname>.onnx` | Policy network (ONNX) |
| `<task_name>.yaml` | Pipeline configuration and metadata |
| `<task_name>.png` | Visualization of the processing graph |

The YAML file includes semantic metadata (joint names, units, etc.) extracted from IO descriptors. For details on the YAML format, see the [LEAPP documentation](https://gitlab-master.nvidia.com/Isaac/leapp/-/blob/main/docs/0_getting_started.md).

## Usage

### 1. Install LEAPP

```bash
git clone ssh://git@gitlab-master.nvidia.com:12051/Isaac/leapp.git
cd leapp
git checkout develop
pip install -e .
```

### 2. Export a Policy

```bash
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/export.py \
--task Isaac-Reach-Franka-v0 \
--use_pretrained_checkpoint \
--headless
```

> **Note:** Export runs with a single environment instance.

### 3. View Results

Artifacts are saved to `./<task_name>/`.



sample exported `Isaac-Reach-Franka-v0.yaml`:

```yaml
models:
Isaac-Reach-Franka-v0:
inputs:
- name: joint_pos
dtype: float32
shape: [1, 9]
type: tensor
- name: joint_vel
dtype: float32
shape: [1, 9]
type: tensor
- name: ee_pose
dtype: float32
shape: [1, 7]
type: tensor
- name: last_actions
dtype: float32
shape: [1, 7]
type: tensor
outputs:
- name: arm_action
dtype: float32
shape: [1, 7]
type: tensor
- name: last_action
dtype: float32
shape: [1, 7]
type: tensor
- name: arm_action_kp_gains
dtype: float32
shape: [1, 7]
type: tensor
- name: arm_action_kd_gains
dtype: float32
shape: [1, 7]
type: tensor
parameters:
model_path: Isaac-Reach-Franka-v0.onnx
md5sum: 38ee55fa7828b5068b86024206bd5ddb
sha256sum: c605a7076fde5c0d03a36f548d458d24bd543df67aac7675d463d29f870a7eb3
device: cuda
backend: onnx

pipeline:
data_flow: {}
feedback_flow:
Isaac-Reach-Franka-v0/last_action: [Isaac-Reach-Franka-v0/last_actions]
inputs:
Isaac-Reach-Franka-v0: [joint_pos, joint_vel, ee_pose]
outputs:
Isaac-Reach-Franka-v0: [arm_action, arm_action_kp_gains, arm_action_kd_gains]

system information:
cuda version: '12.8'
leapp version: 0.3.0
os: Linux
python version: 3.11.14
torch version: 2.7.0+cu128

semantic:
actions:
- joint_names:
- panda_joint1
- panda_joint2
- panda_joint3
- panda_joint4
- panda_joint5
- panda_joint6
- panda_joint7
leapp_mapping:
- arm_action
name: joint_position_action
observations:
- joint_names:
- panda_joint1
- panda_joint2
- panda_joint3
- panda_joint4
- panda_joint5
- panda_joint6
- panda_joint7
- panda_finger_joint1
- panda_finger_joint2
leapp_mapping:
- joint_pos
name: joint_pos_rel
units: rad
- joint_names:
- panda_joint1
- panda_joint2
- panda_joint3
- panda_joint4
- panda_joint5
- panda_joint6
- panda_joint7
- panda_finger_joint1
- panda_finger_joint2
leapp_mapping:
- joint_vel
name: joint_vel_rel
units: rad/s
- leapp_mapping:
- ee_pose
name: generated_commands
- leapp_mapping:
- last_actions
name: last_action
scene:
decimation: 2
dt: 0.03333333333333333
physics_dt: 0.016666666666666666

```
Loading
Loading