LeRobot documentation

Caméras

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.6.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Caméras

LeRobot propose plusieurs options pour la capture vidéo :

ClasseCaméras prises en charge
OpenCVCameraTéléphone, webcam intégrée au portable, webcam USB
ZMQCameraCaméras connectées au réseau
RealSenseCameraIntel RealSense (avec profondeur)
Reachy2CameraCaméras du robot Reachy 2

Pour les détails de compatibilité de OpenCVCamera, consultez Vue d’ensemble de l’entrée/sortie vidéo avec OpenCV.

Trouvez votre caméra

Chaque caméra nécessite un identifiant unique pour être instanciée, ce qui vous permet de distinguer plusieurs appareils connectés.

OpenCVCamera et RealSenseCamera prennent en charge la découverte automatique. Exécutez la commande ci-dessous pour lister les appareils disponibles et leurs identifiants. Notez que ces identifiants peuvent changer après un redémarrage de votre ordinateur ou un rebranchement de la caméra, selon votre système d’exploitation.

lerobot-find-cameras opencv # or realsense for Intel Realsense cameras

La sortie ressemblera à ceci si vous avez deux caméras connectées :

--- Detected Cameras ---
Camera #0:
  Name: OpenCV Camera @ 0
  Type: OpenCV
  Id: 0
  Backend api: AVFOUNDATION
  Default stream profile:
    Format: 16.0
    Width: 1920
    Height: 1080
    Fps: 15.0
--------------------
(more cameras ...)

Lors de l’utilisation de caméras Intel RealSense sous macOS, vous pouvez rencontrer cette erreur : Error finding RealSense cameras: failed to set power state. Elle peut être résolue en exécutant la même commande avec les permissions sudo. Notez que l’utilisation de caméras RealSense sous macOS est instable.

ZMQCamera et Reachy2Camera ne prennent pas en charge la découverte automatique. Ils doivent être configurés manuellement en fournissant leur adresse réseau et leur port, ou les paramètres du SDK du robot.

Placement de la caméra et éclairage

Les images de la caméra sont ce dont votre politique apprend, donc un bon réglage de la caméra est plus important qu'une haute résolution :

  • Éclairez la scène de manière uniforme. Utilisez une lumière diffuse et constante, et évitez la lumière directe du soleil, les reflets intenses et les ombres mouvantes. Un éclairage différent entre l'enregistrement et le déploiement peut entraîner l'échec d'une politique.
  • Fixez les caméras en place. Montez-les de manière rigide et ne les déplacez pas entre les sessions d'enregistrement, ou entre l'enregistrement et le déploiement.
  • Formuler la tâche. L'objet, la pince et la cible doivent être visibles dans au moins une caméra. Un bon test : pourriez-vous effectuer la tâche vous-même en ne regardant que les images des caméras ?
  • Gardez la résolution modeste. 640×480 à 30 fps suffit pour la plupart des tâches et permet de maintenir l'enregistrement et l'entraînement rapides.

Utiliser des caméras

Modes d'accès aux images

Toutes les classes de caméra implémentent trois modes d'accès pour la capture d'images :

MéthodeComportementDes blocs ?Idéal pour
read()Attend que le matériel de la caméra renvoie une image. Peut bloquer pendant une longue durée en fonction de la caméra et du SDK.OuiScripts simples, capture séquentielle
async_read(timeout_ms)Retourne la dernière image non consommée depuis le thread en arrière-plan. N’attend que si le tampon est vide, jusqu’à timeout_ms. Lève TimeoutError si aucune image n’arrive.Avec un délai d'attenteBoucles de contrôle synchronisées sur la fréquence d'images de la caméra
read_latest(max_age_ms)Affiche le dernier frame du buffer (peut être obsolète). Lève TimeoutError si le frame est plus ancien que max_age_ms.NonVisualisation de l'interface utilisateur, journalisation, surveillance

Exemples d'utilisation

