Pagina tutorialului AY-Robots pentru înregistrarea primului tău set de date LeRobot cu un braț SO-100
LeRobotSO-100Înregistrare Set de DateTeleoperareÎnvățare prin Imitație

Înregistrează Primul Tău Set de Date LeRobot cu un SO-100

AY-Robots ResearchAugust 23, 202616 min citire

Înregistrează un set de date LeRobot utilizabil cu un SO-100: calibrare, teleoperare lider-urmăritor, flag-urile și valorile implicite reale ale lerobot-record, configurația camerei, numărul de episoade și defectele care compromit o rulare.

Un SO-100 follower, un braț lider de același design și două camere USB pot ajusta fin o politică într-o după-amiază. Același banc de lucru poate produce la fel de ușor șaizeci de episoade care arată bine într-un explorator de fișiere și poate irosi o rulare GPU de șase ore. Diferența este rar modelul; este ceea ce s-a întâmplat între servomotoare și fișierul parquet.

Iată ruta manuală, apoi cea mai scurtă. Fiecare comandă este din lerobot 0.6.1, lansat pe 3 august 2026 și actual pe PyPI. S-a mutat la puncte de intrare în consolă, așa că tutorialele care rulează python lerobot/scripts/control_robot.py descriu un fișier care nu mai există.

Versiunea scurtă

  • lerobot 0.6.1 înregistrează v3.0; GR00T N1.7 și N1.5 vor v2.1. Stabiliți formatul înainte de a apăsa înregistrare.
  • Patru comenzi: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Folosiți aceleași --robot.id și --teleop.id de la calibrare în sesiunea de înregistrare.
  • Valori implicite reale: 30 fps, 60 s per episod, 60 s resetare, 50 episoade, aproximativ 100 de minute de timp real.
  • Episoade minime aici: 30 pentru SmolVLA, 50 pentru restul.
  • Diversitatea bate volumul. Seturile de date mor din patru motive: indici de cameră inversați, cadre pierdute sau înghețate, o articulație parcată la limită, un șir de sarcini ilizibil.

Ce captează o sesiune de înregistrare

Un set de date LeRobot nu este un folder de videoclipuri, ci un tabel indexat temporal cu videoclipuri atașate: fiecare ciclu de control scrie un rând care conține acțiunea comandată, starea atinsă de urmăritor, un cadru per cameră, un marcaj temporal și indici. Politica vede doar aceste coloane. Schema lerobot/svla_so100_pickplace, citită din meta/info.json.

CaracteristicădtypeShapeCe reprezintă
actionfloat32[6]țintele articulațiilor de la brațul lider
observation.statefloat32[6]pozițiile articulațiilor atinse de urmăritor
observation.images.topvideo[480, 640, 3]cameră de scenă, MP4 (av1 aici)
observation.images.wristvideo[480, 640, 3]cameră de încheietură, aceeași rată
timestampfloat32[1]secunde de la începutul episodului
frame_index, episode_index, index, task_indexint64[1]înregistrări populate automat

Articulațiile sunt main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll și main_gripper: cele șase grade de libertate ale SO-100. Acțiunea și starea partajează o formă deoarece teleoperarea lider-urmăritor înregistrează o țintă și poziția atinsă un pas mai târziu. Acest decalaj este informație: unde brațul s-a luptat cu gravitația sau cu un obiect blocat. Aceste șiruri de caractere aparțin acelui set de date. O sesiune înregistrată cu 0.6.1 astăzi scrie shoulder_pan.pos până la gripper.pos, ID-uri de la 1 la 6 pe magistrală: aceleași șase articulații, chei diferite, ceea ce contează în momentul în care o configurație adresează o caracteristică după nume.

O unitate de măsură dintr-un set de date real

Acest set de date conține 50 de episoade și 19.631 de cadre la 30 fps: aproximativ 393 de cadre, sau 13 secunde, per episod. Dacă ale voastre au o medie de un minut, faceți ceva mai dificil sau înregistrați timp mort la ambele capete.

Intrarea din glosarul AY-Robots pentru formatul de set de date LeRobot, arătând structura directoarelor și fișierele de metadate.
Ce se găsește în data/, videos/ și meta/, și ce politici citesc ce versiune.

