Conteúdo detalhado
🎓 Aprender por demonstração (imitação)
No módulo 5.3 você fez o seguidor copiar o líder em tempo real. Agora a ideia é dar um passo além: gravar essas demonstrações e treinar uma rede neural que aprende a ligação "o que eu vejo e onde minhas juntas estão → qual o próximo movimento". Depois de treinada, ela comanda o seguidor sem ninguém no líder. Isso se chama aprendizado por imitação.
🌱 Novo aqui?
Uma política é o programa que decide a próxima ação a partir do que o robô observa. Aqui ela é uma rede neural, não um código com if. Imitação quer dizer que a rede aprende copiando exemplos de uma pessoa, em vez de descobrir sozinha por tentativa e erro (isso seria aprendizado por reforço, que quase sempre se faz em simulação, assunto do 5.5).
Como ler: as setas verdes são uma volta do ciclo; o bloco brilhante (treinar) é o único que precisa de GPU. A seta ciano é o que separa quem consegue de quem desiste: a avaliação diz em que situação a política erra, e a correção é gravar mais exemplos exatamente dessa situação.
✓ Boa primeira tarefa
- ✓Pegar um cubo de espuma e pôr numa caixa rasa.
- ✓Objeto leve, colorido e que contrasta com a mesa.
- ✓Sucesso fácil de julgar: está ou não está na caixa.
✗ Deixe para depois
- ✗Dobrar pano, abrir tampa de rosca, encaixe justo.
- ✗Objeto transparente, brilhante ou mais pesado que a garra aguenta.
- ✗Várias tarefas diferentes no mesmo dataset logo de início.
Por que aprender
Programar a mão um "pegar e soltar" funciona até o cubo sair 3 cm do lugar. A política aprendida olha a câmera a cada instante e corrige o caminho. É assim que os laboratórios ensinam braços hoje, e o SO-101 com o LeRobot põe esse método na sua mesa.
Conceitos-chave
⏺️ Gravar episódios com lerobot-record
Cada demonstração gravada é um episódio. O comando lerobot-record liga o líder, o seguidor e as câmeras, e a cada quadro guarda três coisas: as imagens, a posição atual das juntas do seguidor (o estado) e a posição que o líder mandou (a ação). Entre um episódio e outro há um tempo de reset para você arrumar a mesa.
🌱 Novo aqui?
Quadro é um instante gravado (a 30 quadros por segundo, um a cada 33 ms). Estado é onde o braço está; ação é para onde ele foi mandado ir. A rede aprende a prever a ação a partir da imagem e do estado. Os 6 números de cada um são as juntas do SO-101: base, ombro, cotovelo, flexão e giro do punho, garra.
Como ler: cada coluna é um quadro. A linha de cima é o que a câmera viu (o cubo se aproxima, é pego e aparece na caixa). As linhas de baixo são os números que a rede vai aprender a relacionar: dado o estado e a imagem, prever a ação. A instrução de texto vale para o episódio inteiro.
Passo a passo da primeira gravação
Confira portas, calibração e câmera
Use as mesmas portas e os mesmos id de calibração do 5.3. Rode lerobot-find-cameras e anote o índice da câmera de frente.
Fixe a cena
Câmera presa (fita ou suporte), luz constante, caixa sempre no mesmo lugar. Só o cubo muda de posição entre episódios.
Grave 2 episódios de teste
Rode o comando abaixo com num_episodes=2, sem enviar à nuvem. Se tudo der certo, apague a pasta de teste e grave de verdade (50 episódios é um bom começo).
Objetivo: gravar episódios da tarefa "pôr o cubo na caixa" com uma câmera de frente. Troque as portas, os id e o seu usuário do Hugging Face (sem os sinais < >).
# Gravar demonstrações com o par SO-101 (Linux; no Windows a porta é COM3, COM4...)
HF_USER=<seu_usuario_hf> # troque pelo seu usuário do Hugging Face
DATASET=cubo-na-caixa-teste # nome do dataset
lerobot-record \
--robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor \
--robot.cameras="{ frente: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--teleop.type=so101_leader --teleop.port=/dev/ttyACM1 --teleop.id=lider \
--dataset.repo_id=${HF_USER}/${DATASET} \
--dataset.single_task="Pôr o cubo vermelho na caixa cinza." \
--dataset.num_episodes=2 \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=10 \
--dataset.push_to_hub=false \
--display_data=true
Como verificar
- ✓Abre uma janela com a imagem da câmera e gráficos das juntas mudando quando você mexe o líder.
- ✓O terminal anuncia o início de cada episódio e do reset; no fim aparece a pasta em ~/.cache/huggingface/lerobot/.
- ✗Erro de porta ou de calibração? Volte ao 5.3. Os nomes das flags mudam entre versões: confira com lerobot-record --help e na doc atual.
✓ Demonstração boa
- ✓Movimento calmo e sempre do mesmo jeito.
- ✓Cubo em posições variadas, cobrindo a área toda.
- ✓Começa e termina com o braço em repouso.
✗ Estraga o dataset
- ✗Hesitar, voltar atrás, tentar de dois jeitos diferentes.
- ✗Sua mão ou braço aparecendo na frente da câmera.
- ✗Mover a câmera ou mudar a luz no meio da gravação.
Por que aprender
A política nunca será melhor que as demonstrações. Quem grava com calma e consistência treina uma vez; quem grava com pressa treina cinco vezes e não entende por que não funciona.
Conceitos-chave
🗂️ Dataset no Hugging Face Hub
O LeRobot salva cada dataset numa pasta com formato padrão: tabelas com estado e ação, vídeos das câmeras e um arquivo de metadados. Esse mesmo formato pode ser enviado ao Hugging Face Hub, onde você treina numa máquina com GPU (ou no Colab) sem copiar arquivos à mão, e onde outras pessoas podem usar seus dados, se você quiser.
🌱 Novo aqui?
O Hugging Face Hub é um site gratuito que guarda modelos e datasets, parecido com um GitHub para IA. O repo_id é o endereço do dataset: usuario/nome. Para enviar, você cria uma conta, gera um token de escrita nas configurações e faz login uma vez no terminal.
Como ler: o nome no topo é o repo_id. As tabelas (meio) são leves; os vídeos (direita, em ciano) ocupam quase todo o espaço. Se o dataset ficou pesado demais, reduza a resolução ou o número de câmeras, não o número de episódios.
Objetivo: fazer login, conferir um episódio gravado e enviar o dataset ao Hub como privado. Rode no mesmo ambiente Python em que instalou o LeRobot.
hf auth login # cola o token de escrita (uma vez por máquina)
lerobot-dataset-viz --repo-id <seu_usuario_hf>/<dataset> --episode-index 0
# Abre o dataset local, mostra o tamanho e envia ao Hub como privado.
import sys
from lerobot.datasets.lerobot_dataset import LeRobotDataset
repo_id = sys.argv[1] # ex.: <seu_usuario_hf>/<dataset>
ds = LeRobotDataset(repo_id) # lê de ~/.cache/huggingface/lerobot/
print("episódios:", ds.num_episodes, "| quadros:", ds.num_frames, "| fps:", ds.fps)
print("colunas:", list(ds.features))
ds.push_to_hub(private=True) # privado: só você vê
print("enviado: https://huggingface.co/datasets/" + repo_id)
Como verificar
- ✓O visualizador mostra o vídeo do episódio 0 com as curvas das 6 juntas sincronizadas.
- ✓python subir_dataset.py <seu_usuario_hf>/<dataset> imprime o número de episódios (o que você gravou) e as colunas, incluindo estado, ação e a câmera "frente".
- ✓A página do dataset abre no navegador logado e aparece como privada.
💡 Privacidade
A câmera grava o que estiver ao fundo: rostos, a casa, papéis na mesa. Em escola, deixe o dataset privado e enquadre só a bancada. Torne público apenas o que você revisou episódio por episódio.
Por que aprender
Separar "onde grava" de "onde treina" resolve o problema de quem não tem GPU em casa: grava no notebook ao lado do braço e treina no Colab ou no laboratório. E um dataset bem documentado vira material de aula para a turma inteira.
Conceitos-chave
🏋️ Treinar ACT com lerobot-train
A ACT (Action Chunking with Transformers) é a política recomendada para começar: pequena, treina rápido e funciona bem com 50 episódios de uma tarefa. O truque dela está no nome: em vez de prever um movimento por vez, ela prevê um pedaço (chunk) de vários movimentos seguidos, o que deixa o braço mais suave e menos hesitante.
Como ler: à esquerda está tudo o que a rede vê num instante. À direita, as barras são movimentos futuros: as cheias são executadas, as vazadas são jogadas fora porque, até lá, a câmera já terá informação nova. A seta ciano fecha a malha, como no ciclo sentir-pensar-agir do 1.1.
🌱 Novo aqui?
Treinar é ajustar milhões de números da rede até ela errar pouco ao prever as ações gravadas. Cada ajuste usa um lote de quadros (batch) e conta como um passo (step). De tempos em tempos o treino salva um checkpoint: uma cópia da rede naquele ponto, que você pode testar ou retomar.
Objetivo: treinar uma ACT no seu dataset numa máquina com GPU NVIDIA. Em Mac com chip Apple, troque cuda por mps; sem GPU, use o Colab (há um caderno pronto na documentação do LeRobot).
# Treinar a política ACT (confira as flags com: lerobot-train --help)
HF_USER=<seu_usuario_hf>
DATASET=<dataset>
lerobot-train \
--dataset.repo_id=${HF_USER}/${DATASET} \
--policy.type=act \
--policy.device=cuda \
--output_dir=outputs/train/act-${DATASET} \
--job_name=act-${DATASET} \
--batch_size=8 \
--steps=20000 \
--wandb.enable=false \
--policy.push_to_hub=false
Como verificar
- ✓O terminal mostra linhas com o passo atual e a loss (o erro), que deve cair rápido no começo e depois devagar.
- ✓Aparecem pastas em outputs/train/…/checkpoints/; a mais recente fica em last/pretrained_model.
- ✗"CUDA out of memory"? Diminua --batch_size (4 ou 2). O tempo pode ir de minutos a muitas horas conforme a GPU e o número de passos.
💡 Loss baixa não é sucesso
A loss mede quanto a rede copia as demonstrações gravadas, não quanto ela acerta a tarefa no mundo. Uma rede pode decorar os 50 episódios e falhar quando o cubo aparece num lugar novo. O único número que vale é a taxa de sucesso no braço, que você mede no próximo tópico.
Por que aprender
Saber ler o treino evita desperdício de GPU: você aprende a parar quando a loss estabilizou, a testar checkpoints intermediários e a distinguir "falta dado" de "falta treino".
Conceitos-chave
🧪 Avaliar a política no braço real
Avaliar é deixar a política comandar o seguidor, sem o líder, e contar quantas vezes ela acerta. Na versão atual do LeRobot isso se faz com lerobot-rollout; versões anteriores usavam o próprio lerobot-record com a política indicada. Confira qual vale para a sua instalação com --help.
Segurança antes do primeiro teste
Uma política recém-treinada pode fazer movimentos bruscos e inesperados. Os servos do SO-101 são pequenos, mas prendem dedo e derrubam objetos. Mão no interruptor da fonte do seguidor, mesa livre, ninguém dentro do alcance do braço, primeiro teste curto.
Objetivo: rodar a política treinada por 30 segundos no seguidor, com a mesma câmera e a mesma instrução da gravação.
# Rodar a política no braço real (confira as flags com: lerobot-rollout --help)
POLITICA=outputs/train/act-<dataset>/checkpoints/last/pretrained_model
lerobot-rollout \
--strategy.type=base \
--policy.path=${POLITICA} \
--robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=seguidor \
--robot.cameras="{ frente: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--task="Pôr o cubo vermelho na caixa cinza." \
--duration=30
Como verificar
- ✓O seguidor se move sozinho em direção ao cubo; o líder pode ficar desligado.
- ✓Depois de 30 segundos o comando termina e o braço para.
- ✗Braço tremendo ou indo para um canto fixo? A câmera mudou de lugar desde a gravação, ou o nome da câmera não bate com o do dataset ("frente").
Planilha de avaliação (20 tentativas)
| Posição do cubo | Tentativas | Acertos | Como falhou |
|---|---|---|---|
| Perto do centro (visto na gravação) | 10 | anote | errou a pega, soltou fora… |
| Nas bordas da área gravada | 5 | anote | anote |
| Fora da área gravada | 5 | anote | anote |
✓ Avaliação honesta
- ✓Defina "sucesso" antes de começar e não mude depois.
- ✓Sorteie as posições do cubo; não escolha as fáceis.
- ✓Grave em vídeo e anote o tipo de falha de cada erro.
✗ Engana você mesmo
- ✗Contar só as tentativas que você filmou.
- ✗Empurrar o cubo "só um pouquinho" para ajudar.
- ✗Concluir algo com 3 tentativas.
Quando o padrão de falha aparecer (por exemplo, "erra sempre que o cubo está à esquerda"), grave 10 a 20 episódios novos naquela região e treine de novo. O LeRobot também tem um modo em que você assume o controle com o líder quando a política erra e essa correção vira episódio novo (--strategy.type=dagger); é o jeito mais eficiente de melhorar depois da primeira versão.
Por que aprender
Sem avaliação com número, todo projeto de IA "quase funciona". Com a planilha você sabe exatamente onde está, compara versões e tem algo concreto para mostrar na apresentação do projeto final.
Conceitos-chave
🗣️ SmolVLA e pi0: políticas com linguagem
A ACT aprende uma tarefa e ignora o texto. Um VLA (modelo Visão-Linguagem-Ação, apresentado no 5.1) recebe também a instrução escrita e pode fazer tarefas diferentes conforme o pedido: "ponha o cubo na caixa" ou "ponha a bola na caixa". Esses modelos já vêm pré-treinados em muitos robôs; você só faz o ajuste fino com os seus episódios.
Como ler: a diferença entre um VLA e a ACT é a caixa ciano. Com o texto, o mesmo modelo escolhe qual objeto pegar. O texto não vira código nem lista de passos: ele condiciona diretamente os movimentos das juntas.
| Política | Entende texto | Peso para treinar | Quando usar |
|---|---|---|---|
| ACT | não | leve | uma tarefa, primeiro projeto |
| SmolVLA | sim | médio (GPU com boa memória) | algumas tarefas com o mesmo braço |
| pi0 / pi0.5 | sim | pesado (GPU grande ou nuvem) | pesquisa, tarefas variadas |
Objetivo: fazer o ajuste fino do SmolVLA a partir do modelo base lerobot/smolvla_base usando o seu dataset. Grave antes episódios com instruções diferentes (por exemplo, metade "cubo", metade "bola").
# Instalar o extra do SmolVLA no mesmo ambiente do LeRobot
pip install "lerobot[smolvla]"
# Ajuste fino a partir do modelo base (confira as flags na doc atual)
lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=<seu_usuario_hf>/<dataset> \
--policy.device=cuda \
--output_dir=outputs/train/smolvla-<dataset> \
--batch_size=16 \
--steps=20000 \
--wandb.enable=false \
--policy.push_to_hub=false
Como verificar
- ✓No início, o treino baixa os pesos do modelo base do Hub (só na primeira vez) e depois mostra a loss caindo, como na ACT.
- ✓Na avaliação, troque só o texto de --task e veja se o braço muda de objeto.
- ✗Falta memória na GPU? Diminua o batch ou treine no Colab. A família pi0 / pi0.5 pede ainda mais; comece pela ACT ou pelo SmolVLA.
💡 Veja também: dados de simulação
O projeto INEMA robotica-real2sim gera episódios numa simulação e os exporta no formato do LeRobot (no teste: 50 episódios com câmeras, 4.361 quadros, 9,7 MB). Misturar poucos episódios reais com muitos simulados é o assunto do próximo módulo.
Por que aprender
O projeto final (5.6) precisa de um braço que obedeça a pedidos diferentes. Com a ACT você treina uma política por tarefa e o modelo de linguagem escolhe qual chamar; com um VLA, uma política só recebe o pedido em texto. Conhecer os dois caminhos deixa você escolher pelo hardware que tem.
Conceitos-chave
✅ Resumo do módulo
Para ir além
- Documentação do LeRobot — comandos e flags da versão atual
- Modelo base do SmolVLA — ponto de partida do ajuste fino
- LeRobot no GitHub — código, exemplos e discussões
- robotica-real2sim (INEMA) — passo a passo para quem tem um SO-101 e dados simulados
Próximo módulo
5.5 · Simular antes do real: o gêmeo do SO-101 no MuJoCo, real2sim e a distância entre simulado e real.