A página do tutorial AY-Robots para gravar seu primeiro dataset LeRobot com um braço SO-100
LeRobotSO-100Gravação de DatasetTeleoperaçãoAprendizado por Imitação

Grave Seu Primeiro Dataset LeRobot Com um SO-100

AY-Robots ResearchAugust 23, 202616 min de leitura

Grave um dataset LeRobot utilizável com um SO-100: calibração, teleoperação líder-seguidor, as verdadeiras flags e padrões do lerobot-record, configuração da câmera, contagem de episódios e os defeitos que arruínam uma execução.

Um SO-100 seguidor, um braço líder do mesmo design e duas câmeras USB podem ajustar uma política em uma tarde. A mesma bancada pode facilmente produzir sessenta episódios que parecem saudáveis em um navegador de arquivos e desperdiçar uma execução de GPU de seis horas. A diferença raramente é o modelo; é o que aconteceu entre os servos e o arquivo parquet.

Aqui está a rota manual, depois a mais curta. Cada comando é do lerobot 0.6.1, lançado em 3 de agosto de 2026 e atual no PyPI. Ele mudou para pontos de entrada de console, então tutoriais que executam python lerobot/scripts/control_robot.py descrevem um arquivo que não existe mais.

A versão curta

  • lerobot 0.6.1 grava v3.0; GR00T N1.7 e N1.5 querem v2.1. Defina o formato antes de gravar.
  • Quatro comandos: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Use os mesmos --robot.id e --teleop.id da calibração na sessão de gravação.
  • Padrões reais: 30 fps, 60 s por episódio, 60 s de reinício, 50 episódios, cerca de 100 minutos de tempo total.
  • Mínimo de episódios aqui: 30 para SmolVLA, 50 para o resto.
  • A diversidade supera o volume. Conjuntos de dados morrem por quatro coisas: índices de câmera trocados, quadros perdidos ou congelados, uma junta estacionada no seu limite, uma string de tarefa ilegível.

O que uma sessão de gravação captura

Um conjunto de dados LeRobot não é uma pasta de vídeos, mas uma tabela indexada por tempo com vídeo anexado: cada ciclo de controle escreve uma linha contendo a ação comandada, o estado que o seguidor alcançou, um quadro por câmera, um carimbo de data/hora e índices. A política vê apenas essas colunas. O esquema de lerobot/svla_so100_pickplace, lido de seu meta/info.json.

CaracterísticadtypeFormaO que é
actionfloat32[6]alvos de junta do braço líder
observation.statefloat32[6]posições de junta que o seguidor alcançou
observation.images.topvideo[480, 640, 3]câmera de cena, MP4 (av1 aqui)
observation.images.wristvideo[480, 640, 3]câmera de pulso, mesma taxa
timestampfloat32[1]segundos desde o início do episódio
frame_index, episode_index, index, task_indexint64[1]contabilidade preenchida automaticamente

As juntas são main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll e main_gripper: os seis graus de liberdade do SO-100. A ação e o estado compartilham uma forma porque a teleoperação líder-seguidor registra um alvo e a posição alcançada um passo depois. Essa lacuna é informação: onde o braço lutou contra a gravidade ou um objeto preso. Essas strings são desse conjunto de dados. Uma sessão gravada com 0.6.1 hoje escreve shoulder_pan.pos até gripper.pos, IDs 1 a 6 no barramento: as mesmas seis juntas, chaves diferentes, o que importa no momento em que uma configuração aborda uma característica pelo nome.

Uma referência de um conjunto de dados real

Esse conjunto de dados contém 50 episódios e 19.631 quadros a 30 fps: cerca de 393 quadros, ou 13 segundos, por episódio. Se os seus tiverem uma média de um minuto, você está fazendo algo mais difícil ou gravando tempo morto em ambas as extremidades.

A entrada do glossário AY-Robots para o formato de conjunto de dados LeRobot, mostrando o layout do diretório e os arquivos de metadados
O que reside em data/, videos/ e meta/, e quais políticas leem qual versão.

O que você precisa na bancada