Ce ai nevoie pe bancul de lucru

ArticolDetaliiNotă
Braț urmăritorSO-100, șase servomotoare Feetech STS3215aproximativ 110 până la 150 EUR în piese
Braț conducătorun al doilea SO-100, angrenaje îndepărtateangrenaje decuplate de la toate cele șase motoare conducătoare: doar encoder, frecare redusă
Alimentarepotrivită cu varianta STS3215 de 7.4 V din lista de materialevezi avertismentul de mai jos
Cameredouă camere USB, 640x480 la 30 fpso vizualizare a scenei, una pe încheietură
GazdăPython 3.12 sau mai nou, ffmpegrequires-python >= 3.12
Cont Hubtoken de scriere Hugging Faceopțional cu --dataset.push_to_hub=false
7.4 V, nu 12 V

STS3215 vine în două versiuni: README-ul SO-ARM100 evaluează versiunea de 7.4 V la un cuplu de blocare de 16.5 kg.cm măsurat la 6 V și versiunea de 12 V la 30 kg.cm, și menționează că alegerea motoarelor de 12 V înseamnă, de asemenea, achiziționarea unei surse de alimentare de 12 V 5 A+ în loc de cea de 5 V. Lista de materiale specifică servomotoare de 7.4 V. Alimentarea cu 12 V a servomotoarelor evaluate la 7.4 V le distruge, așa că citiți eticheta motorului înainte de a conecta orice. Servomotorul nu răspunde.

Dacă brațul nu este încă construit, aceasta este o sarcină separată: începeți cu și . Dacă nu ați achiziționat nimic, citiți mai întâi : SO-101 este revizia mai nouă, cu cablaj îmbunătățit și fără etapa de îndepărtare a angrenajelor, iar fluxul de lucru de înregistrare este identic.

Instalați 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 afișează un rezumat al sistemului, inclusiv versiunea ffmpeg pe care o poate găsi în PATH.

Extra-urile îi încurcă cel mai mult pe oameni. pip install lerobot instalează doar dependențele ML de bază, nimic care să comunice cu un robot. Brațele Koch necesită dynamixel în loc de feetech. Dacă shell-ul dumneavoastră nu a auzit niciodată de lerobot-record, acesta este motivul.

Porturi, ID-uri motoare și calibrare

Trei pași unici stau între componente și o buclă de teleoperare funcțională. permite ca o politică antrenată pe brațul tău să ruleze pe brațul altcuiva, mapând citirile brute ale encoderului pe o convenție comună a articulațiilor.

  1. 1
    Găsește portul USB al fiecărui braț

    Rulează-l cu ambele brațe conectate, deconectează-l pe cel pe care îl identifici când ți se cere și notează ce port dispare. Pe Linux s-ar putea să ai nevoie de 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
    Scrie ID-urile motoarelor și ratele de transfer

    ID-urile sunt scrise câte un motor pe rând, iar documentația este strictă în privința modului: conectează exact un motor la placa de control, neconectat încă în serie cu altul. Scriptul parcurge lanțul înapoi, cerând mai întâi gripper-ul și dându-i ID-ul 6, apoi wrist_roll ca 5, până la shoulder_pan ca 1. Fă acest lucru înainte de asamblare.

    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
    Calibrează ambele brațe

    Mută fiecare articulație în mijlocul intervalului său, apasă Enter, apoi parcurge fiecare articulație pe întregul său interval. id devine numele fișierului de profil.

    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
    Teleoperează înainte de a înregistra orice

    Testul de acceptanță pentru tot ce este mai sus. Dacă teleoperarea este sacadată, oglindită sau o articulație nu urmează, înregistrarea păstrează acest lucru în 50 de episoade.

    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
Unde ajunge calibrarea și de ce contează ID-ul

Profilurile sunt salvate în $HF_LEROBOT_CALIBRATION, implicit ~/.cache/huggingface/lerobot/calibration, iar ID-ul este cheia de căutare. Dă-i lui lerobot-record un ID calibrat și îți va oferi Enter pentru a reutiliza profilul sau c pentru a-l reface. Dă-i un ID necunoscut și nu va exista niciun fișier, așa că va intra în calibrare în timpul sesiunii.

