LeRobot documentation

LeIsaac × LeRobot EnvHub

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

LeIsaac × LeRobot EnvHub

LeRobot EnvHub prend désormais en charge l’apprentissage par imitation en simulation avec LeIsaac. Lancez des tâches de manipulation courantes, téléopérez le robot, collectez des démonstrations, publiez-les sur le Hub et entraînez des politiques dans LeRobot — le tout dans une seule boucle.

LeIsaac s'intègre à IsaacLab et à la configuration Leader/Follower SO101 pour fournir :

  • 🕹️ Flux de travail axés sur la téléopération pour la collecte de données
  • 📦 Conversion de données intégrée prête pour l'entraînement LeRobot
  • 🤖 Compétences du quotidien comme cueillir des oranges, soulever des cubes, nettoyer des tables et plier du tissu
  • ☁️ Mises à jour en cours de la part de LightWheel : simulation cloud, prise en charge d'EnvHub, outils Sim2Real et plus encore

Vous trouverez ci-dessous les tâches LeIsaac actuellement prises en charge et exposées via LeRobot EnvHub.

Environnements disponibles

Le tableau suivant répertorie toutes les tâches et environnements disponibles dans LeIsaac x LeRobot EnvHub. Vous pouvez également obtenir la liste la plus récente des environnements en exécutant la commande suivante :

python scripts/environments/list_envs.py
TâcheID de l'environnementDescription de la tâcheRobot associé
LeIsaac-SO101-PickOrange-v0

LeIsaac-SO101-PickOrange-Direct-v0
Prenez trois oranges et placez-les dans l'assiette, puis réinitialisez le bras à l'état de repos.Suiveur SO101 à un seul bras
LeIsaac-SO101-LiftCube-v0

LeIsaac-SO101-LiftCube-Direct-v0
Soulevez le cube rouge.Suiveur SO101 à un seul bras
LeIsaac-SO101-CleanToyTable-v0

LeIsaac-SO101-CleanToyTable-BiArm-v0

LeIsaac-SO101-CleanToyTable-BiArm-Direct-v0
Placez deux objets en forme de lettre e dans la boîte, puis réinitialisez le bras à l'état de repos.Suiveur SO101 à un bras

Suiveur SO101 à deux bras
LeIsaac-SO101-FoldCloth-BiArm-v0

LeIsaac-SO101-FoldCloth-BiArm-Direct-v0
Repliez le tissu et réinitialisez le bras à l'état de repos.

Remarque : Seule DirectEnv prend en charge check_success dans cette tâche.
Bi-Bras SO101 Follower

Charger LeIsaac directement dans LeRobot en une seule ligne de code

EnvHub : Partagez les environnements LeIsaac via HuggingFace

EnvHub est notre hub d’environnements reproductibles : lancez une simulation packagée en une seule ligne, expérimentez immédiatement et publiez vos propres tâches pour la communauté.

LeIsaac prend en charge EnvHub, ce qui vous permet de consommer ou de partager des tâches avec seulement quelques commandes.

Comment démarrer, configuration de l'environnement

Exécutez les commandes suivantes pour configurer vos environnements de code :

# Refer to Getting Started/Installation to install leisaac firstly
conda create -n leisaac_envhub python=3.11
conda activate leisaac_envhub

conda install -c "nvidia/label/cuda-12.8.1" cuda-toolkit
pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128
pip install 'leisaac[isaaclab] @ git+https://github.com/LightwheelAI/leisaac.git#subdirectory=source/leisaac' --extra-index-url https://pypi.nvidia.com

# Install lerobot
pip install lerobot==0.4.1

# Fix numpy version
pip install numpy==1.26.0

Exemple d'utilisation

EnvHub expose chaque tâche prise en charge par LeIsaac via une interface uniforme. Les exemples ci-dessous chargent so101_pick_orange et illustrent un déroulement d’actions aléatoires ainsi qu’une téléopération interactive.

Action aléatoire

Click to expand code example
# envhub_random_action.py

import torch
from lerobot.envs import make_env

# Load from the hub
envs_dict = make_env("LightwheelAI/leisaac_env:envs/so101_pick_orange.py", n_envs=1, trust_remote_code=True)

# Access the environment
suite_name = next(iter(envs_dict))
sync_vector_env = envs_dict[suite_name][0]
# retrieve the isaac environment from the sync vector env
env = sync_vector_env.envs[0].unwrapped

# Use it like any gym environment
obs, info = env.reset()

while True:
    action = torch.tensor(env.action_space.sample())
    obs, reward, terminated, truncated, info = env.step(action)
    if terminated or truncated:
        obs, info = env.reset()

env.close()
python envhub_random_action.py

Vous devriez voir le bras SO101 se balancer sous des commandes purement aléatoires.

Téléopération

La pile de téléopération de LeRobot peut piloter le bras simulé.

Connectez le contrôleur SO101 Leader et exécutez la commande de calibration ci-dessous.

lerobot-calibrate \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM0 \
    --teleop.id=leader

Puis lancez le script de téléopération.

Click to expand code example
# envhub_teleop_example.py

import logging
import time
import gymnasium as gym

from dataclasses import asdict, dataclass
from pprint import pformat

from lerobot.teleoperators import (  # noqa: F401
    Teleoperator,
    TeleoperatorConfig,
    make_teleoperator_from_config,
    so_leader,
    bi_so_leader,
)
from lerobot.utils.robot_utils import precise_sleep
from lerobot.utils.utils import init_logging
from lerobot.envs import make_env