ItemDetalheNota
Braço seguidorSO-100, seis servos Feetech STS3215cerca de 110 a 150 EUR em peças
Braço líderum segundo SO-100, engrenagens removidasengrenagens removidas de todos os seis motores líderes: apenas encoder, menos atrito
Alimentaçãocompatível com a variante STS3215 de 7.4 V na lista de materiaisveja o aviso abaixo
Câmerasduas câmeras USB, 640x480 a 30 fpsuma vista da cena, uma no pulso
HostPython 3.12 ou mais recente, ffmpegrequires-python >= 3.12
Conta do Hubtoken de escrita Hugging Faceoptional with --dataset.push_to_hub=false
7.4 V, não 12 V

O STS3215 vem em duas versões: o README do SO-ARM100 classifica a versão de 7.4 V com um torque de estol de 16.5 kg.cm medido a 6 V e a versão de 12 V com 30 kg.cm, e observa que usar os motores de 12 V também significa comprar uma fonte de alimentação de 12 V 5 A+ em vez da de 5 V. A lista de materiais lista servos de 7.4 V. Alimentar servos classificados para 7.4 V com 12 V os destrói, então leia a etiqueta do motor antes de fazer qualquer conexão. Servo não respondendo.

Se o braço ainda não foi construído, isso é uma tarefa para outra noite: comece em Introdução ao SO-100 e o guia completo de configuração do SO-100. Se você ainda não comprou nada, leia a comparação SO-100 vs SO-101 primeiro: o SO-101 é a revisão mais recente com fiação aprimorada e sem a etapa de remoção de engrenagens, e o fluxo de trabalho de gravação é idêntico.

Instalar lerobot 0.6.1

bash
conda create -y -n lerobot python=3.12
conda activate lerobot

# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge

# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech     = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'

lerobot-info
lerobot-info imprime um resumo do sistema, incluindo a versão do ffmpeg que ele consegue encontrar no PATH.

Os extras são o que mais confunde as pessoas. pip install lerobot instala apenas as dependências principais de ML, nada que se comunique com um robô. Os braços Koch precisam de dynamixel em vez de feetech. Se o seu shell nunca ouviu falar de lerobot-record, é por isso.

Portas, IDs de motor e calibração

Três etapas únicas separam as peças de um loop de teleoperação funcional. permite que uma política treinada no seu braço funcione no braço de outra pessoa, mapeando contagens brutas do encoder para uma convenção de junta compartilhada.

  1. 1
    Encontre a porta USB de cada braço

    Execute-o com ambos os braços conectados, desconecte o que você está identificando quando solicitado e anote qual porta desaparece. No Linux, pode ser necessário sudo chmod 666 /dev/ttyACM0.

    bash
    lerobot-find-port
    # Finding all available ports for the MotorsBus.
    # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is '/dev/ttyACM1'
    # Reconnect the USB cable.
  2. 2
    Grave os IDs e baudrates dos motores

    Os IDs são gravados um motor por vez, e a documentação é rigorosa sobre como: conecte exatamente um motor à placa controladora, ainda não em cadeia com nenhum outro. O script percorre a cadeia de trás para frente, solicitando primeiro a garra e atribuindo-lhe o ID 6, depois o wrist_roll como 5, até o shoulder_pan como 1. Faça isso antes da montagem.

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    Calibre ambos os braços

    Mova cada junta para o meio de seu alcance, pressione Enter e, em seguida, mova cada uma por todo o seu alcance. O id se torna o nome do arquivo de perfil.

    bash
    lerobot-calibrate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower
    
    lerobot-calibrate \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader
  4. 4
    Teleopere antes de gravar qualquer coisa

    O teste de aceitação para tudo o que foi descrito acima. Se a teleoperação for irregular, espelhada ou uma junta não seguir, a gravação preserva isso em 50 episódios.

    bash
    lerobot-teleoperate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader \
        --display_data=true
Onde a calibração é armazenada e por que o id é importante

Os perfis vão para $HF_LEROBOT_CALIBRATION, padrão ~/.cache/huggingface/lerobot/calibration, e o id é a chave de pesquisa. Dê a lerobot-record um id calibrado e ele oferece Enter para reutilizar o perfil ou c para refazê-lo. Dê a ele um id desconhecido e não haverá arquivo, então ele entra em calibração no meio da sessão.

Câmeras decidem o que a política vê