Camerele decid ce vede politica

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
Rulați aceasta la fiecare sesiune: documentația avertizează că acești identificatori se pot schimba după o repornire sau o reconectare, în funcție de sistemul de operare.

Două vizualizări, iar poziția lor contează: o cameră fixă de scenă care acoperă spațiul de lucru și o cameră de încheietură lângă efectorul final care arată ce urmează să atingă gripper-ul. Lista de verificare a seturilor de date ale comunității LeRobot solicită de preferință două vizualizări la 480x640 / 720p sau mai bune, un fundal static, iluminare neutră și stabilă, iar brațul lider și membrele umane să fie în afara cadrului. Ghidul de înregistrare adaugă o regulă generală: ar trebui să puteți îndeplini sarcina singur, doar privind imaginile camerei.

Indexul camerei nu este o identitate stabilă

Indicii OpenCV provin din ordinea de enumerare, astfel încât o repornire sau o reconectare poate face ca indicii 0 și 2 să-și schimbe locurile și să plaseze vizualizarea de la încheietură în primul slot pentru o întreagă sesiune. lerobot o spune singur: clasa sa de cameră acceptă o cale de dispozitiv, precum și un număr întreg, și avertizează că indicii sunt instabili la reporniri sau schimbări de porturi, în special pe Linux. Indicați index_or_path către symlink-ul udev sub /dev/v4l/by-id/, care urmărește dispozitivul mai degrabă decât ordinea de enumerare. Acesta este cel mai comun mod în care un set de date ajunge să fie intern inconsistent, iar antrenamentul nu îl poate repara. Camera nu a fost detectată.

Comanda record și fiecare 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
Dicționarul camerei este un șir de caractere între ghilimele de shell; acoladele imbricate nu sunt sintaxă de shell.

Valorile implicite de mai jos provin din src/lerobot/configs/dataset.py din ramura main, nu dintr-un tutorial. Câteva nu sunt ceea ce presupun oamenii.

FlagImplicitCe face
--dataset.repo_idemptynume; marcaj de timp adăugat implicit
--dataset.single_taskemptyșir de caractere al sarcinii stocat cu fiecare episod
--dataset.root$HF_LEROBOT_HOME/repo_idcalea de scriere, implicit ~/.cache/huggingface/lerobot/
--dataset.fps30rata buclei de control și rata de cadre a setului de date
--dataset.episode_time_s60secunde înainte ca un episod să avanseze automat
--dataset.reset_time_s60resetare scenă; brațul se mișcă, nimic nu este stocat
--dataset.num_episodes50episoade înregistrate în această sesiune
--dataset.push_to_hubtrueîncărcare la sfârșitul sesiunii; false rămâne local
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablecodificare în timpul capturii; setați-o explicit
--dataset.encoder_queue_maxsize30cadre tamponate per cameră, ~1 s la 30 fps
--dataset.encoder_threadsnull (codec decides)fire de execuție per codificator; reduceți dacă captura sacadează
--dataset.no_stampfalsepăstrează repo_id exact așa cum a fost tastat
--resumefalseadăugare la un set de date existent; necesită --dataset.root
Două flag-uri care te pot costa o oră pe neașteptate

Setul tău de date nu are numele pe care l-ai tastat. lerobot adaugă o etichetă de dată și oră, astfel so100_pick_cube devine so100_pick_cube_20260823_141530. Folosește --dataset.no_stamp=true pentru un nume stabil. Reluarea numără adăugiri, nu totaluri. Cu --resume=true, --dataset.num_episodes numără episoade suplimentare, iar --dataset.root devine obligatoriu. Cere 50 pe un set de date cu 30 de episoade și vei obține 80.

Controlul prin tastatură în timpul unei sesiuni

  • Săgeată dreapta sau n: încheie episodul sau resetează faza mai devreme. Este tasta pe care o vei folosi cel mai mult, deoarece o prindere curată rareori necesită 25 de secunde.
  • Săgeată stânga sau r: renunță la episod și reia-l. O înregistrare proastă nu costă nimic acum, dar poate costa mult mai târziu.
  • Escape sau q: oprește sesiunea, finalizează codificarea, încarcă.
  • Acestea funcționează pe X11, Wayland și SSH fără interfață grafică: fără un backend global pentru taste, lerobot-record citește aceleași taste de la terminalul de control. Literele rezistă legăturilor SSH lente, unde secvențele de săgeți se pot fragmenta.
  • Teleoperarea prin tastatură este diferită și necesită un backend global: X11, Windows sau macOS cu Accesibilitate.

