
Registra un dataset LeRobot utilizzabile con un SO-100: calibrazione, teleoperazione leader-follower, i veri flag e valori predefiniti di lerobot-record, configurazione della telecamera, conteggio degli episodi e i difetti che rovinano un'esecuzione.
Un SO-100 follower, un braccio leader dello stesso design e due telecamere USB possono mettere a punto una policy in un pomeriggio. Lo stesso banco può altrettanto facilmente produrre sessanta episodi che sembrano sani in un browser di file e sprecare un'esecuzione GPU di sei ore. La differenza è raramente il modello; è ciò che è successo tra i servi e il file parquet.
Ecco il percorso manuale, poi quello più breve. Ogni comando proviene da lerobot 0.6.1, rilasciato il 3 agosto 2026 e attuale su PyPI. Si è spostato ai punti di ingresso della console, quindi i tutorial che eseguono python lerobot/scripts/control_robot.py descrivono un file che non esiste più.
La versione breve
- •lerobot 0.6.1 registra v3.0; GR00T N1.7 e N1.5 richiedono v2.1. Definisci il formato prima di premere registra.
- •Quattro comandi: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Utilizza gli stessi --robot.id e --teleop.id dalla calibrazione nella sessione di registrazione.
- •Valori predefiniti reali: 30 fps, 60 s per episodio, 60 s di reset, 50 episodi, circa 100 minuti di tempo effettivo.
- •Episodi minimi qui: 30 per SmolVLA, 50 per il resto.
- •La diversità batte il volume. I dataset muoiono per quattro motivi: indici della telecamera scambiati, frame persi o congelati, un giunto parcheggiato al suo limite, una stringa di attività illeggibile.
Cosa cattura una sessione di registrazione
Un dataset LeRobot non è una cartella di video ma una tabella indicizzata nel tempo con video allegati: ogni tick del ciclo di controllo scrive una riga contenente l'azione comandata, lo stato raggiunto dal follower, un frame per telecamera, un timestamp e gli indici. La policy vede solo quelle colonne. Lo schema di lerobot/svla_so100_pickplace, letto dal suo meta/info.json.
| Caratteristica | tipo di dato | Forma | Descrizione |
|---|---|---|---|
| action | float32 | [6] | target delle giunture dal braccio leader |
| observation.state | float32 | [6] | posizioni delle giunture raggiunte dal follower |
| observation.images.top | video | [480, 640, 3] | telecamera di scena, MP4 (av1 qui) |
| observation.images.wrist | video | [480, 640, 3] | telecamera da polso, stessa frequenza |
| timestamp | float32 | [1] | secondi dall'inizio dell'episodio |
| frame_index, episode_index, index, task_index | int64 | [1] | contabilità auto-popolata |
Le giunture sono main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll e main_gripper: i sei gradi di libertà del SO-100. Azione e stato condividono una forma perché la teleoperazione leader-follower registra un target e la posizione raggiunta un passo dopo. Quel divario è informazione: dove il braccio ha combattuto la gravità o un oggetto bloccato. Quelle stringhe sono del dataset. Una sessione registrata con 0.6.1 oggi scrive shoulder_pan.pos fino a gripper.pos, ID da 1 a 6 sul bus: le stesse sei giunture, chiavi diverse, il che è importante nel momento in cui una configurazione si riferisce a una caratteristica per nome.
Quel dataset contiene 50 episodi e 19.631 frame a 30 fps: circa 393 frame, o 13 secondi, per episodio. Se i tuoi episodi durano in media un minuto, stai facendo qualcosa di più difficile o registrando tempo morto a entrambe le estremità.

