LeRobot documentation

Câmeras

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Câmeras

O LeRobot oferece várias opções para captura de vídeo:

ClasseCâmeras suportadas
OpenCVCameraTelefone, laptop com webcam integrada, webcams USB
ZMQCameraCâmeras conectadas à rede
RealSenseCameraIntel RealSense (com profundidade)
Reachy2CameraCâmeras do robô Reachy 2

Para detalhes de compatibilidade com OpenCVCamera, consulte a Visão geral da entrada e saída de vídeo com OpenCV.

Encontre sua câmera

Cada câmera requer um identificador único para ser instanciada, permitindo distinguir entre vários dispositivos conectados.

OpenCVCamera e RealSenseCamera suportam descoberta automática. Execute o comando abaixo para listar os dispositivos disponíveis e seus identificadores. Observe que esses identificadores podem mudar após reiniciar o computador ou reconectar a câmera, dependendo do seu sistema operacional.

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

A saída terá um aspecto semelhante ao seguinte, se você tiver duas câmeras conectadas:

--- 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 ...)

Ao usar câmeras Intel RealSense em macOS, você pode receber este erro: Error finding RealSense cameras: failed to set power state. Isso pode ser resolvido executando o mesmo comando com permissões de sudo. Observe que o uso de câmeras RealSense em macOS é instável.

ZMQCamera e Reachy2Camera não suportam descoberta automática. Eles devem ser configurados manualmente, fornecendo seu endereço de rede e porta ou as configurações do SDK do robô.

Posicionamento da câmera e iluminação

As imagens da câmera são o que sua política aprende, portanto, uma boa configuração de câmera é mais importante do que uma alta resolução:

  • Ilumine a cena de forma uniforme. Use luz difusa e consistente e evite luz solar direta, reflexos fortes e sombras em movimento. Uma iluminação que difere entre a gravação e a implantação pode fazer com que uma política falhe.
  • Fixe as câmeras no lugar. Monte-as de forma rígida e não as mova entre sessões de gravação, nem entre a gravação e a implantação.
  • Defina a tarefa. O objeto, a garra e o alvo devem ser visíveis em pelo menos uma câmera. Um bom teste: você conseguiria executar a tarefa olhando apenas para as imagens das câmeras?
  • Mantenha a resolução modesta. 640×480 a 30 fps é suficiente para a maioria das tarefas e mantém a gravação e o treinamento rápidos.

Use câmeras

Modos de acesso a quadros

Todas as classes de câmera implementam três modos de acesso para captura de quadros:

MétodoComportamentoBlocos?Melhor para
read()Aguarda o hardware da câmera para retornar um quadro. Pode bloquear por um longo tempo, dependendo da câmera e do SDK.SimScripts simples, captura sequencial
async_read(timeout_ms)Retorna o último quadro não consumido da thread em segundo plano. Bloqueia apenas se o buffer estiver vazio, por até timeout_ms. Lança TimeoutError se nenhum quadro chegar.Com um tempo limiteLaços de controle sincronizados ao FPS da câmera
read_latest(max_age_ms)Exibe o quadro mais recente no buffer (pode estar desatualizado). Lança TimeoutError se o quadro for mais antigo que max_age_ms.NãoVisualização de interface, registro de logs, monitoramento

Exemplos de uso

Os exemplos a seguir mostram como usar a API da câmera para configurar e capturar quadros de diferentes tipos de câmera.

  • Captura de quadros bloqueante e não bloqueante usando uma câmera baseada em OpenCV
  • Captura de cor e profundidade usando uma câmera Intel RealSense

Falhar ao desconectar as câmeras de forma limpa pode causar vazamentos de recursos. Use o protocolo de gerenciador de contexto para garantir a limpeza automática:

with OpenCVCamera(config) as camera:
    ...

Você também pode chamar connect() e disconnect() manualmente, mas use sempre um bloco finally para o segundo.

Abrir câmera de CV
Câmera 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}")

Trabalhando com profundidade

As câmeras Intel RealSense e Reachy 2 podem capturar cor e profundidade em sincronia. A chamada de read() retorna o quadro color como (H, W, 3) uint8. A chamada de read_depth() retorna o depth map como (H, W, 1) uint16, em que cada valor de pixel é a distância do sensor expressa em milímetros. Um valor de pixel de 0 geralmente significa “nenhuma medição disponível” (fora do intervalo, ocluído ou de baixa confiança).

Durante a gravação, o loop de controle consulta as frames mais recentes do buffer de forma não bloqueante via read_latest() (cor) e read_latest_depth() (profundidade), adicionando o mapa de profundidade como um recurso irmão (por exemplo, front_depth ao lado de front).

Para saber como os fluxos de profundidade são armazenados e codificados ao gravar um conjunto de dados, consulte a seção Fluxos de profundidade do guia de codificação de vídeo.

Use a câmera do seu celular

iPhone & macOS
Câmera virtual OBS

Para usar seu iPhone como uma câmera no macOS, ative o recurso Continuity Camera:

  • Certifique-se de que seu Mac está executando o macOS 13 ou posterior e que seu iPhone está no iOS 16 ou posterior.
  • Faça login em ambos os dispositivos com o mesmo Apple ID.
  • Conecte seus dispositivos com um cabo USB ou ative o Wi-Fi e o Bluetooth para uma conexão sem fio.

Para mais detalhes, visite Apple support.

Se tudo estiver configurado corretamente, seu telefone aparecerá como uma câmera padrão do OpenCV e poderá ser usado com OpenCVCamera.

Update on GitHub