bash
lerobot-find-cameras opencv   # or: lerobot-find-cameras realsense

# --- 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
Execute isso em cada sessão: a documentação adverte que esses identificadores podem mudar após uma reinicialização ou reconexão, dependendo do sistema operacional.

Duas vistas, e onde elas estão posicionadas importa: uma câmera de cena fixa cobrindo o espaço de trabalho e uma câmera de pulso perto do efetor final mostrando o que a garra está prestes a tocar. A lista de verificação de conjuntos de dados da comunidade LeRobot pede preferencialmente duas vistas em 480x640 / 720p ou melhor, um fundo estático, iluminação neutra e estável, e o braço líder e os membros humanos fora do quadro. O guia de gravação adiciona a regra prática: você deve ser capaz de realizar a tarefa apenas olhando as imagens da câmera.

O índice da câmera não é uma identidade estável

Os índices do OpenCV vêm da ordem de enumeração, então uma reinicialização ou reconexão pode fazer com que os índices 0 e 2 troquem de lugar e coloquem a vista do pulso no slot superior por uma sessão inteira. O próprio lerobot afirma: sua classe de câmera aceita um caminho de dispositivo, bem como um número inteiro, e adverte que os índices são instáveis em reinicializações ou mudanças de porta, especialmente no Linux. Aponte `index_or_path` para o symlink udev em `/dev/v4l/by-id/`, que segue o dispositivo em vez da ordem de enumeração. Esta é a maneira mais comum de um conjunto de dados acabar internamente inconsistente, e o treinamento não pode repará-lo. Câmera não detectada.

O comando de gravação e cada flag

bash
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')

lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_so100_follower \
    --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_so100_leader \
    --display_data=true \
    --dataset.repo_id=${HF_USER}/so100_pick_cube \
    --dataset.single_task="Pick the red cube and drop it in the box" \
    --dataset.num_episodes=50 \
    --dataset.fps=30 \
    --dataset.episode_time_s=25 \
    --dataset.reset_time_s=10 \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2
O dicionário da câmera é uma string entre aspas no shell; as chaves aninhadas não são sintaxe do shell.

Os valores padrão abaixo vêm de src/lerobot/configs/dataset.py no branch principal, não de um tutorial. Vários não são o que as pessoas assumem.

FlagPadrãoO que faz
--dataset.repo_idemptynome; timestamp anexado por padrão
--dataset.single_taskemptystring da tarefa armazenada em cada episódio
--dataset.root$HF_LEROBOT_HOME/repo_idcaminho de escrita, padrão ~/.cache/huggingface/lerobot/
--dataset.fps30taxa do loop de controle e taxa de quadros do dataset
--dataset.episode_time_s60segundos antes de um episódio avançar automaticamente
--dataset.reset_time_s60reset da cena; braço se move, nada é armazenado
--dataset.num_episodes50episódios gravados nesta sessão
--dataset.push_to_hubtrueupload no final da sessão; false mantém local
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablecodificar durante a captura; defina-o explicitamente
--dataset.encoder_queue_maxsize30quadros armazenados em buffer por câmera, ~1 s a 30 fps
--dataset.encoder_threadsnull (codec decides)threads por codificador; diminua se a captura gaguejar
--dataset.no_stampfalsemanter repo_id exatamente como digitado
--resumefalseanexar a um dataset existente; requer --dataset.root
Duas flags que custam uma hora por surpresa

Seu conjunto de dados não é chamado como você digitou. lerobot anexa uma tag de data e hora, então so100_pick_cube se torna so100_pick_cube_20260823_141530. Use --dataset.no_stamp=true para um nome estável. Resume conta adições, não totais. Com --resume=true, --dataset.num_episodes conta episódios adicionais e --dataset.root se torna obrigatório. Peça 50 em um conjunto de dados de 30 episódios e você obterá 80.

