La pagina del tutorial AY-Robots per la registrazione del tuo primo dataset LeRobot con un braccio SO-100
LeRobotSO-100Registrazione DatasetTeleoperazioneApprendimento per Imitazione

Registra il tuo primo dataset LeRobot con un SO-100

AY-Robots ResearchAugust 23, 202616 min di lettura

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.

Caratteristicatipo di datoFormaDescrizione
actionfloat32[6]target delle giunture dal braccio leader
observation.statefloat32[6]posizioni delle giunture raggiunte dal follower
observation.images.topvideo[480, 640, 3]telecamera di scena, MP4 (av1 qui)
observation.images.wristvideo[480, 640, 3]telecamera da polso, stessa frequenza
timestampfloat32[1]secondi dall'inizio dell'episodio
frame_index, episode_index, index, task_indexint64[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.

Un metro di paragone da un dataset reale

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

La voce del glossario AY-Robots per il formato del dataset LeRobot, che mostra il layout della directory e i file di metadati
Cosa si trova in data/, videos/ e meta/, e quali politiche leggono quale versione.

Cosa serve sul banco

ElementoDettaglioNota
Braccio followerSO-100, sei servomotori Feetech STS3215circa 110-150 EUR in componenti
Braccio leaderun secondo SO-100, ingranaggi rimossiingranaggi rimossi da tutti e sei i motori leader: solo encoder, meno attrito
Alimentazionecorrispondente alla variante STS3215 da 7.4 V nella distinta basevedi l'avviso sotto
Telecameredue telecamere USB, 640x480 a 30 fpsuna vista della scena, una sul polso
HostPython 3.12 o più recente, ffmpegrequires-python >= 3.12
Account Hubtoken di scrittura Hugging Faceopzionale con --dataset.push_to_hub=false
7.4 V, non 12 V

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

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 stampa un riepilogo del sistema, inclusa la versione di ffmpeg che riesce a trovare nel PATH.

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

  1. 1
    Trova 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.

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

    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
    Calibra entrambi i bracci

    Sposta ogni giunto al centro del suo intervallo, premi Invio, quindi muovi ciascuno lungo il suo intero intervallo. L'id diventa il nome del file del profilo.

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

    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
Dove finisce la calibrazione e perché l'ID è importante

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

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
Esegui questo ad ogni sessione: la documentazione avverte che questi identificatori potrebbero cambiare dopo un riavvio o una riconnessione, a seconda del sistema operativo.

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

L'indice della telecamera non è un'identità stabile

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

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
Il dizionario della telecamera è una stringa racchiusa tra virgolette di shell; le parentesi graffe annidate non sono sintassi di shell.

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

FlagPredefinitoCosa fa
--dataset.repo_idemptynome; timestamp aggiunto per impostazione predefinita
--dataset.single_taskemptystringa del task memorizzata con ogni episodio
--dataset.root$HF_LEROBOT_HOME/repo_idpercorso di scrittura, predefinito ~/.cache/huggingface/lerobot/
--dataset.fps30frequenza del ciclo di controllo e frequenza dei fotogrammi del dataset
--dataset.episode_time_s60secondi prima che un episodio avanzi automaticamente
--dataset.reset_time_s60reset della scena; il braccio si muove, nulla viene memorizzato
--dataset.num_episodes50episodi registrati in questa sessione
--dataset.push_to_hubtruecaricamento alla fine della sessione; false rimane locale
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablecodifica durante l'acquisizione; impostalo esplicitamente
--dataset.encoder_queue_maxsize30fotogrammi bufferizzati per telecamera, ~1 s a 30 fps
--dataset.encoder_threadsnull (codec decides)thread per encoder; riduci se l'acquisizione si blocca
--dataset.no_stampfalsemantieni repo_id esattamente come digitato
--resumefalseaggiungi a un dataset esistente; richiede --dataset.root
Due flag che costano un'ora a sorpresa

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.

PolicyEpisodi minimiFormato del datasetLivello GPUCosto per esecuzione
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

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.

Teleoperazione leader-follower come fonte di dati
Vantaggi
  • 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
Compromessi
  • 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.

DifettoCome si presentaDa dove provieneCome rilevarlo
Viste della telecamera scambiateimmagine del polso sotto la chiave superioreriassegnazione dell'indice dopo una riconnessionelerobot-find-cameras ad ogni sessione; percorsi by-id
Fotogrammi bloccatila stessa immagine per decine di righela telecamera smette di fornire; il loop ripete l'ultimo fotogrammaesaminarlo in lerobot-dataset-viz
Fotogrammi persiconteggio delle righe inferiore a fps per secondila coda si riempie, scarta invece di bloccare'Encoder queue full' nel log; righe vs fps per durata
Articolazione al suo limiteun'articolazione piatta al minimo o al massimoil range del leader supera quello del follower, o una posa intermedia erratamin/max per articolazione in ds.meta.stats; lerobot-find-joint-limits in anticipo
Immagine e azione fuori sincronola policy anticipa o ritardatelecamere con un fps diverso dal loopmantenere ogni telecamera a --dataset.fps
Tempo mortolunghe sequenze di righe di azione identicheoperatore in pausa con il registratore in funzionequota di righe di azione identiche consecutive
Stringa di compito inutilizzabiletask1, demo2, testdigitazione velocemeta/tasks.parquet in v3.0 (era meta/tasks.jsonl in v2.1); correggere con lerobot-edit-dataset modify_tasks
I frame scartati si nascondono

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.

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"])
Un episodio con un fps molto diverso dalla durata è un candidato per l'eliminazione, non per l'addestramento.

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.

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 esegue anche split, merge, remove_feature, modify_tasks e il ricalcolo delle statistiche. Elimina generosamente: un episodio scadente costa un episodio; mantenerlo costa ogni esecuzione addestrata su di esso.
La directory dei dataset AY-Robots che elenca i dataset pubblici LeRobot con conteggi di episodi e formati
Come vengono dimensionati e annotati i dataset comparabili.

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.1LeRobot v3.0
Layoutun file parquet e un MP4 per episodiomolti episodi per shard
Metadati episodiofile JSONLparquet chunked sotto meta/episodes/, tramite lo stack dei dataset
Streaming dall'Hubnosì, tramite StreamingLeRobotDataset
Scritto da lerobot 0.6.1nosì, quello che ottieni oggi
Letto da GR00T N1.7 e N1.5no, deve essere convertito a una versione precedente
Registrare oggi, addestrare GR00T domani

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.

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
Veloce per 50 episodi. La scalabilità è un lavoro diverso: la guida al porting di lerobot, per DROID raw in v3.0, prevede oltre 7 giorni di elaborazione locale e circa 400 GB.

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

Cosa costa questo percorso

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.

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 desktop

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

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started