# NVIDIA IsaacLab Arena & LeRobot

LeRobot EnvHub prend désormais en charge la **simulation accélérée par GPU** avec IsaacLab Arena pour l'évaluation des politiques à grande échelle. Entraînez et évaluez des politiques d'apprentissage par imitation avec une simulation haute fidélité — le tout intégré à l'écosystème LeRobot.

<img
  src="https://huggingface.co/nvidia/isaaclab-arena-envs/resolve/main/assets/Gr1OpenMicrowaveEnvironment.png"
  alt="IsaacLab Arena - GR1 Microwave Environment"
  style={{ maxWidth: "100%", borderRadius: "8px", marginBottom: "1rem" }}
/>

[IsaacLab Arena](https://github.com/isaac-sim/IsaacLab-Arena) s'intègre à NVIDIA IsaacLab pour fournir :

- 🤖 **Corps humanoïdes** : GR1, G1, Galileo avec diverses configurations
- 🎯 **Tâches de manipulation et de loco-manipulation** : ouverture de porte, pick-and-place, appui sur bouton, et plus
- ⚡ **Rollouts accélérés par GPU** : Exécution parallèle des environnements sur des GPU NVIDIA
- 🖼️ **Rendu RTX** : Évaluer les politiques basées sur la vision avec un rendu réaliste, des réflexions et des réfractions
- 📦 **Jeanneaux de données compatibles LeRobot** : Prêts pour l'entraînement avec GR00T N1x, PI0, SmolVLA, ACT et les politiques Diffusion
- 🔄 **Intégration EnvHub** : Chargez des environnements depuis HuggingFace EnvHub en une seule ligne

## Installation

### Prérequis

Les exigences matérielles sont partagées avec Isaac Sim et sont détaillées dans [Isaac Sim Requirements](https://docs.isaacsim.omniverse.nvidia.com/5.1.0/installation/requirements.html).

- GPU NVIDIA avec prise en charge de CUDA
- Pilote NVIDIA compatible avec IsaacSim 5.1.0
- Linux (Ubuntu 22.04 / 24.04)

### Configuration

```bash
# 1. Create conda environment
conda create -y -n lerobot-arena python=3.11
conda activate lerobot-arena
conda install -y -c conda-forge ffmpeg=7.1.1

# 2. Install Isaac Sim 5.1.0
pip install "isaacsim[all,extscache]==5.1.0" --extra-index-url https://pypi.nvidia.com

# Accept NVIDIA EULA (required)
export ACCEPT_EULA=Y
export PRIVACY_CONSENT=Y

# 3. Install IsaacLab 2.3.0
git clone https://github.com/isaac-sim/IsaacLab.git
cd IsaacLab
git checkout v2.3.0
./isaaclab.sh -i
cd ..

# 4. Install IsaacLab Arena
git clone https://github.com/isaac-sim/IsaacLab-Arena.git
cd IsaacLab-Arena
git checkout release/0.1.1
pip install -e .
cd ..

# 5. Install LeRobot (evaluation extra for env/policy evaluation)
git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[evaluation]"

# 6. Install additional dependencies
pip install onnxruntime==1.23.2 lightwheel-sdk==1.0.1 vuer[all]==0.0.70 qpsolvers==4.8.1
pip install numpy==1.26.0 # Isaac Sim 5.1 depends on numpy==1.26.0, this will be fixed in next release
```

## Évaluation des politiques

### Politiques pré-entraînées

Les politiques entraînées suivantes sont disponibles :

| Politique                      | Architecture | Tâche          | Lien                                                                     |
| :-------------------------- | :----------- | :------------ | :----------------------------------------------------------------------- |
| pi05-arena-gr1-microwave    | PI0.5        | GR1 Micro-ondes | [HuggingFace](https://huggingface.co/nvidia/pi05-arena-gr1-microwave)    |
| smolvla-arena-gr1-microwave | SmolVLA      | GR1 Micro-ondes | [HuggingFace](https://huggingface.co/nvidia/smolvla-arena-gr1-microwave) |

### Évaluer SmolVLA

```bash
pip install -e ".[smolvla]"
pip install numpy==1.26.0 # revert numpy to version 1.26
```

```bash
lerobot-eval \
    --policy.path=nvidia/smolvla-arena-gr1-microwave \
    --env.type=isaaclab_arena \
    --env.hub_path=nvidia/isaaclab-arena-envs \
    --rename_map='{"observation.images.robot_pov_cam_rgb": "observation.images.robot_pov_cam"}' \
    --policy.device=cuda \
    --env.environment=gr1_microwave \
    --env.embodiment=gr1_pink \
    --env.object=mustard_bottle \
    --env.headless=false \
    --env.enable_cameras=true \
    --env.video=true \
    --env.video_length=10 \
    --env.video_interval=15 \
    --env.state_keys=robot_joint_pos \
    --env.camera_keys=robot_pov_cam_rgb \
    --trust_remote_code=True \
    --eval.batch_size=1
```

### Évaluer PI0.5

```bash
pip install -e ".[pi]"
pip install numpy==1.26.0 # revert numpy to version 1.26
```

PI0.5 nécessite la désactivation de torch compile pour l'évaluation :

```bash
TORCH_COMPILE_DISABLE=1 TORCHINDUCTOR_DISABLE=1 lerobot-eval \
    --policy.path=nvidia/pi05-arena-gr1-microwave \
    --env.type=isaaclab_arena \
    --env.hub_path=nvidia/isaaclab-arena-envs \
    --rename_map='{"observation.images.robot_pov_cam_rgb": "observation.images.robot_pov_cam"}' \
    --policy.device=cuda \
    --env.environment=gr1_microwave \
    --env.embodiment=gr1_pink \
    --env.object=mustard_bottle \
    --env.headless=false \
    --env.enable_cameras=true \
    --env.video=true \
    --env.video_length=15 \
    --env.video_interval=15 \
    --env.state_keys=robot_joint_pos \
    --env.camera_keys=robot_pov_cam_rgb \
    --trust_remote_code=True \
    --eval.batch_size=1
```

  Pour modifier le nombre d'environnements parallèles, utilisez le drapeau ```--eval.batch_size```.

### À quoi s'attendre

Lors de l'évaluation, vous verrez une barre de progression affichant le taux de réussite en cours :

```
Stepping through eval batches:   8%|██████▍    | 4/50 [00:45<08:06, 10.58s/it, running_success_rate=25.0%]
```

### Enregistrement vidéo

Pour activer l’enregistrement vidéo pendant l’évaluation, ajoutez les drapeaux suivants à votre commande :

```bash
--env.video=true \
--env.video_length=15 \
--env.video_interval=15
```

Pour plus de détails sur l'enregistrement vidéo, consultez la [documentation d'enregistrement IsaacLab](https://isaac-sim.github.io/IsaacLab/main/source/how-to/record_video.html).

Lors de l’exécution en mode sans interface avec `--env.headless=true`, vous devez également activer explicitement les caméras pour les environnements compatibles avec les caméras :

```bash
--env.headless=true --env.enable_cameras=true
```

### Répertoire de sortie

Les vidéos d'évaluation sont enregistrées dans le répertoire de sortie avec la structure suivante :

```
outputs/eval/<date>/<timestamp>_<env>_<policy>/videos/<task>_<env_id>/eval_episode_<n>.mp4
```

Par exemple :

```
outputs/eval/2026-01-02/14-38-01_isaaclab_arena_smolvla/videos/gr1_microwave_0/eval_episode_0.mp4
```

## Politiques d'entraînement

Pour en savoir plus sur l'entraînement des politiques avec LeRobot, veuillez consulter la documentation d'entraînement :

- [SmolVLA](./smolvla)
- [Pi0.5](./pi05)
- [GR00T N1.7](./groot)

Des jeux de données d'exemple pour IsaacLab Arena sont disponibles sur HuggingFace Hub pour des expérimentations :

| Jeu de données                                                                                                   | Description                | Images |
| :-------------------------------------------------------------------------------------------------------- | :------------------------- | :----- |
| [Arena-GR1-Manipulation-Task](https://huggingface.co/datasets/nvidia/Arena-GR1-Manipulation-Task-v3)      | Manipulation micro-ondes GR1 | ~4K    |
| [Arena-G1-Loco-Manipulation-Task](https://huggingface.co/datasets/nvidia/Arena-G1-Loco-Manipulation-Task) | Loco-manipulation G1       | ~4K    |

## Configuration de l'environnement

### Options de configuration complètes

```python
from lerobot.envs.configs import IsaaclabArenaEnvConfig

config = IsaaclabArenaEnvConfig(
    # Environment selection
    environment="gr1_microwave",      # Task environment
    embodiment="gr1_pink",            # Robot embodiment
    object="power_drill",             # Object to manipulate

    # Simulation settings
    episode_length=300,               # Max steps per episode
    headless=True,                    # Run without GUI
    device="cuda:0",                  # GPU device
    seed=42,                          # Random seed

    # Observation configuration
    state_keys="robot_joint_pos",     # State observation keys (comma-separated)
    camera_keys="robot_pov_cam_rgb",  # Camera observation keys (comma-separated)
    state_dim=54,                     # Expected state dimension
    action_dim=36,                    # Expected action dimension
    camera_height=512,                # Camera image height
    camera_width=512,                 # Camera image width
    enable_cameras=True,              # Enable camera observations

    # Video recording
    video=False,                      # Enable video recording
    video_length=100,                 # Frames per video
    video_interval=200,               # Steps between recordings

    # Advanced
    mimic=False,                      # Enable mimic mode
    teleop_device=None,               # Teleoperation device
    disable_fabric=False,             # Disable fabric optimization
    enable_pinocchio=True,            # Enable Pinocchio for IK
)
```

### Utilisation directe d'Environment Hub pour un usage avancé

Créez un fichier nommé `test_env_load_arena.py` ou [téléchargez-le depuis EnvHub](https://huggingface.co/nvidia/isaaclab-arena-envs/blob/main/tests/test_env_load_arena.py) :

```python
import logging
from dataclasses import asdict
from pprint import pformat
import torch
import tqdm
from lerobot.configs import parser
from lerobot.configs.eval import EvalPipelineConfig

@parser.wrap()
def main(cfg: EvalPipelineConfig):
    """Run random action rollout for IsaacLab Arena environment."""
    logging.info(pformat(asdict(cfg)))

    from lerobot.envs import make_env

    env_dict = make_env(
        cfg.env,
        n_envs=cfg.env.num_envs,
        trust_remote_code=True,
    )
    env = next(iter(env_dict.values()))[0]
    env.reset()
    for _ in tqdm.tqdm(range(cfg.env.episode_length)):
        with torch.inference_mode():
            actions = env.action_space.sample()
            obs, rewards, terminated, truncated, info = env.step(actions)
            if terminated.any() or truncated.any():
                obs, info = env.reset()
    env.close()

if __name__ == "__main__":
    main()
```

Exécuter avec :

```bash
python test_env_load_arena.py \
    --env.environment=g1_locomanip_pnp \
    --env.embodiment=gr1_pink \
    --env.object=cracker_box \
    --env.num_envs=4 \
    --env.enable_cameras=true \
    --env.seed=1000 \
    --env.video=true \
    --env.video_length=10 \
    --env.video_interval=15 \
    --env.headless=false \
    --env.hub_path=nvidia/isaaclab-arena-envs \
    --env.type=isaaclab_arena
```

## Créer de nouveaux environnements

Créez d'abord un nouvel environnement IsaacLab Arena en suivant la [documentation d'IsaacLab Arena](https://isaac-sim.github.io/IsaacLab-Arena/release/0.1.1/index.html).

Clonez notre dépôt EnvHub :

```bash
git clone https://huggingface.co/nvidia/isaaclab-arena-envs
```

Modifiez le fichier `example_envs.yaml` en fonction de votre nouvel environnement. [Envoyez](./envhub#step-3-upload-to-the-hub) votre dépôt modifié sur HuggingFace EnvHub.

  Le code de votre environnement IsaacLab Arena doit être disponible localement lors de l'évaluation. Les utilisateurs peuvent cloner votre dépôt d'environnement séparément, ou vous pouvez regrouper le code et les ressources de l'environnement directement dans votre dépôt EnvHub.

Ensuite, lors de l'évaluation, utilisez votre nouvel environnement :

```bash
lerobot-eval \
    --env.hub_path=<your-env-hub-path>/isaaclab-arena-envs \
    --env.environment=<your new environment> \
    ...other flags...
```

Nous attendons avec impatience vos contributions !

## Dépannage

### CUDA hors mémoire

Réduisez `batch_size` ou utilisez un GPU doté d'une VRAM plus importante :

```bash
--eval.batch_size=1
```

### EULA non acceptée

Définissez les variables d’environnement avant l’exécution :

```bash
export ACCEPT_EULA=Y
export PRIVACY_CONSENT=Y
```

### Enregistrement vidéo non fonctionnel

Activer les caméras lors de l’exécution en mode sans interface :

```bash
--env.video=true --env.enable_cameras=true --env.headless=true
```

### Incohérence de la dimension de sortie de la politique

Vérifiez que `action_dim` correspond à votre politique :

```bash
--env.action_dim=36
```

### libGLU.so.1 Erreurs lors de l'initialisation d'Isaac Sim

Vérifiez que les dépendances suivantes sont installées, ce qui est susceptible de se produire sur des machines sans interface graphique.

```bash
sudo apt update && sudo apt install -y libglu1-mesa libxt6
```

## Voir aussi

- [Documentation EnvHub](./envhub) - Utilisation générale d'EnvHub
- [GitHub IsaacLab Arena](https://github.com/isaac-sim/IsaacLab-Arena)
- [Documentation IsaacLab](https://isaac-sim.github.io/IsaacLab/)

## Lightwheel LW-BenchHub

[Lightwheel](https://www.lightwheel.ai) met à disposition `Lightwheel-Libero-Tasks` et `Lightwheel-RoboCasa-Tasks`, comprenant 268 tâches, au sein de l'écosystème LeRobot. LW-BenchHub collecte et génère des jeux de données à grande échelle via la téléopération, conformes à la spécification LeRobot, permettant ainsi des flux de travail d'entraînement et d'évaluation prêts à l'emploi. Grâce à l'interface unifiée fournie par EnvHub, les développeurs peuvent rapidement construire des pipelines expérimentaux de bout en bout.

### Installer

En supposant que vous avez suivi les étapes de [Installation](#installation), vous pouvez installer LW-BenchHub avec :

```bash
conda install pinocchio -c conda-forge -y
pip install numpy==1.26.0 # revert numpy to version 1.26

sudo apt-get install git-lfs && git lfs install

git clone https://github.com/LightwheelAI/lw_benchhub
cd lw_benchhub
git lfs pull # Ensure LFS files (e.g., .usd assets) are downloaded

pip install -e .
```

Pour des instructions plus détaillées, veuillez consulter la [documentation de LW-BenchHub](https://docs.lightwheel.net/lw_benchhub/usage/Installation).

### Lightwheel Tasks Dataset

Les jeux de données LW-BenchHub sont disponibles sur HuggingFace Hub :

| Jeu de données                                                                                                       | Description             | Tâches | Images |
| :------------------------------------------------------------------------------------------------------------ | :---------------------- | :---- | :----- |
| [Lightwheel-Tasks-X7S](https://huggingface.co/datasets/LightwheelAI/Lightwheel-Tasks-X7S)                     | X7S LIBERO et RoboCasa | 117   | ~10.3M |
| [Lightwheel-Tasks-Double-Piper](https://huggingface.co/datasets/LightwheelAI/Lightwheel-Tasks-Double-Piper)   | Double-Piper LIBERO     | 130   | ~6.0M  |
| [Lightwheel-Tasks-G1-Controller](https://huggingface.co/datasets/LightwheelAI/Lightwheel-Tasks-G1-Controller) | G1-Controller LIBERO    | 62    | ~2.7M  |
| [Lightwheel-Tasks-G1-WBC](https://huggingface.co/datasets/LightwheelAI/Lightwheel-Tasks-G1-WBC)               | G1-WBC RoboCasa         | 32    | ~1.5M  |

Pour les politiques d'entraînement, reportez-vous à la section [Training Policies](#training-policies).

### Évaluation des politiques

#### Politiques pré-entraînées

Les politiques entraînées suivantes sont disponibles :

| Politique                   | Architecture | Tâche                           | Mise en page     | Robot           | Lien                                                                                  |
| :----------------------- | :----------- | :----------------------------- | :--------- | :-------------- | :------------------------------------------------------------------------------------ |
| smolvla-double-piper-pnp | SmolVLA      | L90K1PutTheBlackBowlOnThePlate | libero-1-1 | DoublePiper-Abs | [HuggingFace](https://huggingface.co/LightwheelAI/smolvla-double-piper-pnp/tree/main) |

#### Évaluer SmolVLA

```bash
lerobot-eval \
  --policy.path=LightwheelAI/smolvla-double-piper-pnp \
  --env.type=isaaclab_arena \
  --rename_map='{"observation.images.left_hand_camera_rgb": "observation.images.left_hand", "observation.images.right_hand_camera_rgb": "observation.images.right_hand", "observation.images.first_person_camera_rgb": "observation.images.first_person"}' \
  --env.hub_path=LightwheelAI/lw_benchhub_env \
  --env.kwargs='{"config_path": "configs/envhub/example.yml"}' \
  --trust_remote_code=true \
  --env.state_keys=joint_pos \
  --env.action_dim=12 \
  --env.camera_keys=left_hand_camera_rgb,right_hand_camera_rgb,first_person_camera_rgb \
  --policy.device=cuda \
  --eval.batch_size=10 \
  --eval.n_episodes=100
```

### Configuration de l'environnement

L'évaluation peut être lancée rapidement en modifiant les paramètres `robot`, `task` et `layout` dans le fichier de configuration.

#### Options de configuration complètes

```yml
# =========================
# Basic Settings
# =========================
disable_fabric: false
device: cuda:0
sensitivity: 1.0
step_hz: 50
enable_cameras: true
execute_mode: eval
episode_length_s: 20.0 # Episode length in seconds, increase if episodes timeout during eval

# =========================
# Robot Settings
# =========================
robot: DoublePiper-Abs # Robot type, DoublePiper-Abs, X7S-Abs, G1-Controller or G1-Controller-DecoupledWBC
robot_scale: 1.0

# =========================
# Task & Scene Settings
# =========================
task: L90K1PutTheBlackBowlOnThePlate # Task name
scene_backend: robocasa
task_backend: robocasa
debug_assets: null
layout: libero-1-1 # Layout and style ID
sources:
  - objaverse
  - lightwheel
  - aigen_objs
object_projects: []
usd_simplify: false
seed: 42

# =========================
# Object Placement Retry Settings
# =========================
max_scene_retry: 4
max_object_placement_retry: 3

resample_objects_placement_on_reset: true
resample_robot_placement_on_reset: true

# =========================
# Replay Configuration Settings
# =========================
replay_cfgs:
  add_camera_to_observation: true
  render_resolution: [640, 480]
```

### Voir aussi

- [GitHub de LW-BenchHub](https://github.com/LightwheelAI/LW-BenchHub)
- [Documentation de LW-BenchHub](https://docs.lightwheel.net/lw_benchhub/)