Les exemples suivants montrent comment utiliser l’API caméra pour configurer et capturer des images à partir de différents types de caméras.

  • Capture de trames bloquante et non bloquante à l'aide d'une caméra basée sur OpenCV
  • Capture de couleur et de profondeur à l'aide d'une caméra Intel RealSense

Un débranchement non propre des caméras peut provoquer des fuites de ressources. Utilisez le protocole de gestionnaire de contexte pour garantir un nettoyage automatique :

with OpenCVCamera(config) as camera:
    ...

Vous pouvez également appeler connect() et disconnect() manuellement, mais utilisez toujours un bloc finally pour ce dernier.

Ouvrir la caméra
Caméra Intel Realsense
from lerobot.cameras.opencv import OpenCVCamera, OpenCVCameraConfig
from lerobot.cameras import ColorMode, Cv2Rotation

# Construct an `OpenCVCameraConfig` with your desired FPS, resolution, color mode, and rotation.
config = OpenCVCameraConfig(
    index_or_path=0,
    fps=15,
    width=1920,
    height=1080,
    color_mode=ColorMode.RGB,
    rotation=Cv2Rotation.NO_ROTATION
)

# Instantiate and connect an `OpenCVCamera`, performing a warm-up read (default).
with OpenCVCamera(config) as camera:

    # Read a frame synchronously — blocks until hardware delivers a new frame
    frame = camera.read()
    print(f"read() call returned frame with shape:", frame.shape)

    # Read a frame asynchronously with a timeout — returns the latest unconsumed frame or waits up to timeout_ms for a new one
    try:
        for i in range(10):
            frame = camera.async_read(timeout_ms=200)
            print(f"async_read call returned frame {i} with shape:", frame.shape)
    except TimeoutError as e:
        print(f"No frame received within timeout: {e}")

    # Instantly return a frame - returns the most recent frame captured by the camera
    try:
        initial_frame = camera.read_latest(max_age_ms=1000)
        for i in range(10):
            frame = camera.read_latest(max_age_ms=1000)
            print(f"read_latest call returned frame {i} with shape:", frame.shape)
            print(f"Was a new frame received by the camera? {not (initial_frame == frame).any()}")
    except TimeoutError as e:
        print(f"Frame too old: {e}")

Travailler avec la profondeur

Les caméras Intel RealSense et Reachy 2 peuvent capturer la couleur et la profondeur de manière synchronisée. L’appel de read() renvoie le frame couleur sous forme de (H, W, 3) uint8. L’appel de read_depth() renvoie la carte de profondeur sous forme de (H, W, 1) uint16, où chaque valeur de pixel représente la distance par rapport au capteur, exprimée en millimètres. Une valeur de pixel de 0 signifie généralement « aucune mesure disponible » (hors plage, occlusion ou faible confiance).

Pendant l’enregistrement, la boucle de contrôle consulte de manière non bloquante les images tamponnées les plus récentes via read_latest() (couleur) et read_latest_depth() (profondeur), en ajoutant la carte de profondeur comme fonctionnalité sœur (par exemple front_depth à côté de front).

Pour savoir comment les flux de profondeur sont stockés et encodés lors de l’enregistrement d’un jeu de données, consultez la section Depth streams du guide d’encodage vidéo.

Utilisez l’appareil photo de votre téléphone

iPhone et macOS
Caméra virtuelle OBS

Pour utiliser votre iPhone comme caméra sur macOS, activez la fonctionnalité Continuity Camera :

  • Assurez-vous que votre Mac exécute macOS 13 ou une version ultérieure, et que votre iPhone est sur iOS 16 ou une version ultérieure.
  • Connectez-vous aux deux appareils avec le même identifiant Apple.
  • Connectez vos appareils avec un câble USB ou activez le Wi-Fi et le Bluetooth pour une connexion sans fil.

Pour plus de détails, consultez Apple support.

Si tout est correctement configuré, votre téléphone apparaîtra comme une caméra OpenCV standard et pourra être utilisé avec OpenCVCamera.

Update on GitHub