Controle de teclado durante uma sessão

  • Seta para a direita ou n: encerra o episódio ou reinicia a fase mais cedo. É a tecla que você mais usa, pois uma pegada limpa raramente precisa de 25 segundos.
  • Seta para a esquerda ou r: descarta o episódio e o refaz. Uma tentativa ruim não custa nada agora e muito depois.
  • Escape ou q: para a sessão, finaliza a codificação, faz o upload.
  • Isso funciona em X11, Wayland e SSH headless: sem um backend de chave global, lerobot-record lê as mesmas chaves do terminal de controle. As letras sobrevivem a links SSH lentos, onde as sequências de setas se dividem.
  • A teleoperação por teclado é diferente e precisa de um backend global: X11, Windows ou macOS com Acessibilidade.

Quantos episódios, e como é um bom episódio

O guia de gravação sugere pelo menos 50 episódios para uma primeira tarefa, cerca de 10 por localização de objeto. As páginas de política listam um mínimo por modelo, abaixo do qual uma execução não vale o tempo de GPU.

PolíticaMín. de episódiosFormato do datasetNível de GPUCusto por execução
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 4 to 12 USD

A melhor pergunta é quantos de quê. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) coletaram mais de 40.000 demonstrações e executaram mais de 15.000 rollouts no mundo real. A generalização seguiu uma relação aproximadamente de lei de potência com o número de ambientes e objetos, e, após um certo limite por ambiente ou objeto, demonstrações adicionais tiveram efeito mínimo. Em um banco de testes: mova o objeto, mude a iluminação, troque o cubo, em vez de repetir uma única tomada.

Teleoperação líder-seguidor como fonte de dados
Vantagens
  • Trajetórias de junta contínuas que um servo pode reproduzir, ao contrário de teclado ou gamepad
  • A ação e o estado compartilham uma convenção de coordenadas, então a política aprende um alvo que pode comandar diretamente
  • Um episódio de 25 segundos mais um reset de 10 segundos equivale a aproximadamente 100 episódios por hora
  • O operador sente o seguidor travar ou prender, então as falhas aparecem antes que os dados sejam confirmados
Compromissos
  • Um segundo braço praticamente dobra o custo das peças
  • As demonstrações herdam os hábitos do operador; Mandlekar et al. descobriram que a qualidade da política depende muito da qualidade da demonstração
  • O líder é amostrado na taxa de loop, então as pausas se tornam linhas quase idênticas que ensinam a política a esperar
  • Nada garante a consistência entre as sessões: uma câmera movida 5 cm é uma mudança de distribuição oculta

Um bom episódio é entediante: pose inicial repetível, uma coisa feita, encerrado assim que o objeto está na lixeira, string de tarefa com 25 a 50 caracteres conforme recomendado pela lista de verificação. Pegue o cubo vermelho e coloque-o na caixa é uma string de tarefa; task1 é o antipadrão que a lista de verificação nomeia explicitamente. Anotações vagas encabeçam sua lista de problemas, e elas são mais importantes para modelos de visão-linguagem-ação, onde a string é uma entrada do modelo, não um nome de arquivo.

Defeitos que silenciosamente arruínam um conjunto de dados

Nenhum lança uma exceção. Todos sobrevivem ao treinamento, surgindo como uma curva de perda que parece boa e um robô que não faz nada. Verifique enquanto a cena está configurada.

DefeitoComo se pareceDe onde vemComo detectá-lo
Visualizações de câmera trocadasimagem do pulso sob a chave superiorredefinição de índice após reconexãolerobot-find-cameras a cada sessão; caminhos por ID
Quadros congeladosa mesma imagem por dezenas de linhascâmera para de entregar; loop repete o último quadroverifique em lerobot-dataset-viz
Quadros perdidoscontagem de linhas abaixo de fps vezes segundosfila transborda, descarta em vez de bloquear'Encoder queue full' no log; linhas vs fps vezes duração
Junta no seu limiteuma junta plana no mínimo ou máximoo alcance do líder excede o do seguidor, ou uma pose intermediária ruimmin/max por junta em ds.meta.stats; lerobot-find-joint-limits previamente
Imagem e ação fora de sincroniaa política antecipa ou atrasacâmeras com um fps diferente do loopmantenha cada câmera em --dataset.fps
Tempo mortolongas sequências de linhas de ação idênticasoperador pausou com o gravador em execuçãoproporção de linhas de ação idênticas consecutivas
String de tarefa inutilizáveltask1, demo2, testdigitação rápidameta/tasks.parquet em v3.0 (era meta/tasks.jsonl em v2.1); corrija com lerobot-edit-dataset modify_tasks
Quadros descartados se escondem

