# NVIDIA RoboLab

RoboLab es un benchmark de **120 tareas de manipulación sobre una mesa** para un robot DROID (un brazo Franka Panda con una pinza Robotiq 2F-85), simulado con NVIDIA Isaac Lab y renderizado con el renderizador RTX de Isaac Sim. Las tareas abarcan pick-and-place, apilado, clasificación, reorientación y variantes condicionadas por lenguaje (relaciones espaciales, colores, conteo, instrucciones vagas), clasificadas como simples, moderadas o complejas.

- Artículo: [RoboLab: A High-Fidelity Simulation Benchmark for Analysis of Task Generalist Policies](https://arxiv.org/abs/2604.09860)
- GitHub: [NVlabs/RoboLab](https://github.com/NVlabs/RoboLab)
- Página del proyecto y clasificación: [research.nvidia.com/labs/srl/projects/robolab](https://research.nvidia.com/labs/srl/projects/robolab/)

## Requisitos y licencias

- **GPU**: una GPU NVIDIA RTX (Isaac Sim renderiza con RTX). Un env de una tarea ocupa aproximadamente 7 GB de VRAM, incluido Isaac Sim; cada env adicional en la misma tarea añade entre 1 y 2 GB (la guía de RoboLab indica que una GPU de 48 GB puede soportar de 30 a 100 envs, dependiendo de la tarea). Tu policy necesita memoria adicional aparte.
- **Isaac Sim**: RoboLab se ejecuta aquí con Isaac Sim 6.0.1 e Isaac Lab 3.0 beta 2, el stack de Isaac Sim 6 de RoboLab. Al usar Isaac Sim se acepta la [licencia de NVIDIA Isaac Sim](https://docs.isaacsim.omniverse.nvidia.com/latest/common/NVIDIA_Omniverse_License_Agreement.html); la imagen de Docker la acepta por ti, al igual que la propia imagen de RoboLab.
- **Recursos**: las escenas, objetos y modelos de robots de RoboLab (unos 6 GB, de su git LFS) están licenciados principalmente bajo **CC BY-NC-SA 4.0**, aunque algunos lo están bajo otros términos; consulte [THIRD_PARTY_NOTICES.md](https://github.com/NVlabs/RoboLab/blob/main/THIRD_PARTY_NOTICES.md) de RoboLab. LeRobot no los distribuye: la imagen los descarga de NVlabs cuando se construye.
- **Docker**, para la configuración de servidor siguiente: [BuildKit (`docker buildx`)](https://docs.docker.com/go/buildx/) para construir la imagen, y el [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) para que el contenedor pueda usar la GPU.

## Ejecútalo servido (recomendado)

Isaac Lab 3.0 beta fija `transformers==4.57.6` (por lo tanto `huggingface-hub<1.0`), `numpy==2.3.1` y `packaging==26.0`, que las propias dependencias de LeRobot no aceptan. Ejecuta RoboLab en su propia imagen Docker, detrás de `lerobot-env-server`, y tu política en tu entorno habitual de LeRobot:

```bash
# Build the image on first use (Isaac Sim and the assets: a long first build), then serve every task
lerobot-env-server --config_path=docker/sim/configs/robolab.yaml --docker=true

# In your LeRobot environment
lerobot-eval \
  --policy.path=<your DROID joint-position policy> \
  --env.type=robolab \
  --env.task=BananaInBowlTask \
  --env.server.endpoint=tcp/127.0.0.1:7448 \
  --rename_map='{"observation.images.over_shoulder_left_camera": "observation.images.<exterior>", "observation.images.wrist_cam": "observation.images.<wrist>"}' \
  --eval.batch_size=1 \
  --eval.n_episodes=10
```

El servidor ejecuta cualquiera de sus tareas configuradas: el cliente abre la que solicita y el servidor la construye en el Isaac Sim en ejecución (unos segundos). Iniciar el propio Isaac Sim tarda desde segundos hasta unos minutos. Si no encuentra una GPU en el contenedor (`ERROR_INCOMPATIBLE_DRIVER`), consulte la nota sobre Vulkan en [Simulation](./simulation#serve-an-environment).

## Ejecútalo localmente

Con Isaac Sim y RoboLab instalados en su entorno, agregue `--env.server.endpoint` y `lerobot-eval` ejecutará RoboLab en su propio proceso. Instale primero la pila de RoboLab y luego LeRobot sin sus dependencias, tal como lo hace la imagen de Docker:

```bash
GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/NVlabs/RoboLab.git && git -C RoboLab lfs pull
uv venv --python 3.12 && source .venv/bin/activate
uv pip install "isaaclab[isaacsim]==3.0.0b2.post1" -e ./RoboLab \
  --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match
uv pip install --no-deps -e ./lerobot
uv pip install draccus termcolor eclipse-zenoh  # what the rest of LeRobot's simulation code imports
export OMNI_KIT_ACCEPT_EULA=YES                 # accepts the Isaac Sim license
```

Este entorno no tiene espacio para políticas que requieran `transformers` 5 (π₀.₅, SmolVLA, ...): ejecútalas servidas.

## Tareas

Cada una de las 120 tareas de RoboLab es su propia suite con un identificador de tarea, por lo que `lerobot-eval` informa una tasa de éxito por tarea y en general. `--env.task` acepta una lista de nombres de tareas separados por comas, p. ej. `BananaInBowlTask,RubiksCubeAndBananaTask`; déjalo vacío para todas las 120. Los nombres de las tareas, las instrucciones y la dificultad se enumeran en los [metadatos de tareas](https://github.com/NVlabs/RoboLab/blob/main/robolab/tasks/_metadata/task_metadata.json) de RoboLab.

Todos los entornos de una tarea comparten un mismo mundo de Isaac Lab en la GPU: `--eval.batch_size=N` ejecuta N episodios a la vez en ese mundo.

## Observaciones y acciones

| Clave                                            | Forma          | Contenido                                                                     |
| ---------------------------------------------- | -------------- | --------------------------------------------------------------------------- |
| `observation.images.over_shoulder_left_camera` | 720 × 1280 × 3 | Cámara exterior, a la izquierda del robot                                          |
| `observation.images.wrist_cam`                 | 720 × 1280 × 3 | Cámara de muñeca                                                                |
| `observation.state`                            | 8              | `joint_0.pos` … `joint_6.pos` (radianes), `gripper.pos` (0 abierto, 1 cerrado)   |
| `action`                                       | 8              | Objetivos absolutos conjuntos para las 7 articulaciones, luego el agarre: cerrado por encima de 0.5 |

El robot se ejecuta a 15 Hz (la física a 120 Hz, 8 pasos de física por acción), y LeRobot lo registra como `robot_type="Franka"`, tal como en [DROID](https://huggingface.co/datasets/lerobot/droid_1.0.1). Cada episodio tiene el límite de tiempo de su tarea (de 20 a 300 s, es decir, de 300 a 4.500 pasos); un episodio que tiene éxito termina como terminado, y uno que agota el tiempo como truncado. La instrucción de la tarea es la descripción de la tarea del entorno.

## Robot de simulación

RoboLab también puede sustituir a un robot DROID real en `lerobot-rollout`, `lerobot-record` y las demás herramientas de robots (ver [Simulación: local o servida](./simulation)):

```bash
lerobot-rollout \
  --robot.type=sim --robot.env.type=robolab --robot.env.task=BananaInBowlTask --robot.task_id=0 \
  --robot.env.server.endpoint=tcp/127.0.0.1:7448 \
  --policy.path=<your policy> --fps=15 ...
```

## Referencia de configuración del entorno

| Parámetro                                 | Predeterminado           | Descripción                                                                                                                     |
| ----------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `task`                                    | empty: todos los 120    | Nombres de tareas separados por comas                                                                                                      |
| `cameras`                                 | `"WRIST_LEFT"`    | Un preset de cámara de `robolab/registrations/droid/camera_presets.py` de RoboLab, por ejemplo `WRIST_LEFT_RIGHT` para ambas cámaras exteriores |
| `instruction_type`                        | `"default"`       | Qué instrucción da cada tarea: `default`, `vague` o `specific`                                                             |
| `observation_height`, `observation_width` | no definido: 720 × 1280 | Redimensiona los fotogramas de la cámara primero en la GPU, por ejemplo, para enviar fotogramas más pequeños desde un servidor                                                |

## Comparación con el tablero de clasificación

El tablero de clasificación de RoboLab evalúa 10 episodios por tarea con la instrucción predeterminada, las cámaras `WRIST_LEFT` y acciones de posición de articulaciones, que son los valores predeterminados de LeRobot. No especifica qué versión de Isaac Sim generó sus resultados, y el valor predeterminado de RoboLab es Isaac Sim 5.0: la física y el renderizado difieren entre versiones de Isaac Sim, por lo que los resultados de esta configuración de Isaac Sim 6.0.1 no son directamente comparables.