Câte episoade și cum arată un episod bun

Ghidul de înregistrare sugerează cel puțin 50 de episoade pentru o primă sarcină, aproximativ 10 per locație de obiect. Paginile de politici listează un minim per model, sub care o rulare nu merită timpul de GPU.

PoliticăEpisoade minimeFormat set de dateNivel GPUCost per rulare
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

Întrebarea mai bună este câte din ce. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) au colectat peste 40.000 de demonstrații și au rulat peste 15.000 de execuții în lumea reală. Generalizarea a urmat o relație aproximativ de lege de putere cu numărul de medii și obiecte, iar după un prag per mediu sau obiect, demonstrațiile suplimentare au avut un efect minim. Pe un banc de lucru: mută obiectul, schimbă iluminarea, înlocuiește cubul, mai degrabă decât să repeți o singură înregistrare.

Teleoperația lider-urmăritor ca sursă de date
Avantaje
  • Traiectorii continue ale articulațiilor pe care un servo le poate reproduce, spre deosebire de tastatură sau gamepad
  • Acțiunea și starea partajează o convenție de coordonate, astfel încât politica învață o țintă pe care o poate comanda direct
  • Un episod de 25 de secunde plus o resetare de 10 secunde înseamnă aproximativ 100 de episoade pe oră
  • Operatorul simte blocarea sau legarea urmăritorului, astfel încât erorile apar înainte ca datele să fie înregistrate
Compromisuri
  • Un al doilea braț dublează aproximativ costul pieselor
  • Demonstrațiile moștenesc obiceiurile operatorului; Mandlekar et al. au constatat că calitatea politicii depinde în mare măsură de calitatea demonstrațiilor
  • Liderul este eșantionat la rata buclei, astfel încât pauzele devin rânduri aproape identice care învață politica să aștepte
  • Nimic nu impune consistența între sesiuni: o cameră împinsă 5 cm este o schimbare ascunsă a distribuției

Un episod bun este plictisitor: poziție inițială repetabilă, un singur lucru realizat, încheiat odată ce obiectul este în coș, șirul de sarcini în cele 25 până la 50 de caractere recomandate de listă. Ridică cubul roșu și pune-l în cutie este un șir de sarcini; task1 este anti-modelul pe care lista îl menționează explicit. Anotările vagi se află în capul listei de probleme și sunt cele mai importante pentru modele de viziune-limbaj-acțiune, unde șirul este o intrare a modelului, nu un nume de fișier.

Defecte care ruinează în tăcere un set de date

Niciunul nu generează o excepție. Toate supraviețuiesc în timpul antrenamentului, apărând ca o curbă de pierdere care arată bine și un robot care nu face nimic. Verificați în timp ce scena este configurată.

DefectCum aratăDe unde provineCum să-l detectezi
Vizualizări de cameră inversateimaginea de la încheietură sub cheia de susrealocarea indexului după o reconectarelerobot-find-cameras each session; by-id paths
Cadre înghețateaceeași imagine pentru zeci de rânduricamera nu mai livrează; bucla repetă ultimul cadruscrub it in lerobot-dataset-viz
Cadre pierdutenumărul de rânduri sub fps ori secundecoada se umple, renunță la cadre în loc să blocheze'Encoder queue full' in the log; rows vs fps times duration
Articulație la limităo articulație plată la minim sau maximintervalul liderului depășește pe cel al urmăritorului, sau o poziție intermediară greșităper-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand
Imagine și acțiune desincronizatepolitica anticipează sau rămâne în urmăcamere la un fps diferit față de buclăkeep every camera at --dataset.fps
Timp mortșiruri lungi de rânduri de acțiuni identiceoperatorul a pus pauză cu înregistratorul pornitproporția de rânduri de acțiuni identice consecutive
Șir de sarcini inutilizabiltask1, demo2, testtastare rapidămeta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks
Cadrele pierdute se ascund

