
Î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ă | dtype | Shape | Ce reprezintă |
|---|---|---|---|
| action | float32 | [6] | țintele articulațiilor de la brațul lider |
| observation.state | float32 | [6] | pozițiile articulațiilor atinse de urmăritor |
| observation.images.top | video | [480, 640, 3] | cameră de scenă, MP4 (av1 aici) |
| observation.images.wrist | video | [480, 640, 3] | cameră de încheietură, aceeași rată |
| timestamp | float32 | [1] | secunde de la începutul episodului |
| frame_index, episode_index, index, task_index | int64 | [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.
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.

Ce ai nevoie pe bancul de lucru
| Articol | Detalii | Notă |
|---|---|---|
| Braț urmăritor | SO-100, șase servomotoare Feetech STS3215 | aproximativ 110 până la 150 EUR în piese |
| Braț conducător | un al doilea SO-100, angrenaje îndepărtate | angrenaje decuplate de la toate cele șase motoare conducătoare: doar encoder, frecare redusă |
| Alimentare | potrivită cu varianta STS3215 de 7.4 V din lista de materiale | vezi avertismentul de mai jos |
| Camere | două camere USB, 640x480 la 30 fps | o vizualizare a scenei, una pe încheietură |
| Gazdă | Python 3.12 sau mai nou, ffmpeg | requires-python >= 3.12 |
| Cont Hub | token de scriere Hugging Face | opțional cu --dataset.push_to_hub=false |
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
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-infoExtra-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.
- 1Gă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.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. - 2Scrie 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.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Calibrează ambele brațe
Mută fiecare articulație în mijlocul intervalului său, apasă Enter, apoi parcurge fiecare articulație pe întregul său interval.
iddevine numele fișierului de profil.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 - 4Teleoperează î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.
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
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
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.0Două 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.
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
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=2Valorile 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.
| Flag | Implicit | Ce face |
|---|---|---|
| --dataset.repo_id | empty | nume; marcaj de timp adăugat implicit |
| --dataset.single_task | empty | șir de caractere al sarcinii stocat cu fiecare episod |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | calea de scriere, implicit ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | rata buclei de control și rata de cadre a setului de date |
| --dataset.episode_time_s | 60 | secunde înainte ca un episod să avanseze automat |
| --dataset.reset_time_s | 60 | resetare scenă; brațul se mișcă, nimic nu este stocat |
| --dataset.num_episodes | 50 | episoade înregistrate în această sesiune |
| --dataset.push_to_hub | true | încărcare la sfârșitul sesiunii; false rămâne local |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | codificare în timpul capturii; setați-o explicit |
| --dataset.encoder_queue_maxsize | 30 | cadre tamponate per cameră, ~1 s la 30 fps |
| --dataset.encoder_threads | null (codec decides) | fire de execuție per codificator; reduceți dacă captura sacadează |
| --dataset.no_stamp | false | păstrează repo_id exact așa cum a fost tastat |
| --resume | false | adăugare la un set de date existent; necesită --dataset.root |
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 minime | Format set de date | Nivel GPU | Cost per rulare |
|---|---|---|---|---|
| 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 |
Î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.
- 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
- 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ă.
| Defect | Cum arată | De unde provine | Cum să-l detectezi |
|---|---|---|---|
| Vizualizări de cameră inversate | imaginea de la încheietură sub cheia de sus | realocarea indexului după o reconectare | lerobot-find-cameras each session; by-id paths |
| Cadre înghețate | aceeași imagine pentru zeci de rânduri | camera nu mai livrează; bucla repetă ultimul cadru | scrub it in lerobot-dataset-viz |
| Cadre pierdute | numărul de rânduri sub fps ori secunde | coada 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 maxim | intervalul 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 desincronizate | politica 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 identice | operatorul a pus pauză cu înregistratorul pornit | proporția de rânduri de acțiuni identice consecutive |
| Șir de sarcini inutilizabil | task1, demo2, test | tastare rapidă | meta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks |
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.
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"])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.
# 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 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.1 | LeRobot v3.0 | |
|---|---|---|
| Structură | un fișier parquet și un fișier MP4 per episod | multe episoade per fragment |
| Metadate episod | Fișiere JSONL | parquet fragmentat sub meta/episodes/, prin intermediul stivei de seturi de date |
| Streaming din Hub | nu | da, prin StreamingLeRobotDataset |
| Scris de lerobot 0.6.1 | nu | da, ceea ce obțineți astăzi |
| Citit de GR00T N1.7 și N1.5 | da | nu, trebuie convertit la o versiune anterioară |
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.
# 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=falseDouă 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.
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.
Clientul desktop înregistrează seturi de date, episoade, fluxuri video și stări ale articulațiilor în format LeRobot, direct dintr-o sesiune de teleoperațiune. Acest set de date alimentează formularul de antrenament: alege modelul, setul de date și hiperparametrii, iar backend-ul închiriază un GPU dimensionat după VRAM-ul modelului, rulează antrenorul și scrie puncte de control în stocarea de obiecte.
- 1Instalează clientul
Pe pagina de descărcare; configurare în documentația clientului.
- 2Înregistrează dintr-o sesiune de teleoperațiune
Condu brațul; clientul scrie episoade în format LeRobot. Ghid pas cu pas: înregistrează primul tău set de date.
- 3Sau adu-ți propriile date
Un set de date poate proveni și dintr-un ID de depozit Hugging Face sau de pe propria mașină: documentația seturilor de date, directorul public.
- 4Antrenează și rulează înapoi
Alege combinația din matricea de antrenament, apoi rulează politica înapoi pe braț. Aproximativ 1 până la 3 USD pe nivelul de 24 GB, 4 până la 12 pe nivelul A100 sau H100.
Nu asamblează sau calibrează brațul tău și nu repară un episod defect, deci pasul de inspecție se aplică în continuare. Există, de asemenea, o limită strictă la celălalt capăt: pentru sarcini rapide, inferența trebuie să stea lângă servomotoare. Bucla de control rulează 20 până la 485 ms per pas de acțiune, iar călătoriile dus-întors prin internetul public transformă o politică funcțională într-una ezitantă.
Î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 desktopDe 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.
Sources
- LeRobot: Învățare prin imitație pe roboți din lumea reală
- LeRobot: Asamblare SO-100, configurare motor și calibrare
- LeRobot: Camere și lerobot-find-cameras
- LeRobot: Instalare și matricea de extra-uri
- LeRobotDataset v3.0: structură și migrare v2.1
- LeRobot: Codificare video în flux și cadre pierdute
- LeRobot: Portarea seturilor mari de date la v3.0 (DROID)
- Lansare lerobot v0.6.1, 3 august 2026
- DatasetRecordConfig: setările implicite reale de înregistrare
- lerobot_record.py: bucla de înregistrare și gestionarea reluării
- TheRobotStudio/SO-ARM100: depozit de construcție și lista de materiale
- Hugging Face: Lista de verificare a seturilor de date comunitare LeRobot
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Legile de scalare a datelor în învățarea prin imitație
- Mandlekar et al. (2021), Ce contează în învățarea din demonstrațiile 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