@dataclass
class TeleoperateConfig:
    teleop: TeleoperatorConfig
    env_name: str = "so101_pick_orange"
    fps: int = 60


@dataclass
class EnvWrap:
    env: gym.Env


def make_env_from_leisaac(env_name: str = "so101_pick_orange"):
    envs_dict = make_env(
        f'LightwheelAI/leisaac_env:envs/{env_name}.py',
        n_envs=1,
        trust_remote_code=True
    )
    suite_name = next(iter(envs_dict))
    sync_vector_env = envs_dict[suite_name][0]
    env = sync_vector_env.envs[0].unwrapped

    return env


def teleop_loop(teleop: Teleoperator, env: gym.Env, fps: int):
    from leisaac.devices.action_process import preprocess_device_action
    from leisaac.assets.robots.lerobot import SO101_FOLLOWER_MOTOR_LIMITS
    from leisaac.utils.env_utils import dynamic_reset_gripper_effort_limit_sim

    env_wrap = EnvWrap(env=env)

    obs, info = env.reset()
    while True:
        loop_start = time.perf_counter()
        if env.cfg.dynamic_reset_gripper_effort_limit:
            dynamic_reset_gripper_effort_limit_sim(env, 'so101leader')

        raw_action = teleop.get_action()
        processed_action = preprocess_device_action(
            dict(
                so101_leader=True,
                joint_state={
                    k.removesuffix(".pos"): v for k, v in raw_action.items()},
                motor_limits=SO101_FOLLOWER_MOTOR_LIMITS),
            env_wrap
        )
        obs, reward, terminated, truncated, info = env.step(processed_action)
        if terminated or truncated:
            obs, info = env.reset()

        dt_s = time.perf_counter() - loop_start
        precise_sleep(max(1 / fps - dt_s, 0.0))
        loop_s = time.perf_counter() - loop_start
        print(f"\ntime: {loop_s * 1e3:.2f}ms ({1 / loop_s:.0f} Hz)")


def teleoperate(cfg: TeleoperateConfig):
    init_logging()
    logging.info(pformat(asdict(cfg)))

    teleop = make_teleoperator_from_config(cfg.teleop)
    env = make_env_from_leisaac(cfg.env_name)

    teleop.connect()
    if hasattr(env, 'initialize'):
        env.initialize()
    try:
        teleop_loop(teleop=teleop, env=env, fps=cfg.fps)
    except KeyboardInterrupt:
        pass
    finally:
        teleop.disconnect()
        env.close()


def main():
    teleoperate(TeleoperateConfig(
        teleop=so_leader.SO101LeaderConfig(
            port="/dev/ttyACM0",
            id='leader',
            use_degrees=False,
        ),
        env_name="so101_pick_orange",
        fps=60,
    ))


if __name__ == "__main__":
    main()
python envhub_teleop_example.py

L’exécution du script vous permet de piloter le bras simulé à l’aide du dispositif physique Leader.

☁️ Simulation sur le cloud (aucun GPU requis)

Pas de GPU local ou des pilotes appropriés ? Pas de souci ! Vous pouvez exécuter LeIsaac entièrement dans le cloud, sans aucune configuration. LeIsaac fonctionne immédiatement sur NVIDIA Brev, vous offrant un environnement entièrement configuré directement dans votre navigateur.

👉 Commencez ici : https://lightwheelai.github.io/leisaac/docs/cloud_simulation/nvidia_brev

Une fois votre instance déployée, il suffit d’ouvrir le lien pour le port 80 (HTTP) pour lancer Visual Studio Code Server (mot de passe par défaut : password). À partir de là, vous pouvez exécuter des simulations, modifier du code et visualiser les environnements IsaacLab — le tout depuis votre navigateur web.

Aucun GPU, aucun pilote, aucune installation locale. Il suffit de cliquer et d’exécuter.

Notes supplémentaires

Nous maintenons la couverture EnvHub alignée avec la tâche LeIsaac. Actuellement pris en charge :

  • so101_pick_orange
  • so101_lift_cube
  • so101_clean_toytable
  • bi_so101_fold_cloth

Changez de tâche en ciblant un script différent lors de l’appel de make_env, par exemple :

envs_dict_pick_orange = make_env("LightwheelAI/leisaac_env:envs/so101_pick_orange.py", n_envs=1, trust_remote_code=True)
envs_dict_lift_cube = make_env("LightwheelAI/leisaac_env:envs/so101_lift_cube.py", n_envs=1, trust_remote_code=True)
envs_dict_clean_toytable = make_env("LightwheelAI/leisaac_env:envs/so101_clean_toytable.py", n_envs=1, trust_remote_code=True)
envs_dict_fold_cloth = make_env("LightwheelAI/leisaac_env:envs/bi_so101_fold_cloth.py", n_envs=1, trust_remote_code=True)

Remarque : lors de l'utilisation de bi_so101_fold_cloth, appelez initialize() immédiatement après avoir récupéré l'environnement, avant d'effectuer toute autre opération :

Click to expand code example
import torch
from lerobot.envs import make_env

# Load from the hub
envs_dict = make_env("LightwheelAI/leisaac_env:envs/bi_so101_fold_cloth.py", n_envs=1, trust_remote_code=True)

# Access the environment
suite_name = next(iter(envs_dict))
sync_vector_env = envs_dict[suite_name][0]
# retrieve the isaac environment from the sync vector env
env = sync_vector_env.envs[0].unwrapped

# NOTE: initialize() first
env.initialize()

# other operation with env...
Update on GitHub