Coleta de Dados

O SO-101 é um dos braços de coleta de dados mais comuns na comunidade LeRobot. Este guia cobre tudo, desde conexões de hardware até gravação de episódios e envio do seu conjunto de dados para a HuggingFace.

Antes da Gravação

Configuração de Hardware para Gravação

A configuração de coleta de dados do SO-101 é mais simples do que braços CAN-bus — tudo funciona via USB. Aqui está o que conectar.

📷

Câmera de Espaço de Trabalho

Webcam USB apontada para o espaço de trabalho de cima ou de lado. Montar em uma posição fixa — não mova entre os episódios. Verifique: ls /dev/video*

🔒

Câmera de Pulso (opcional)

Pequena câmera USB montada no efetor final. Adiciona visão em primeira pessoa. Um segundo porta USB é necessário. LeRobot suporta sincronização de múltiplas câmeras.

🔌

Braço Seguidor (USB serial)

O braço que executa ações. Conecte via controlador de servo USB. Verifique a porta com ls /dev/ttyUSB*

👤

Braço Líder (USB serial)

Um segundo SO-101 em modo de conformidade — mova-o com a sua mão para dirigir o seguidor. Conecte em uma segunda porta USB. Proporciona demonstrações de alta qualidade.

Sem ROS, sem drivers de kernel: Ao contrário das configurações CAN-bus, a pilha de coleta de dados do SO-101 funciona inteiramente sobre USB serial. Você pode gravar em um MacBook ou laptop Windows — nenhum Ubuntu necessário.

Fluxo de Trabalho de Gravação

Fluxo de Trabalho de Gravação Passo a Passo

1

Verifique se a calibração está atual

Execute a calibração antes de cada nova sessão se o braço foi desmontado ou movido. Veja Software → Calibração.

python -m lerobot.scripts.control_robot \
  --robot.type=so101 --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate
2

Verifique os feeds das câmeras

python -c "
import cv2
for i in range(4):
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
        print(f'Camera {i}: OK')
    cap.release()
"
3

Mova o braço para a posição inicial

Coloque o braço seguidor na posição inicial (totalmente estendido, efetor final apontando para frente). Redefina o braço líder para a mesma posição antes de iniciar o teleop.

4

Configure a cena da tarefa

Coloque os objetos em suas posições iniciais consistentes. Marque a mesa se necessário — condições iniciais consistentes são críticas para a generalização da política.

5

Inicie a gravação do LeRobot

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB1 \
  --robot.leader_arms.main.type=so101 \
  --robot.leader_arms.main.port=/dev/ttyUSB0 \
  --control.type=record \
  --control.fps=30 \
  --control.repo_id=your-username/so101-pick-place-v1 \
  --control.num_episodes=50 \
  --control.single_task="Pick the red block and place it in the bin" \
  --control.warmup_time_s=3 \
  --control.reset_time_s=8

LeRobot solicita antes de cada episódio. Durante o aquecimento, você pode ajustar sua pegada no braço líder antes que a gravação comece.

6

Revise e reproduza episódios

python -m lerobot.scripts.visualize_dataset \
  --repo_id=your-username/so101-pick-place-v1 \
  --episode_index=0

Exclua episódios de baixa qualidade imediatamente. Verifique se há quadros de câmera perdidos, velocidades de junta erráticas ou execução de tarefa incompleta.

7

Envie para o HuggingFace Hub

huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
  --repo_id=your-username/so101-pick-place-v1
Formato do Conjunto de Dados

Formato de Conjunto de Dados SO-101

O SO-101 usa o formato padrão de conjunto de dados LeRobot / HuggingFace — esquema idêntico ao OpenArm, Koch e outros braços LeRobot. Isso significa que seus conjuntos de dados são diretamente compatíveis com todo o ecossistema de treinamento LeRobot.

Esquema de dados do episódio

Campos em cada arquivo Parquet de episódio
observação.estado float32[6] Posições das juntas em graus (6 DOF — 5 juntas + garra)
observation.images.* caminho do vídeo Referência ao quadro no arquivo de vídeo MP4 por câmera
ação float32[6] Posições das juntas alvo do braço líder
carimbo de data/hora float64 Timestamp Unix em segundos
índice_do_quadro int64 Número do quadro dentro do episódio
índice_do_episódio int64 Número do episódio dentro do conjunto de dados
next.done bool Verdadeiro no último quadro de cada episódio
índice_da_tarefa int64 Índice na tabela de consulta de descrição da tarefa

Notas específicas do SO-101

O espaço de ação do SO-101 utiliza posições das juntas em graus (unidades de servo Feetech), não em radianos. Ao misturar conjuntos de dados do SO-101 e OpenArm para treinamento entre plataformas, normalize ambos para radianos primeiro usando as estatísticas em meta/stats.json.

Garantia de Qualidade

Lista de Verificação de Qualidade para Dados Coletados

Revise isso após cada sessão de gravação antes de enviar para o Hub.

  • 1
    Os comprimentos dos episódios são consistentes Episódios com comprimento atípico geralmente significam que o operador pausou, a garra escorregou ou a gravação foi interrompida. Mantenha dentro de ±30% do comprimento mediano.
  • 2
    Sem picos de velocidade do servo Os servos STS3215 têm largura de banda limitada — picos de velocidade súbitos em observation.state indicam uma queda no barramento serial. Exclua esses episódios.
  • 3
    Os quadros da câmera estão alinhados com os dados das juntas Verifique se os timestamps da câmera e os timestamps das juntas estão dentro de 20ms um do outro. A latência serial USB pode causar desvio em gravações longas. Re-sincronize as câmeras a cada 100 episódios.
  • 4
    O rastreamento do braço líder foi suave Se o seguidor atrasou visivelmente durante a gravação (devido à latência serial USB), os rótulos de ação estarão deslocados em relação às observações. Reproduza para verificar.
  • 5
    A cena da tarefa foi consistente no início de cada episódio Objetos na mesma posição e orientação. A menor repetibilidade do SO-101 (em comparação com braços CAN) torna isso especialmente importante — a variação nas condições iniciais prejudica o treinamento da política.
  • 6
    Abertura/fechamento da garra está claramente registrada O estado da garra do SO-101 é a junta 6. Verifique se os eventos de apreensão mostram uma clara transição de posição da junta (aberto → fechado) nos dados, não um desvio gradual.
Próximo Passo

Treinando uma Política a partir do Seu Conjunto de Dados

Uma vez que seu conjunto de dados passe nas verificações de qualidade, treine a Política ACT ou Diffusion com o LeRobot.

Treinar ACT

python -m lerobot.scripts.train \
  --policy.type=act \
  --dataset.repo_id=your-username/so101-pick-place-v1 \
  --policy.chunk_size=100 \
  --training.num_epochs=5000 \
  --output_dir=outputs/act-so101-pick-place

Treinar Política de Difusão

python -m lerobot.scripts.train \
  --policy.type=diffusion \
  --dataset.repo_id=your-username/so101-pick-place-v1 \
  --training.num_epochs=8000 \
  --output_dir=outputs/diffusion-so101-pick-place

Conjuntos de dados da comunidade: O SO-101 possui uma das maiores coleções de conjuntos de dados da comunidade no ecossistema LeRobot. Antes de coletar seus próprios dados, verifique HuggingFace Hub para conjuntos de dados existentes do SO-101 — você pode ser capaz de ajustar a partir de um conjunto de dados base existente e economizar tempo de gravação.

Conjunto de Dados Pronto? Comece o Treinamento.

Envie seu conjunto de dados para o HuggingFace e treine o ACT ou a Política de Difusão.