LeRobot documentation
Robots
Robots
Chaque robot dans LeRobot implémente l'interface Robot : connect, read an observation, send an action, disconnect. Écrire une politique ou un script d'enregistrement en s'appuyant sur cette interface garantit qu'il fonctionne avec n'importe quel bras pris en charge, sans modification.
Cette page est la référence générée. Pour le câblage, l'étalonnage et les instructions de première exécution, commencez par les guides matériel — SO-101, LeKiwi, Hope Jr, Reachy 2, OpenArm — ou Imitation Learning for Robots pour le flux de travail de bout en bout. Pour les robots maintenus par la communauté en dehors du jeu de base, consultez Third-Party Robots & Teleoperators. Pour ajouter votre propre robot, consultez Bring Your Own Hardware.
Robot
La classe de base abstraite. Les sous-classes implémentent chaque méthode ci-dessous ; le contrat décrit ici est ce sur quoi une politique ou une boucle d’enregistrement peut s’appuyer.
classe lerobot.robots.Robot
< source >( config: RobotConfig )
Classe abstraite de base pour tous les robots compatibles LeRobot.
Cette classe fournit une interface standardisée pour interagir avec des robots physiques. Les sous-classes doivent implémenter toutes les méthodes et propriétés abstraites pour être utilisables.
connect
< source >( calibrate: bool = True )
Établir la communication avec le robot.
Déconnectez-vous du robot et effectuez le nettoyage nécessaire.
Appliquez toute configuration à usage unique ou d'exécution au robot. Cela peut inclure la définition des paramètres des moteurs, des modes de contrôle ou de l'état initial.
Calibrez le robot le cas échéant. Sinon, cette opération ne doit rien faire.
Cette méthode doit collecter les données nécessaires (par exemple, les décalages moteurs) et mettre à jour le dictionnaire
:pyattr:calibration en conséquence.
get_observation
< source >( ) → RobotObservation
Retourne
RobotObservation
Un dictionnaire plat représentant l'état sensoriel actuel du robot. Sa structure doit correspondre à :pymeth:observation_features.
Récupérer l'observation actuelle du robot.
send_action
< source >( action: dict ) → RobotAction
Envoyer une commande d'action au robot.
Un dictionnaire décrivant la structure et les types des observations produites par le robot.
Sa structure (clés) doit correspondre à celle de ce qui est renvoyé par :pymeth:get_observation.
Les valeurs du dictionnaire doivent être :
- Le type de la valeur s'il s'agit d'une valeur simple, par exemple
floatpour une valeur proprioceptive unique (position/vitesse d'une articulation) - Un tuple représentant la forme s'il s'agit d'une valeur de type tableau, par exemple
(height, width, channel)pour les images
Note : cette propriété doit pouvoir être appelée, que le robot soit connecté ou non.
Un dictionnaire décrivant la structure et les types des actions attendues par le robot. Sa structure (clés) doit correspondre à celle de ce qui est transmis à :pymeth:send_action. Les valeurs du dictionnaire doivent être le type de la valeur s’il s’agit d’une valeur simple, par exemple float pour une valeur proprioceptive unique (position/vitesse cible d’une articulation)
Note : cette propriété doit pouvoir être appelée, que le robot soit connecté ou non.
Indique si le robot est actuellement connecté ou non. Si False, l'appel de :pymeth:get_observation ou
:pymeth:send_action doit lever une erreur.
Indique si le robot est actuellement calibré ou non. Doit toujours être True si non applicable
RobotConfig
classe lerobot.robots.RobotConfig
< source >( id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
make_robot_from_config
Les adeptes du SO-100 et du SO-101
SO100Follower et SO101Follower sont des alias de la même classe SOFollower ; les deux bras diffèrent par leur
configuration, et non par leur code de contrôle. SO100FollowerConfig et SO101FollowerConfig sont de même des alias
de SOFollowerRobotConfig.
Base générique de suiveur SO implémentant les fonctionnalités communes pour SO-100/101/10X.
Conçue pour être sous-classée avec un config_class et un name spécifiques au modèle de matériel.
Nous supposons qu'au moment de la connexion, le bras est en position de repos et que le couple peut être désactivé en toute sécurité pour exécuter l'étalonnage.
send_action
< source >( action: dict ) → RobotAction
Retourne
RobotAction
l'action envoyée aux moteurs, potentiellement tronquée.
Lève
RobotDeviceNotConnectedError
RobotDeviceNotConnectedError— si le robot n'est pas connecté.
Commander le bras pour se déplacer vers une configuration articulaire cible.
L'amplitude relative de l'action peut être rognée en fonction du paramètre de configuration max_relative_target. Dans ce cas, l'action envoyée diffère de l'action d'origine.
Ainsi, cette fonction renvoie toujours l'action réellement envoyée.
classe lerobot.robots.so_follower.SOFollowerRobotConfig
< source >( port: strdisable_torque_on_disconnect: bool = Truemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>use_degrees: bool = Trueposition_p_coefficient: int = 16position_i_coefficient: int = 0position_d_coefficient: int = 32num_read_retries: int = 2id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
BiSOFollower
Deux adeptes de SO pilotés comme un robot bimane unique.
Bras suiveurs SO bimanuels conçus par TheRobotStudio
classe lerobot.robots.bi_so_follower.BiSOFollowerConfig
< source >( left_arm_config: SOFollowerConfigright_arm_config: SOFollowerConfigcameras: dict = <factory>id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Classe de configuration pour les robots Bi SO Follower.
KochFollower
- Koch v1.0, avec et sans l'extension poignet-coude, développé par Alexander Koch de Tau Robotics
- Koch v1.1 développé par Jess Moss
Nous supposons qu'au moment de la connexion, le bras est en position de repos et que le couple peut être désactivé en toute sécurité pour exécuter l'étalonnage.
send_action
< source >( action: dict ) → RobotAction
Commander le bras pour se déplacer vers une configuration articulaire cible.
L'amplitude relative de l'action peut être rognée en fonction du paramètre de configuration max_relative_target. Dans ce cas, l'action envoyée diffère de l'action d'origine.
Ainsi, cette fonction renvoie toujours l'action réellement envoyée.
classe lerobot.robots.koch_follower.KochFollowerConfig
< source >( port: strdisable_torque_on_disconnect: bool = Truemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>use_degrees: bool = Falseid: str | None = Nonecalibration_dir: pathlib.Path | None = None )
LeKiwi
LeKiwi s’exécute directement sur le robot. LeKiwiClient est le proxy côté hôte qui communique avec lui via le réseau et expose la même interface Robot.
Le robot comprend une base mobile à trois roues omni et un bras suiveur distant. Le bras leader est connecté localement (sur le portable) et ses positions articulaires sont enregistrées puis transmises au bras suiveur distant (après application d'une limite de sécurité). En parallèle, la téléopération au clavier est utilisée pour générer des commandes de vitesse brutes pour les roues.
send_action
< source >( action: dict ) → RobotAction
Retourne
RobotAction
l'action envoyée aux moteurs, potentiellement tronquée.
Lève
RobotDeviceNotConnectedError
RobotDeviceNotConnectedError— si le robot n'est pas connecté.
Commandez lekiwi pour qu'il se déplace vers une configuration articulaire cible.
L'amplitude relative de l'action peut être rognée en fonction du paramètre de configuration max_relative_target. Dans ce cas, l'action envoyée diffère de l'action d'origine.
Ainsi, cette fonction renvoie toujours l'action réellement envoyée.
classe lerobot.robots.lekiwi.LeKiwiConfig
< source >( port: str = '/dev/ttyACM0'disable_torque_on_disconnect: bool = Truemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>use_degrees: bool = Truenum_read_retries: int = 2id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Établit des sockets ZMQ avec le robot mobile distant
Nettoie les communications ZMQ
Capture les observations du robot distant : positions actuelles des bras suiveurs, vitesses actuelles des roues (converties en vitesses dans le repère du corps : x, y, theta), et une image de la caméra. Reçoit via ZMQ, convertit en vitesses dans le
send_action
< source >( action: dict ) → np.ndarray
Commandez lekiwi pour se déplacer vers une configuration articulaire cible. Traduit vers l'espace moteur + envoie via ZMQ
classe lerobot.robots.lekiwi.LeKiwiClientConfig
< source >( remote_ip: strport_zmq_cmd: int = 5555port_zmq_observations: int = 5556teleop_keys: dict = <factory>cameras: dict = <factory>polling_timeout_ms: int = 15connect_timeout_s: int = 5id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
OpenArmFollower
Robot suiveur OpenArms qui utilise la communication par bus CAN pour contrôler un bras à 7 degrés de liberté avec une pince. Le bras utilise des moteurs Damiao en mode de contrôle MIT.
Exécuter la procédure de calibration pour le robot OpenArms.
La procédure de calibration :
- Désactiver le couple
- Demander à l'utilisateur de positionner les bras en position suspendue avec les pinces fermées
- Définir ceci comme position zéro
- Enregistrer l'amplitude de mouvement de chaque articulation
- Enregistrer l'étalonnage
Configurez les moteurs avec les paramètres appropriés.
Connectez-vous au robot et, le cas échéant, effectuez une calibration.
Nous supposons qu'au moment de la connexion, les bras sont dans une position de repos sûre, et que le couple peut être désactivé en toute sécurité pour effectuer une calibration si nécessaire.
Déconnectez-vous du robot.
Obtenir l'observation actuelle du robot, y compris la position, la vitesse et le couple.
Lit tous les états des moteurs (pos/vel/torque) dans un seul cycle de rafraîchissement CAN au lieu de 3 lectures séparées.
send_action
< source >( action: dictcustom_kp: dict[str, float] | None = Nonecustom_kd: dict[str, float] | None = None )
Paramètres
- action — Dictionnaire contenant les positions des moteurs (par exemple, “joint_1.pos”, “joint_2.pos”)
- custom_kp — Gains kp personnalisés par moteur (facultatif) (par ex. {“joint_1”: 120.0, “joint_2”: 150.0})
- custom_kd — Gains kd personnalisés optionnels par moteur (par ex. {“joint_1”: 1.5, “joint_2”: 2.0})
Envoyer une commande d'action au robot.
L'amplitude de l'action peut être limitée en fonction des limites de sécurité.
classe lerobot.robots.openarm_follower.OpenArmFollowerConfig
< source >( port: strside: str | None = Nonecan_interface: str = 'socketcan'use_can_fd: bool = Truecan_bitrate: int = 1000000can_data_bitrate: int = 5000000disable_torque_on_disconnect: bool = Trueuse_velocity_and_torque: bool = Falsemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>motor_config: dict = <factory>position_kp: list = <factory>position_kd: list = <factory>joint_limits: dict = <factory>id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
BiOpenArmFollower
classe lerobot.robots.bi_openarm_follower.BiOpenArmFollower
< source >( config: BiOpenArmFollowerConfig )
Bras suiveurs bimanuels OpenArm
classe lerobot.robots.bi_openarm_follower.BiOpenArmFollowerConfig
< source >( id: str | None = 'bi_openarm_follower'calibration_dir: pathlib.Path | None = Noneleft_arm_config: OpenArmFollowerConfigBaseright_arm_config: OpenArmFollowerConfigBasecameras: dict = <factory> )
Classe de configuration pour les robots Bi OpenArm Follower.
OmxFollower
Pour les robots OMX livrés pré-calibrés :
- Si l'étalonnage par défaut du package ne correspond pas aux moteurs, lisez depuis les moteurs et enregistrez
- Cela permet d'utiliser des robots pré-calibrés sans calibration manuelle
- Si aucun fichier de calibration n'existe, utilisez les valeurs par défaut d'usine (homing_offset=0, range_min=0, range_max=4095)
send_action
< source >( action: dict ) → RobotAction
Commander le bras pour se déplacer vers une configuration articulaire cible.
L'amplitude relative de l'action peut être rognée en fonction du paramètre de configuration max_relative_target. Dans ce cas, l'action envoyée diffère de l'action d'origine.
Ainsi, cette fonction renvoie toujours l'action réellement envoyée.
classe lerobot.robots.omx_follower.OmxFollowerConfig
< source >( port: strdisable_torque_on_disconnect: bool = Truemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>use_degrees: bool = Falseid: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Reachy2Robot
Reachy 2, de Pollen Robotics.
classe lerobot.robots.reachy2.Reachy2RobotConfig
< source >( max_relative_target: float | None = Noneip_address: str | None = 'localhost'port: int = 50065disable_torque_on_disconnect: bool = Falseuse_external_commands: bool = Falsewith_mobile_base: bool = Truewith_l_arm: bool = Truewith_r_arm: bool = Truewith_neck: bool = Truewith_antennas: bool = Truewith_left_teleop_camera: bool = Falsewith_right_teleop_camera: bool = Falsewith_torso_camera: bool = Falsecamera_width: int = 640camera_height: int = 480cameras: dict = <factory>id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
UnitreeG1
classe lerobot.robots.unitree_g1.UnitreeG1Config
< source >( kp: list[float] | None = Nonekd: list[float] | None = Nonedefault_positions: list = <factory>control_dt: float = 0.004is_simulation: bool = Trueend_effector: G1EndEffector = <G1EndEffector.DEX1: 'dex1'>sim_publish_images: bool = Truesim_camera_port: int = 5555sim_onscreen: bool | None = Nonerobot_ip: str = '192.168.123.164'cameras: dict = <factory>gravity_compensation: bool = Falsecontroller: str | None = Noneembodiment: str = 'g1_29'id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Hope Jr
Le humanoïde Hope Jr est exposé sous la forme de deux robots indépendants, un bras et une main.
Nous supposons qu'au moment de la connexion, le bras est en position de repos et que le couple peut être désactivé en toute sécurité pour exécuter l'étalonnage.
classe lerobot.robots.hope_jr.HopeJrArmConfig
< source >( port: strdisable_torque_on_disconnect: bool = Truemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
classe lerobot.robots.hope_jr.HopeJrHandConfig
< source >( port: strside: strdisable_torque_on_disconnect: bool = Truecameras: dict = <factory>id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
RebotB601Follower
classe lerobot.robots.rebot_b601_follower.RebotB601Follower
< source >( config: RebotB601FollowerRobotConfig )
Bras suiveur Seeed Studio reBot B601 (6-DOF + pince, moteurs CAN).
La communication avec les moteurs est gérée par le package motorbridge via un bus CAN,
accessible soit par un pont série Damiao, soit par le transport CAN natif de MotorBridge.
Définissez le mode de contrôle de chaque moteur avant d’activer le couple.
Désactiver le couple du moteur afin que le bras puisse être déplacé à la main (débogage en lecture seule).
Débranchez les moteurs et les caméras du robot.
Commander le bras vers une configuration articulaire cible.
Les positions sont exprimées en degrés. L'amplitude de l'action relative peut être
limitée en fonction de max_relative_target, de sorte que l'action réellement envoyée est
toujours renvoyée.
classe lerobot.robots.rebot_b601_follower.RebotB601FollowerRobotConfig
< source >( port: strmotor_family: MotorFamily = <MotorFamily.DM: 'dm'>can_adapter: str | None = Nonedm_serial_baud: int = 921600disable_torque_on_disconnect: bool = Truemax_relative_target: float | dict[str, float] | None = Nonecameras: dict = <factory>motor_can_ids: dict[str, tuple[int, int]] | None = Nonecontrol_mode: ArmControlMode = <ArmControlMode.MIT: 'mit'>gripper_control_mode: lerobot.robots.rebot_b601_follower.motor_family.GripperControlMode | None = Nonemit_kp: float | dict[str, float] | None = Nonemit_kd: float | dict[str, float] | None = Nonepos_vel_velocity: float | dict[str, float] | None = Nonegripper_torque_ratio: float | None = Nonegripper_torque_limit: float | None = Nonegripper_hold_torque_limit: float | None = Nonejoint_limits: dict[str, tuple[float, float]] | None = Noneid: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Configuration enregistrée pour le robot suiveur reBot B601.
BiRebotB601Follower
classe lerobot.robots.bi_rebot_b601_follower.BiRebotB601Follower
< source >( config: BiRebotB601FollowerConfig )
Suiveur bimanuel Seeed Studio reBot B601.
Compose deux instances RebotB601Follower à un seul bras. Les clés d’observation et d’action de chaque bras sont préfixées par left_ / right_.
classe lerobot.robots.bi_rebot_b601_follower.BiRebotB601FollowerConfig
< source >( left_arm_config: RebotB601FollowerConfigright_arm_config: RebotB601FollowerConfigcameras: dict = <factory>id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Classe de configuration pour le robot suiveur bimanuel reBot B601.
EarthRoverMiniPlus
classe lerobot.robots.earthrover_mini_plus.EarthRoverMiniPlus
< source >( config: EarthRoverMiniPlusConfig )
Robot EarthRover Mini Plus contrôlé via l'API HTTP du SDK Frodobots.
Ce robot utilise un contrôle basé sur le cloud via le SDK Frodobots plutôt qu’une connexion directe au matériel. Les flux vidéo des caméras transitent par WebRTC via le cloud Agora, et les commandes de contrôle sont envoyées via des requêtes HTTP POST.
Le robot prend en charge :
- Deux caméras (avant et arrière) accessibles via des points de terminaison HTTP du SDK
- Contrôle de la vitesse linéaire et angulaire
- Télémétrie de la batterie et de l'orientation
Aucune calibration n'est nécessaire pour un robot basé sur un SDK.
Configurer le robot (sans effet pour un robot basé sur le SDK).
connect
< source >( calibrate: bool = True )
Paramètres
Lève
DeviceAlreadyConnectedError ou DeviceNotConnectedError
DeviceAlreadyConnectedError— Si le robot est déjà connectéDeviceNotConnectedError— Si la connexion au serveur SDK est impossible
Connectez-vous au robot via le SDK Frodobots.
déconnecter
< source >( )
Lève
DeviceNotConnectedError
DeviceNotConnectedError— Si le robot n'est pas connecté
Déconnectez-vous du robot.
Arrête le robot et ferme la connexion à l'SDK.
get_observation
< source >( ) → RobotObservation
Retourne
RobotObservation
Observation contenant :
- front : Image de la caméra avant (480, 640, 3) au format RGB
- rear : Image de la caméra arrière (480, 640, 3) au format RGB
- speed: float - Vitesse actuelle (valeur brute du SDK)
- battery_level: float - Niveau de la batterie (0-100)
- orientation: float - Orientation du robot en degrés
- gps_latitude: float - Coordonnée de latitude GPS
- gps_longitude: float - Coordonnée de longitude GPS
- gps_signal: float - Intensité du signal GPS (pourcentage)
- signal_level: float - Niveau du signal réseau (0-5)
- vibration: float - Lecture du capteur de vibration
- lamp: float - État de la lampe (0=éteinte, 1=allumée)
- accelerometer_x/y/z: float - Axes de l'accéléromètre (valeur brute du SDK)
- gyroscope_x/y/z: float - Axes du gyroscope (valeur brute du SDK)
- magnetometer_filtered_x/y/z: float - Axes du magnétomètre (valeur brute du SDK)
- wheel_rpm_0/1/2/3: float - Tournage des roues
Lève
DeviceNotConnectedError
DeviceNotConnectedError— Si le robot n'est pas connecté
Obtenir l'observation actuelle du robot depuis le SDK.
Les images de la caméra sont récupérées depuis les points de terminaison SDK /v2/front et /v2/rear. Les images sont décodées depuis le base64 et converties du format BGR au format RGB. La télémétrie du robot est récupérée depuis le point de terminaison /data. Les tableaux de capteurs (accels, gyros, mags, rpms) contiennent chacun des entrées de la forme [values…, timestamp] ; la dernière lecture de chaque tableau est utilisée.
Note : Les images de la caméra sont récupérées depuis les points de terminaison /v2/front et /v2/rear de l’SDK. Les images sont décodées depuis le format base64 et converties du format BGR au format RGB. La télémétrie du robot est récupérée depuis le point de terminaison /data. Toutes les valeurs de l’SDK sont normalisées dans les plages appropriées pour l’enregistrement du jeu de données.
send_action
< source >( action: dict ) → RobotAction
Paramètres
- action — Dictionnaire d'action avec les clés :
- linear_velocity : Vitesse linéaire cible (-1 à 1)
- angular_velocity: Vitesse angulaire cible (-1 à 1)
Retourne
RobotAction
L'action qui a été envoyée (correspond aux clés de action_features)
Lève
DeviceNotConnectedError
DeviceNotConnectedError— Si le robot n'est pas connecté
Envoyer une action au robot via le SDK.
Note: Les actions sont envoyées au SDK via le point de terminaison POST /control. Le SDK s'attend à des commandes dans l'intervalle [-1, 1].
classe lerobot.robots.earthrover_mini_plus.EarthRoverMiniPlusConfig
< source >( sdk_url: str = 'http://localhost:8000'id: str | None = Nonecalibration_dir: pathlib.Path | None = None )
Configuration du robot EarthRover Mini Plus à l'aide du SDK Frodobots.
Ce robot utilise un contrôle basé sur le cloud via l'API HTTP du SDK Frodobots. Les images de la caméra sont accédées directement via les points de terminaison HTTP du SDK.