Cosa serve sul banco
| Elemento | Dettaglio | Nota |
|---|---|---|
| Braccio follower | SO-100, sei servomotori Feetech STS3215 | circa 110-150 EUR in componenti |
| Braccio leader | un secondo SO-100, ingranaggi rimossi | ingranaggi rimossi da tutti e sei i motori leader: solo encoder, meno attrito |
| Alimentazione | corrispondente alla variante STS3215 da 7.4 V nella distinta base | vedi l'avviso sotto |
| Telecamere | due telecamere USB, 640x480 a 30 fps | una vista della scena, una sul polso |
| Host | Python 3.12 o più recente, ffmpeg | requires-python >= 3.12 |
| Account Hub | token di scrittura Hugging Face | opzionale con --dataset.push_to_hub=false |
L'STS3215 è disponibile in due versioni: il README di SO-ARM100 valuta la versione da 7.4 V con una coppia di stallo di 16.5 kg.cm misurata a 6 V e la versione da 12 V con 30 kg.cm, e nota che scegliere i motori da 12 V significa anche acquistare un alimentatore da 12 V 5 A+ invece di quello da 5 V. La distinta base elenca servomotori da 7.4 V. Alimentare servomotori da 7.4 V con 12 V li distrugge, quindi leggere l'etichetta del motore prima di cablare qualsiasi cosa. Servo non risponde.
Se il braccio non è ancora stato costruito, quella è una serata a parte: inizia da Introduzione a SO-100 e la guida completa all'installazione di SO-100. Se non hai ancora acquistato nulla, leggi prima il confronto tra SO-100 e SO-101 per primo: l'SO-101 è la revisione più recente con cablaggio migliorato e senza il passaggio di rimozione degli ingranaggi, e il flusso di lavoro di registrazione è identico.
Installa lerobot 0.6.1
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-infoGli extra sono ciò che confonde di più le persone. pip install lerobot installa solo le dipendenze ML principali, nulla che comunichi con un robot. I bracci Koch necessitano di dynamixel invece di feetech. Se la tua shell non ha mai sentito parlare di lerobot-record, questo è il motivo.
Porte, ID motore e calibrazione
Tre passaggi unici si frappongono tra i componenti e un ciclo di teleoperazione funzionante. permette a una policy addestrata sul tuo braccio di funzionare su quello di qualcun altro, mappando i conteggi grezzi dell'encoder su una convenzione di giunto condivisa.
- 1Trova la porta USB di ciascun braccio
Eseguilo con entrambi i bracci collegati, scollega quello che stai identificando quando richiesto e annota quale porta scompare. Su Linux potrebbe essere necessario
sudo chmod 666 /dev/ttyACM0.bashlerobot-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. - 2Scrivi gli ID motore e i baudrate
Gli ID vengono scritti un motore alla volta, e la documentazione è rigorosa su come: collega esattamente un motore alla scheda controller, non ancora collegato in cascata ad altri. Lo script percorre la catena all'indietro, chiedendo prima la pinza e assegnandole l'ID 6, poi il polso (wrist_roll) come 5, fino alla spalla (shoulder_pan) come 1. Eseguilo prima dell'assemblaggio.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Calibra entrambi i bracci
Sposta ogni giunto al centro del suo intervallo, premi Invio, quindi muovi ciascuno lungo il suo intero intervallo. L'
iddiventa il nome del file del profilo.bashlerobot-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 - 4Teleopera prima di registrare qualsiasi cosa
Il test di accettazione per tutto quanto sopra. Se la teleoperazione è a scatti, specchiata, o un giunto non segue, la registrazione lo conserva in 50 episodi.
bashlerobot-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
I profili vanno in $HF_LEROBOT_CALIBRATION, predefinito ~/.cache/huggingface/lerobot/calibration, e l'ID è la chiave di ricerca. Dai a lerobot-record un ID calibrato e ti offrirà Invio per riutilizzare il profilo o c per rifarlo. Dai un ID sconosciuto e non ci sarà alcun file, quindi passerà alla calibrazione a metà sessione.
Le telecamere decidono cosa vede la policy
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.0Due viste, e la loro posizione è importante: una telecamera fissa sulla scena che copre l'area di lavoro, e una telecamera da polso vicino all'effettore finale che mostra ciò che la pinza sta per toccare. La checklist dei dataset della comunità LeRobot richiede preferibilmente due viste a 480x640 / 720p o superiori, uno sfondo statico, un'illuminazione neutra e stabile, e il braccio del leader e gli arti umani fuori dall'inquadratura. La guida alla registrazione aggiunge la regola pratica: dovresti essere in grado di svolgere il compito tu stesso guardando solo le immagini della telecamera.
Gli indici OpenCV derivano dall'ordine di enumerazione, quindi un riavvio o una riconnessione possono far sì che gli indici 0 e 2 si scambino di posto e mettano la vista del polso nello slot superiore per un'intera sessione. lerobot lo dice esplicitamente: la sua classe di telecamera accetta un percorso del dispositivo oltre a un intero, e avverte che gli indici sono instabili tra riavvii o cambiamenti di porta, specialmente su Linux. Punta index_or_path al symlink udev sotto /dev/v4l/by-id/, che segue il dispositivo piuttosto che l'ordine di enumerazione. Questo è il modo più comune in cui un dataset finisce per essere internamente inconsistente, e l'addestramento non può ripararlo. Telecamera non rilevata.
Il comando record e ogni flag
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=2I valori predefiniti di seguito provengono da src/lerobot/configs/dataset.py su main, non da un tutorial. Molti non sono ciò che le persone presumono.
| Flag | Predefinito | Cosa fa |
|---|---|---|
| --dataset.repo_id | empty | nome; timestamp aggiunto per impostazione predefinita |
| --dataset.single_task | empty | stringa del task memorizzata con ogni episodio |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | percorso di scrittura, predefinito ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | frequenza del ciclo di controllo e frequenza dei fotogrammi del dataset |
| --dataset.episode_time_s | 60 | secondi prima che un episodio avanzi automaticamente |
| --dataset.reset_time_s | 60 | reset della scena; il braccio si muove, nulla viene memorizzato |
| --dataset.num_episodes | 50 | episodi registrati in questa sessione |
| --dataset.push_to_hub | true | caricamento alla fine della sessione; false rimane locale |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | codifica durante l'acquisizione; impostalo esplicitamente |
| --dataset.encoder_queue_maxsize | 30 | fotogrammi bufferizzati per telecamera, ~1 s a 30 fps |
| --dataset.encoder_threads | null (codec decides) | thread per encoder; riduci se l'acquisizione si blocca |
| --dataset.no_stamp | false | mantieni repo_id esattamente come digitato |
| --resume | false | aggiungi a un dataset esistente; richiede --dataset.root |
Il tuo dataset non ha il nome che hai digitato. lerobot aggiunge un tag data-ora, quindi so100_pick_cube diventa so100_pick_cube_20260823_141530. Usa --dataset.no_stamp=true per un nome stabile. Resume conta le aggiunte, non i totali. Con --resume=true, --dataset.num_episodes conta gli episodi aggiuntivi e --dataset.root diventa obbligatorio. Chiedi 50 su un dataset di 30 episodi e ne ottieni 80.
Controllo da tastiera durante una sessione
- Freccia destra o
n: termina l'episodio o la fase di reset in anticipo. Il tasto che userai di più, perché una presa pulita raramente richiede 25 secondi. - Freccia sinistra o
r: scarta l'episodio e rifallo. Una cattiva ripresa non costa nulla ora e molto più tardi. - Escape o
q: ferma la sessione, termina la codifica, carica. - Questi funzionano su X11, Wayland e SSH headless: senza un backend di tasti globale, lerobot-record legge gli stessi tasti dal terminale di controllo. Le lettere sopravvivono a collegamenti SSH lenti, dove le sequenze di frecce si dividono.
- La teleoperazione da tastiera è diversa e richiede un backend globale: X11, Windows o macOS con Accessibilità.
Quanti episodi, e come si presenta uno buono
La guida alla registrazione suggerisce almeno 50 episodi per un primo compito, circa 10 per posizione dell'oggetto. Le pagine delle policy elencano un minimo per modello, al di sotto del quale un'esecuzione non vale il tempo della GPU.
| Policy | Episodi minimi | Formato del dataset | Livello GPU | Costo per esecuzione |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
La domanda migliore è quanti di cosa. Leggi di Scala dei Dati nell'Apprendimento per Imitazione per la Manipolazione Robotica (Lin et al., 2024) hanno raccolto oltre 40.000 dimostrazioni e eseguito più di 15.000 rollouts nel mondo reale. La generalizzazione ha seguito una relazione approssimativamente di legge di potenza con il numero di ambienti e oggetti, e superata una soglia per ambiente o oggetto, dimostrazioni aggiuntive hanno avuto un effetto minimo. Su un banco: sposta l'oggetto, cambia l'illuminazione, scambia il cubo, piuttosto che ripetere una singola ripresa.
- Traiettorie articolari continue che un servo può riprodurre, a differenza di tastiera o gamepad
- Azione e stato condividono una convenzione di coordinate, quindi la policy impara un obiettivo che può comandare direttamente
- Un episodio di 25 secondi più un reset di 10 secondi equivale a circa 100 episodi all'ora
- L'operatore sente il follower bloccarsi o incepparsi, quindi i difetti emergono prima che i dati vengano registrati
- Un secondo braccio raddoppia approssimativamente il costo dei componenti
- Le dimostrazioni ereditano le abitudini dell'operatore; Mandlekar et al. hanno scoperto che la qualità della policy dipende fortemente dalla qualità della dimostrazione
- Il leader viene campionato alla frequenza del loop, quindi le pause diventano righe quasi identiche che insegnano alla policy ad aspettare
- Nulla impone la coerenza tra le sessioni: una telecamera spostata di 5 cm è uno spostamento di distribuzione nascosto
Un buon episodio è noioso: posa iniziale ripetibile, una cosa fatta, terminato una volta che l'oggetto è nel contenitore, stringa del compito tra i 25 e i 50 caratteri raccomandati dalla checklist. Prendi il cubo rosso e lascialo cadere nella scatola è una stringa di compito; task1 è l'anti-pattern che la checklist nomina esplicitamente. Le annotazioni vaghe sono in cima alla sua lista di problemi, e sono più importanti per , dove la stringa è un input del modello, non un nome di file.
Difetti che rovinano silenziosamente un dataset
Nessuno genera un'eccezione. Tutti sopravvivono all'addestramento, emergendo come una curva di perdita che sembra a posto e un robot che non fa nulla. Controllare mentre la scena è allestita.
| Difetto | Come si presenta | Da dove proviene | Come rilevarlo |
|---|---|---|---|
| Viste della telecamera scambiate | immagine del polso sotto la chiave superiore | riassegnazione dell'indice dopo una riconnessione | lerobot-find-cameras ad ogni sessione; percorsi by-id |
| Fotogrammi bloccati | la stessa immagine per decine di righe | la telecamera smette di fornire; il loop ripete l'ultimo fotogramma | esaminarlo in lerobot-dataset-viz |
| Fotogrammi persi | conteggio delle righe inferiore a fps per secondi | la coda si riempie, scarta invece di bloccare | 'Encoder queue full' nel log; righe vs fps per durata |
| Articolazione al suo limite | un'articolazione piatta al minimo o al massimo | il range del leader supera quello del follower, o una posa intermedia errata | min/max per articolazione in ds.meta.stats; lerobot-find-joint-limits in anticipo |
| Immagine e azione fuori sincrono | la policy anticipa o ritarda | telecamere con un fps diverso dal loop | mantenere ogni telecamera a --dataset.fps |
| Tempo morto | lunghe sequenze di righe di azione identiche | operatore in pausa con il registratore in funzione | quota di righe di azione identiche consecutive |
| Stringa di compito inutilizzabile | task1, demo2, test | digitazione veloce | meta/tasks.parquet in v3.0 (era meta/tasks.jsonl in v2.1); correggere con lerobot-edit-dataset modify_tasks |
L'encoder mantiene una coda limitata per ogni telecamera, 30 frame per impostazione predefinita. Quando non riesce a tenere il passo, i frame vengono scartati anziché bloccati: l'acquisizione continua e nulla si blocca. Si riceve Encoder queue full for {camera}, dropped N frame(s) e un totale per telecamera alla fine dell'episodio. La soglia di lerobot: circa il 5 percento di frame mancanti indica un sistema sovraccarico, il 2 percento è il carico di avvio previsto. Soluzioni in ordine: --display_data=false, ridurre --dataset.encoder_threads, vcodec=h264, streaming disattivato.
Un'avvertenza: la tabella della guida alla codifica in streaming elenca il valore predefinito come True, mentre la dataclass su main legge streaming_encoding: bool = False. Documentazione e codice non concordano, quindi impostalo esplicitamente; lerobot registra un suggerimento che lo raccomanda ogni volta che si avvia con il flag disattivato.
Controlla il dataset prima di noleggiare una GPU
Il test di accettazione dalla documentazione: confronta la durata del video con la durata dell'episodio riportata dalla CLI e conferma che il numero di righe è uguale a fps per durata. Per episodio, non sul totale.
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"])Poi guardalo. lerobot-dataset-viz riproduce un episodio fotogramma per fotogramma con tracce articolari accanto alle viste della telecamera, in Rerun o Foxglove. Telecamere scambiate e fotogrammi congelati appaiono in dieci secondi. Le persone saltano questo passaggio.
# 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]"
v2.1 o v3.0: decidi prima di registrare
v2.1 scriveva un file parquet e un MP4 per episodio. v3.0 concatena molti episodi in shard condivisi e ricostruisce i confini dai metadati, quindi info.json contiene modelli di percorso come data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet invece di un numero di episodio. La giustificazione a monte è un numero inferiore di file più grandi: inizializzazione più rapida e minore pressione sul file system su larga scala.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Layout | un file parquet e un MP4 per episodio | molti episodi per shard |
| Metadati episodio | file JSONL | parquet chunked sotto meta/episodes/, tramite lo stack dei dataset |
| Streaming dall'Hub | no | sì, tramite StreamingLeRobotDataset |
| Scritto da lerobot 0.6.1 | no | sì, quello che ottieni oggi |
| Letto da GR00T N1.7 e N1.5 | sì | no, deve essere convertito a una versione precedente |
lerobot 0.6.1 scrive v3.0, ma GR00T N1.7 e N1.5 leggono v2.0 o v2.1 e vanno in crash. Si noti la direzione di marcia: src/lerobot/scripts/ contiene convert_dataset_v21_to_v30.py e nulla che vada nella direzione opposta. Risolvi questo prima della sessione. Correzione: dataset rifiutato come v3.
# 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=falseDue percorsi allo stesso dataset
Tutto quanto sopra, sulla tua macchina: sei responsabile dell'enumerazione USB, della compilazione di ffmpeg, della messa a punto dell'encoder e dei file di calibrazione. Il percorso giusto per comprendere la pipeline, eseguire una configurazione di telecamere insolita o mantenere i dati locali.
Tempo: una sera per braccio per l'assemblaggio, una prima calibrazione complessa e una prima sessione da scartare perché una telecamera era nello slot sbagliato.
Il client desktop registra dataset, episodi, flussi di telecamere e stati delle giunture in formato LeRobot, direttamente da una sessione di teleoperazione. Quel dataset alimenta il modulo di addestramento: scegli modello, dataset e iperparametri, e il backend noleggia una GPU dimensionata dalla VRAM del modello, esegue l'addestratore e scrive checkpoint nell'archiviazione oggetti.
- 1Installa il client
Sulla pagina di download; configurazione nella documentazione del client.
- 2Registra da una sessione di teleoperazione
Guida il braccio; il client scrive gli episodi in formato LeRobot. Guida passo-passo: registra il tuo primo dataset.
- 3Oppure porta i tuoi dati
Un dataset può anche provenire da un ID repo di Hugging Face o dalla tua macchina: documentazione sui dataset, directory pubblica.
- 4Addestra e rieseguilo
Scegli la combinazione sulla matrice di addestramento, quindi esegui la policy sul braccio. Circa 1 a 3 USD sul livello da 24 GB, da 4 a 12 sul livello A100 o H100.
Non assembla né calibra il tuo braccio, e non ripara un episodio difettoso, quindi il passaggio di ispezione è ancora valido. C'è anche un limite rigido all'altra estremità: per compiti veloci, l'inferenza deve essere vicina ai servi. Il ciclo di controllo esegue da 20 a 485 ms per passo d'azione, e i round trip su internet pubblico in aggiunta trasformano una policy funzionante in una esitante.
Registra dataset LeRobot senza cablare la pipeline da solo
Il client desktop di AY-Robots registra episodi, flussi di telecamere e stati delle giunture in formato LeRobot da una sessione di teleoperazione, quindi consegna il dataset all'addestratore.
Ottieni il client desktopDal dataset alla policy
Cinquanta episodi puliti alimentano ogni esecuzione di apprendimento per imitazione qui. ACT si addestra da zero solo sul vostro compito, circa 80 M parametri a circa 20 ms per passo d'azione, l'unico dei cinque a suo agio con il movimento rapido. SmolVLA è di circa 450 M parametri su una scheda da 24 GB. GR00T N1.7 è un modello di base di circa 3 B parametri dove il fine-tuning tocca circa 40 M parametri, necessita di una A100 o H100 e richiede quel dataset v2.1.
Successivamente, la guida per la vostra combinazione: ACT su SO-100, SmolVLA su SO-100 o GR00T N1.7 su SO-100; per una prima esecuzione, addestrare la vostra prima policy è più breve. Quando la policy funziona sul banco ma collassa nel momento in cui si sposta il tavolo, si tratta di un problema di dati: la policy funziona solo in una configurazione e la raccolta di dati di addestramento VLA di alta qualità approfondiscono la diversità.
Quanti episodi mi servono davvero per una prima policy funzionante?▾
Trenta per SmolVLA, cinquanta per ACT, Pi0.5, GR00T N1.5 e N1.7, i minimi imposti dagli addestratori AY-Robots. La guida LeRobot raccomanda indipendentemente almeno 50 per un primo compito, circa 10 per posizione dell'oggetto. Il lavoro di scalatura dei dati ha rilevato che la generalizzazione scala con gli ambienti e gli oggetti piuttosto che con il numero di dimostrazioni, quindi cento riprese di una scena sono peggio di cinquanta su cinque posizionamenti.
Ho bisogno di un braccio leader, o posso teleoperare con una tastiera?▾
lerobot fornisce teleoperatori da tastiera e gamepad, quindi un braccio leader non è strettamente necessario, ma è fortemente preferibile: leader-follower fornisce traiettorie articolari continue nella convenzione di coordinate dell'azione registrata, mentre l'input da tastiera produce un movimento a scatti che una policy impara come scatto. La teleoperazione da tastiera richiede anche un backend di chiavi globale, quindi fallisce su Wayland e in modalità headless.
Posso registrare su un Raspberry Pi o un piccolo mini PC?▾
Sì, con la messa a punto. La guida alla codifica in streaming ha una fascia di risorse basse che copre le moderne macchine a 4 core e il Raspberry Pi 5, e colloca due telecamere a 640x480 e 30 fps nella sua colonna 'richiede una certa messa a punto'. Il suo consiglio: impedire che il codificatore competa con il ciclo di acquisizione, tramite --dataset.rgb_encoder.vcodec=h264 e --dataset.streaming_encoding=false. Valuta due telecamere a 640x480 a circa 55 milioni di pixel al secondo e due a 1920x1080 a circa 373 milioni.
Come faccio a sapere se il dataset che ho appena registrato è effettivamente sano?▾
Tre controlli economici. Confrontare la durata del video di ogni episodio con la durata riportata dalla CLI e confermare che il numero di righe sia uguale a fps moltiplicato per quella durata, per episodio piuttosto che sul totale; questo è il test di accettazione fornito dalla guida di codifica di lerobot. Leggere ds.meta.stats, dove un'articolazione il cui min è uguale al suo max non si è mai mossa. Quindi riprodurre due o tre episodi in lerobot-dataset-viz, l'unico modo per visualizzare viste scambiate e fotogrammi bloccati. Sui fotogrammi persi la guida traccia la linea a circa il 5 percento mancante; circa il 2 percento è un normale carico transitorio, spesso solo all'avvio.
Il mio job di addestramento ha rifiutato il dataset come v3.0. Cosa faccio ora?▾
GR00T N1.7 e N1.5 leggono LeRobot v2.0 o v2.1 e vanno in crash su v3.0, che è ciò che registra lerobot 0.6.1. O si stabilisce il formato prima dell'addestramento, o si usa una policy che legga v3.0 nativamente: Pi0.5, SmolVLA o ACT. lerobot fornisce un convertitore da v2.1 a v3.0 e nulla in senso inverso.
Sources
- LeRobot: Apprendimento per Imitazione su Robot del Mondo Reale
- LeRobot: Assemblaggio SO-100, configurazione e calibrazione del motore
- LeRobot: Telecamere e lerobot-find-cameras
- LeRobot: Installazione e la matrice degli extra
- LeRobotDataset v3.0: layout e migrazione da v2.1
- LeRobot: Codifica video in streaming e frame persi
- LeRobot: Porting di grandi dataset a v3.0 (DROID)
- lerobot v0.6.1 release, 3 agosto 2026
- DatasetRecordConfig: i valori predefiniti di registrazione reali
- lerobot_record.py: ciclo di registrazione e gestione del ripristino
- TheRobotStudio/SO-ARM100: repository di build e distinta base
- Hugging Face: Checklist dei Dataset della Community LeRobot
- lerobot/svla_so100_pickplace: 50 episodi, 19.631 frame
- Lin et al. (2024), Leggi di Scaling dei Dati nell'Apprendimento per Imitazione
- Mandlekar et al. (2021), Cosa Conta nell'Apprendimento da Dimostrazioni Umane Offline
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started