Encoderul menține o coadă cu dimensiune fixă pentru fiecare cameră, 30 de cadre implicit. Când nu poate ține pasul, cadrele sunt eliminate în loc să fie blocate: capturarea continuă și nimic nu se blochează. Veți primi Encoder queue full for {camera}, dropped N frame(s) și un total pe cameră la sfârșitul episodului. Pragul lerobot: aproximativ 5 procente lipsă înseamnă un sistem supraîncărcat, 2 procente este sarcina de pornire așteptată. Soluții în ordine: --display_data=false, reduceți --dataset.encoder_threads, vcodec=h264, streaming dezactivat.

O precizare: tabelul ghidului de streaming-encoding listează valoarea implicită ca fiind True, în timp ce dataclass-ul din main indică streaming_encoding: bool = False. Documentația și codul nu sunt de acord, așa că setați-o explicit; lerobot înregistrează o sugestie care o recomandă ori de câte ori pornește cu flag-ul dezactivat.

Verificați setul de date înainte de a închiria un GPU

Testul de acceptare din documentație: comparați durata video cu durata episodului raportată de CLI și confirmați că numărul de rânduri este egal cu fps ori durată. Pe episod, nu pe 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"])
Un episod cu o durată mult diferită de fps ori durată este un candidat pentru ștergere, nu pentru antrenament.

Apoi, analizează-l. lerobot-dataset-viz redă un episod cadru cu cadru, cu urme ale articulațiilor lângă vizualizările camerei, în Rerun sau Foxglove. Camerele inversate și cadrele înghețate apar în zece secunde. Oamenii sar peste acest pas.

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 realizează, de asemenea, divizarea, îmbinarea, eliminarea de caracteristici, modificarea sarcinilor și recalcularea statisticilor. Ștergeți generos: un episod prost costă un episod; păstrarea lui costă fiecare rulare antrenată pe el.
Directorul de seturi de date AY-Robots care listează seturile de date publice LeRobot cu numărul de episoade și formate
Cum sunt dimensionate și adnotate seturile de date comparabile.

v2.1 sau v3.0: decideți înainte de a înregistra

v2.1 a scris un fișier parquet și un fișier MP4 per episod. v3.0 concatenează multe episoade în fragmente partajate și reconstruiește limitele din metadate, astfel încât info.json conține șabloane de cale precum data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet în loc de un număr de episod. Justificarea din amonte este un număr mai mic de fișiere, dar mai mari: inițializare mai rapidă și presiune redusă asupra sistemului de fișiere la scară.

LeRobot v2.1LeRobot v3.0
Structurăun fișier parquet și un fișier MP4 per episodmulte episoade per fragment
Metadate episodFișiere JSONLparquet fragmentat sub meta/episodes/, prin intermediul stivei de seturi de date
Streaming din Hubnuda, prin StreamingLeRobotDataset
Scris de lerobot 0.6.1nuda, ceea ce obțineți astăzi
Citit de GR00T N1.7 și N1.5danu, trebuie convertit la o versiune anterioară
Înregistrare astăzi, antrenare GR00T mâine

lerobot 0.6.1 scrie v3.0, dar GR00T N1.7 și N1.5 citesc v2.0 sau v2.1 și se blochează la acesta. Rețineți direcția de conversie: src/lerobot/scripts/ conține convert_dataset_v21_to_v30.py și nimic în sens invers. Clarificați acest aspect înainte de sesiune. Soluție: set de date respins ca 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
Rapid pentru 50 de episoade. Scalarea este o altă sarcină: ghidul de portare lerobot, pentru DROID brut în v3.0, prevede 7+ zile de procesare locală și aproximativ 400 GB.

Două rute către același set de date

Totul de mai sus, pe propria mașină: tu deții enumerarea USB, compilarea ffmpeg, reglajul encoderului și fișierele de calibrare. Ruta corectă pentru a înțelege pipeline-ul, a rula o configurație neobișnuită de cameră sau a păstra datele local.

Ce costă această rută

Timp: o seară pe braț pentru asamblare, o primă calibrare dificilă și o primă sesiune pe care o arunci pentru că o cameră a fost în slotul greșit.

Înregistrează seturi de date LeRobot fără a cabla singur pipeline-ul