O codificador mantém uma fila limitada por câmera, 30 quadros por padrão. Quando não consegue acompanhar, os quadros são descartados em vez de bloqueados: a captura continua e nada trava. Você recebe Encoder queue full for {camera}, dropped N frame(s) e um total por câmera no final do episódio. O limite do lerobot: cerca de 5% de perda significa um sistema sobrecarregado, 2% é a carga esperada na inicialização. Correções em ordem: --display_data=false, diminuir --dataset.encoder_threads, vcodec=h264, streaming desativado.

Uma ressalva: a tabela do guia de streaming-encoding lista o padrão como True, enquanto a dataclass no main lê streaming_encoding: bool = False. Documentação e código discordam, então defina-o explicitamente; o lerobot registra uma dica recomendando-o sempre que inicia com a flag desativada.

Verifique o conjunto de dados antes de alugar uma GPU

O teste de aceitação da documentação: compare a duração do vídeo com a duração do episódio relatada pela CLI e confirme que a contagem de linhas é igual a fps vezes a duração. Por episódio, não no total.

python
from lerobot.datasets import LeRobotDataset

ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)

# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])

# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])
Um episódio com fps muito diferente da duração é um candidato para exclusão, não para treinamento.

Em seguida, observe-o. lerobot-dataset-viz reproduz um episódio quadro a quadro com rastros de articulações ao lado das visualizações da câmera, no Rerun ou Foxglove. Câmeras trocadas e quadros congelados aparecem em dez segundos. As pessoas pulam esta etapa.

bash
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0

# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0 \
    --display-mode foxglove

# Drop the episodes that did not survive review
lerobot-edit-dataset \
    --repo_id your-user/so100_pick_cube_20260823_141530 \
    --new_repo_id your-user/so100_pick_cube_clean \
    --operation.type delete_episodes \
    --operation.episode_indices "[3, 17, 41]"
lerobot-edit-dataset também realiza split, merge, remove_feature, modify_tasks e recomputação de stats. Exclua generosamente: um episódio ruim custa um episódio; mantê-lo custa cada execução treinada nele.
O diretório de conjuntos de dados AY-Robots listando conjuntos de dados públicos LeRobot com contagens de episódios e formatos
Como conjuntos de dados comparáveis são dimensionados e anotados.

v2.1 ou v3.0: decida antes de gravar

v2.1 gravava um parquet e um MP4 por episódio. v3.0 concatena muitos episódios em shards compartilhados e reconstrói os limites a partir dos metadados, então info.json contém modelos de caminho como data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet em vez de um número de episódio. A justificativa a montante é ter menos arquivos e maiores: inicialização mais rápida e menos pressão no sistema de arquivos em escala.

LeRobot v2.1LeRobot v3.0
Layoutum parquet e um MP4 por episódiomuitos episódios por shard
Metadados do episódioArquivos JSONLparquet em blocos em meta/episodes/, via a pilha de datasets
Streaming do Hubnãosim, via StreamingLeRobotDataset
Escrito por lerobot 0.6.1nãosim, o que você obtém hoje
Lido por GR00T N1.7 e N1.5simnão, deve ser convertido para baixo
Gravando hoje, treinando GR00T amanhã

lerobot 0.6.1 escreve v3.0, mas GR00T N1.7 e N1.5 leem v2.0 ou v2.1 e falham com ele. Observe a direção do fluxo: src/lerobot/scripts/ contém convert_dataset_v21_to_v30.py e nada na direção oposta. Resolva isso antes da sessão. Correção: dataset rejeitado como v3.

bash
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube

# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube \
    --root=/path/to/dataset/directory \
    --push-to-hub=false
Rápido para 50 episódios. Escala é um trabalho diferente: o guia de portabilidade do lerobot, para DROID bruto para v3.0, orça mais de 7 dias de processamento local e cerca de 400 GB.

Duas rotas para o mesmo conjunto de dados

Tudo o que foi dito acima, na sua própria máquina: você é responsável pela enumeração USB, pela compilação do ffmpeg, pelo ajuste do codificador e pelos arquivos de calibração. A rota certa para entender o pipeline, operar uma configuração de câmera incomum ou manter os dados localmente.

O que esta rota custa

Tempo: uma noite por braço para montar, uma primeira calibração complicada e uma primeira sessão que você descarta porque uma câmera estava no slot errado.

Grave conjuntos de dados LeRobot sem montar o pipeline você mesmo

O cliente desktop AY-Robots grava episódios, streams de câmera e estados de junta no formato LeRobot a partir de uma sessão de teleoperação, e então entrega o conjunto de dados ao treinador.

Obtenha o cliente desktop

Do conjunto de dados à política

Cinquenta episódios limpos alimentam cada executada aqui. treina do zero apenas na sua tarefa, com cerca de 80 M parâmetros a aproximadamente 20 ms por passo de ação, sendo o único dos cinco confortável com movimento rápido. tem cerca de 450 M parâmetros em uma placa de 24 GB. é um modelo de base de aproximadamente 3 B parâmetros onde afeta cerca de 40 M parâmetros, precisa de uma A100 ou H100, e requer o conjunto de dados v2.1.

Em seguida, o guia para sua combinação: , ou ; para uma primeira execução, é mais curto. Quando a política funciona na bancada, mas colapsa no momento em que você move a mesa, isso é um problema de dados: e aprofundam-se na diversidade.

Quantos episódios eu realmente preciso para uma primeira política funcional?

Trinta para SmolVLA, cinquenta para ACT, Pi0.5, GR00T N1.5 e N1.7, os mínimos que os treinadores da AY-Robots impõem. O guia LeRobot recomenda independentemente pelo menos 50 para uma primeira tarefa, cerca de 10 por localização de objeto. O trabalho de escalonamento de dados descobriu que a generalização escala com ambientes e objetos, em vez da contagem de demonstrações, então cem tomadas de uma cena são piores do que cinquenta em cinco posicionamentos.

Preciso de um braço líder, ou posso teleoperar com um teclado?

lerobot fornece teleoperadores de teclado e gamepad, então um braço líder não é estritamente necessário, mas é fortemente preferível: líder-seguidor fornece trajetórias de junta contínuas na convenção de coordenadas da ação registrada, enquanto a entrada do teclado produz movimento em passos que uma política aprende como solavanco. A teleoperação por teclado também precisa de um backend de chave global, então falha em Wayland e em sistemas headless.

Posso gravar em um Raspberry Pi ou em um mini PC pequeno?

Sim, com ajuste. O guia de codificação de streaming tem uma categoria de baixo recurso cobrindo máquinas modernas de 4 núcleos e o Raspberry Pi 5, e coloca duas câmeras a 640x480 e 30 fps em sua coluna 'requer algum ajuste'. Seu conselho: impeça o codificador de competir com o loop de captura, via --dataset.rgb_encoder.vcodec=h264 e --dataset.streaming_encoding=false. Ele avalia duas câmeras a 640x480 como cerca de 55 milhões de pixels por segundo e duas a 1920x1080 como cerca de 373 milhões.

Como sei se o conjunto de dados que acabei de gravar está realmente saudável?

Três verificações simples. Compare a duração do vídeo de cada episódio com a duração relatada pela CLI e confirme se a contagem de linhas é igual a fps vezes essa duração, por episódio em vez do total; esse é o teste de aceitação que o guia de codificação do lerobot fornece. Leia ds.meta.stats, onde uma junta cujo mínimo é igual ao seu máximo nunca se moveu. Em seguida, reproduza dois ou três episódios em lerobot-dataset-viz, a única maneira de vistas trocadas e quadros congelados aparecerem. Em quadros perdidos, o guia traça a linha em aproximadamente 5 por cento de perda; cerca de 2 por cento é carga transiente normal, muitas vezes apenas na inicialização.

Meu trabalho de treinamento rejeitou o conjunto de dados como v3.0. E agora?

GR00T N1.7 e N1.5 leem LeRobot v2.0 ou v2.1 e falham em v3.0, que é o que o lerobot 0.6.1 registra. Ou defina o formato antes do treinamento, ou use uma política que leia v3.0 nativamente: Pi0.5, SmolVLA ou ACT. lerobot fornece um conversor de v2.1 para v3.0 e nada no sentido inverso.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started