Clientul desktop AY-Robots înregistrează episoade, fluxuri video și stări ale articulațiilor în format LeRobot dintr-o sesiune de teleoperațiune, apoi predă setul de date antrenorului.

Obține clientul desktop

De la setul de date la politică

Cincizeci de episoade curate alimentează fiecare rulare aici. se antrenează de la zero doar pe sarcina dvs., cu aproximativ 80 M parametri la aproximativ 20 ms per pas de acțiune, fiind singurul dintre cele cinci confortabil cu mișcarea rapidă. are aproximativ 450 M parametri pe o placă de 24 GB. este un model fundamental cu aproximativ 3 B parametri unde atinge aproximativ 40 M parametri, necesită un A100 sau H100 și dorește acel set de date v2.1.

Apoi, ghidul pentru combinația dvs.: , sau ; pentru o primă rulare, este mai scurt. Când politica funcționează pe bancul de test, dar se prăbușește în momentul în care mutați masa, aceasta este o problemă de date: și aprofundează diversitatea.

Câte episoade am nevoie cu adevărat pentru o primă politică funcțională?

Treizeci pentru SmolVLA, cincizeci pentru ACT, Pi0.5, GR00T N1.5 și N1.7, minimurile impuse de antrenorii AY-Robots. Ghidul LeRobot recomandă independent cel puțin 50 pentru o primă sarcină, aproximativ 10 per locație de obiect. Lucrările de scalare a datelor au constatat că generalizarea scalează cu mediile și obiectele, mai degrabă decât cu numărul de demonstrații, astfel că o sută de înregistrări dintr-o singură scenă este mai puțin eficientă decât cincizeci în cinci plasamente diferite.

Am nevoie de un braț lider, sau pot teleopera cu o tastatură?

lerobot livrează teleoperatori pentru tastatură și gamepad, deci un braț lider nu este strict necesar, dar este puternic preferabil: lider-urmăritor oferă traiectorii continue ale articulațiilor în convenția de coordonate a acțiunii înregistrate, în timp ce intrarea de la tastatură produce o mișcare în trepte pe care o politică o învață ca smucitură. Teleoperarea cu tastatura necesită, de asemenea, un backend global pentru taste, deci eșuează pe Wayland și în mod headless.

Pot înregistra pe un Raspberry Pi sau un mini PC mic?

Da, cu ajustări. Ghidul de codificare în streaming are o secțiune pentru resurse reduse, acoperind mașini moderne cu 4 nuclee și Raspberry Pi 5, și plasează două camere la 640x480 și 30 fps în coloana sa „necesită unele ajustări”. Sfatul său: opriți encoderul să concureze cu bucla de captură, prin --dataset.rgb_encoder.vcodec=h264 și --dataset.streaming_encoding=false. Evaluează două camere la 640x480 ca având aproximativ 55 de milioane de pixeli pe secundă și două la 1920x1080 ca având aproximativ 373 de milioane.

Cum știu că setul de date pe care tocmai l-am înregistrat este de fapt sănătos?

Trei verificări simple. Comparați durata video a fiecărui episod cu durata raportată de CLI și confirmați că numărul de rânduri este egal cu fps ori acea durată, per episod, mai degrabă decât pe total; acesta este testul de acceptare oferit de ghidul de codificare lerobot. Citiți ds.meta.stats, unde o articulație al cărei minim este egal cu maximul nu s-a mișcat niciodată. Apoi redați două sau trei episoade în lerobot-dataset-viz, singura modalitate prin care apar vizualizări inversate și cadre înghețate. În cazul cadrelor pierdute, ghidul trasează linia la aproximativ 5 la sută lipsă; aproximativ 2 la sută este o sarcină tranzitorie normală, adesea doar la pornire.

Jobul meu de antrenament a respins setul de date ca v3.0. Ce fac acum?

GR00T N1.7 și N1.5 citesc LeRobot v2.0 sau v2.1 și se blochează pe v3.0, ceea ce înregistrează lerobot 0.6.1. Fie stabiliți formatul înainte de antrenament, fie utilizați o politică care citește v3.0 nativ: Pi0.5, SmolVLA sau ACT. lerobot livrează un convertor de la v2.1 la v3.0 și nimic invers.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started