
Įrašykite tinkamą LeRobot duomenų rinkinį su SO-100: kalibravimas, lyderio-sekėjo teleoperacija, tikrosios lerobot-record vėliavėlės ir numatytosios reikšmės, kameros nustatymas, epizodų skaičius ir defektai, kurie sugadina vykdymą.
SO-100 sekėjas, SO-100 tos pačios konstrukcijos pagrindinė ranka ir dvi USB kameros gali patikslinti politiką per popietę. Tas pats stendas gali taip pat lengvai sukurti šešiasdešimt epizodų, kurie atrodo gerai failų naršyklėje, ir sugaišti šešių valandų GPU vykdymą. Skirtumas retai būna modelyje; tai yra tai, kas nutiko tarp servovariklių ir parquet failo.
Štai rankinis kelias, tada trumpesnis. Kiekviena komanda yra iš lerobot 0.6.1, išleistos 2026 m. rugpjūčio 3 d. ir dabartinės PyPI. Ji persikėlė į konsolės įvesties taškus, todėl pamokos, kurios paleidžia python lerobot/scripts/control_robot.py aprašo failą, kurio nebėra.
Trumpoji versija
- •lerobot 0.6.1 įrašo v3.0; GR00T N1.7 ir N1.5 nori v2.1. Nustatykite formatą prieš paspausdami įrašymo mygtuką.
- •Keturios komandos: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Naudokite tuos pačius --robot.id ir --teleop.id iš kalibravimo įrašymo sesijoje.
- •Tikrosios numatytosios reikšmės: 30 kadrų per sekundę, 60 s vienam epizodui, 60 s atstatymas, 50 epizodų, apie 100 minučių realaus laiko.
- •Minimalus epizodų skaičius čia: 30 SmolVLA, 50 likusiems.
- •Įvairovė svarbiau už kiekį. Duomenų rinkiniai žūsta dėl keturių dalykų: sukeistų kamerų indeksų, praleistų ar užšalusių kadrų, sąnario, sustojusio ties jo riba, neįskaitomos užduoties eilutės.
Ką užfiksuoja įrašymo sesija
A LeRobot duomenų rinkinys nėra vaizdo įrašų aplankas, o laiku indeksuota lentelė su pridėtu vaizdo įrašu: kiekvienas valdymo ciklo taktas įrašo vieną eilutę, kurioje yra įsakyta veiksena, būsena, kurią pasiekė sekėjas, vienas kadras iš kiekvienos kameros, laiko žyma ir indeksai. Politika mato tik šiuos stulpelius. Schema lerobot/svla_so100_pickplace, perskaityta iš jo meta/info.json.
| Funkcija | dtype | Forma | Kas tai yra |
|---|---|---|---|
| action | float32 | [6] | jungčių taikiniai iš lyderio rankos |
| observation.state | float32 | [6] | jungčių pozicijos, kurias pasiekė sekėjas |
| observation.images.top | video | [480, 640, 3] | scenos kamera, MP4 (čia av1) |
| observation.images.wrist | video | [480, 640, 3] | riešo kamera, toks pat dažnis |
| timestamp | float32 | [1] | sekundės nuo epizodo pradžios |
| frame_index, episode_index, index, task_index | int64 | [1] | automatiškai užpildoma apskaita |
Jungtys yra main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll ir main_gripper: SO-100 šeši laisvės laipsniai. Veiksena ir būsena turi bendrą formą, nes lyderio-sekėjo teleoperacija įrašo taikinį ir poziciją, pasiektą vienu žingsniu vėliau. Šis tarpas yra informacija: kur ranka kovojo su gravitacija ar įstrigusiu objektu. Šios eilutės priklauso tam duomenų rinkiniui. Sesija, įrašyta su 0.6.1 šiandien, rašo shoulder_pan.pos iki gripper.pos, ID nuo 1 iki 6 magistralėje: tos pačios šešios jungtys, skirtingi raktai, o tai svarbu, kai konfigūracija kreipiasi į funkciją pagal pavadinimą.
Šis duomenų rinkinys turi 50 epizodų ir 19 631 kadrą 30 kadrų per sekundę greičiu: apie 393 kadrus, arba 13 sekundžių, vienam epizodui. Jei jūsų vidurkis yra minutė, jūs darote kažką sudėtingesnio arba įrašote tuščią laiką abiejuose galuose.

Ko jums reikės ant stalo
| Elementas | Aprašymas | Pastaba |
|---|---|---|
| Sekimo ranka | SO-100, six Feetech STS3215 servos | apie 110–150 EUR dalims |
| Vado ranka | antra SO-100, pašalintos pavaros | nuimtos pavaros nuo visų šešių vado variklių: tik enkoderis, mažiau trinties |
| Maitinimas | pritaikytas 7.4 V STS3215 variantui, nurodytam medžiagų sąraše | žr. įspėjimą žemiau |
| Kameros | dvi USB kameros, 640x480, 30 kadrų per sekundę | vienas scenos vaizdas, vienas ant riešo |
| Pagrindinis kompiuteris | Python 3.12 or newer, ffmpeg | requires-python >= 3.12 |
| Hub paskyra | Hugging Face write token | optional with --dataset.push_to_hub=false |
STS3215 yra dviejų versijų: SO-ARM100 README nurodo, kad 7.4 V versijos blokuojantis sukimo momentas yra 16.5 kg.cm, matuojant prie 6 V, o 12 V versijos – 30 kg.cm, ir pažymi, kad pasirinkus 12 V variklius, taip pat reikia įsigyti 12 V 5 A+ maitinimo šaltinį vietoj 5 V. Medžiagų sąraše nurodyti 7.4 V servovarikliai. Maitinant 12 V į 7.4 V skirtus servovariklius, jie sugenda, todėl prieš prijungdami ką nors, perskaitykite variklio etiketę. Servovariklis nereaguoja.
Jei ranka dar nesurinkta, tai atskiras vakaras: pradėkite nuo SO-100 pradžia ir išsamaus SO-100 nustatymo vadovo. Jei dar nieko nepirkote, pirmiausia perskaitykite SO-100 ir SO-101 palyginimą: SO-101 yra naujesnė versija su patobulintu laidų išdėstymu ir be pavarų nuėmimo žingsnio, o įrašymo eiga yra identiška.
Įdiekite 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-infoPriedai dažniausiai sukelia problemų. pip install lerobot įdiegia tik pagrindines ML priklausomybes, nieko, kas bendrautų su robotu. Koch rankoms reikia dynamixel vietoj feetech. Jei jūsų apvalkalas niekada negirdėjo apie lerobot-record, tai yra priežastis.
Prievadai, variklių ID ir kalibravimas
Trys vienkartiniai žingsniai skiria dalis nuo veikiančios teleoperacijos kilpos. leidžia jūsų rankai apmokytą politiką paleisti ant kito roboto, susiejant neapdorotus kodavimo įrenginio skaičius su bendra jungčių konvencija.
- 1Raskite kiekvienos rankos USB prievadą
Paleiskite jį prijungus abi rankas, atjunkite tą, kurią identifikuojate, kai būsite paraginti, ir atkreipkite dėmesį, kuris prievadas dingsta. Linux sistemoje gali prireikti
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. - 2Įrašykite variklių ID ir perdavimo spartą
ID rašomi po vieną variklį, o dokumentacija griežtai nurodo, kaip: prijunkite tiksliai vieną variklį prie valdiklio plokštės, dar neprijungtą prie jokio kito. Skriptas eina grandine atgal, pirmiausia prašydamas griebtuvo ir suteikdamas jam ID 6, tada riešo pasukimui ID 5, iki peties pasukimo ID 1. Atlikite tai prieš surinkimą.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Kalibruokite abi rankas
Perkelkite kiekvieną jungtį į jos diapazono vidurį, paspauskite Enter, tada perbraukite kiekvieną per visą jos diapazoną.
idtampa profilio failo pavadinimu.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 - 4Teleoperuokite prieš ką nors įrašydami
Viso to, kas išdėstyta aukščiau, priėmimo testas. Jei teleoperacija yra trūkčiojanti, atspindėta arba viena jungtis neseka, įrašymas išsaugo tai 50 epizodų.
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
Profiliai patenka į $HF_LEROBOT_CALIBRATION, numatytasis ~/.cache/huggingface/lerobot/calibration, o ID yra paieškos raktas. Suteikite lerobot-record kalibruotą ID ir jis pasiūlys paspausti Enter, kad pakartotinai naudotumėte profilį, arba c, kad jį perdarytumėte. Suteikite jam nežinomą ID ir failo nebus, todėl jis pereis į kalibravimą sesijos viduryje.
Kameros nustato, ką mato politika
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.0Du vaizdai, ir jų padėtis yra svarbi: fiksuota scenos kamera, apimanti darbo sritį, ir riešo kamera šalia galinio efektoriaus rodanti, ką griebtuvas ketina paliesti. LeRobot bendruomenės duomenų rinkinių kontrolinis sąrašas prašo pageidautina dviejų vaizdų 480x640 / 720p ar geresnės raiškos, statinio fono, neutralaus stabilaus apšvietimo, o lyderio ranka ir žmogaus galūnės turi būti už kadro. Įrašymo vadovas prideda nykščio taisyklę: turėtumėte gebėti atlikti užduotį patys, žiūrėdami tik į kameros vaizdus.
OpenCV indeksai gaunami iš išvardijimo tvarkos, todėl perkrovimas ar pakartotinis prijungimas gali priversti indeksus 0 ir 2 apsikeisti vietomis ir įdėti riešo vaizdą į viršutinę vietą visai sesijai. lerobot pats tai sako: jo kameros klasė priima įrenginio kelią, taip pat sveikąjį skaičių, ir įspėja, kad indeksai yra nestabilūs po perkrovimų ar prievadų pakeitimų, ypač Linux sistemoje. Nurodykite index_or_path į udev simbolinę nuorodą po /dev/v4l/by-id/, kuri seka įrenginį, o ne išvardijimo tvarką. Tai yra dažniausias būdas, kaip duomenų rinkinys tampa viduje nenuoseklus, ir apmokymas negali to ištaisyti. Kamera neaptikta.
Įrašymo komanda ir kiekviena vėliavėlė
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Žemiau pateiktos numatytosios reikšmės yra iš src/lerobot/configs/dataset.py pagrindinėje šakoje, o ne iš pamokos. Kelios iš jų nėra tokios, kokių žmonės tikisi.
| Vėliavėlė | Numatytoji reikšmė | Ką tai daro |
|---|---|---|
| --dataset.repo_id | empty | pavadinimas; laiko žyma pridedama automatiškai |
| --dataset.single_task | empty | užduoties eilutė, saugoma su kiekvienu epizodu |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | rašymo kelias, numatytasis ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | valdymo ciklo dažnis ir duomenų rinkinio kadrų dažnis |
| --dataset.episode_time_s | 60 | sekundės iki epizodo automatinio persijungimo |
| --dataset.reset_time_s | 60 | scenos atstatymas; ranka juda, niekas nesaugoma |
| --dataset.num_episodes | 50 | epizodai, įrašyti šioje sesijoje |
| --dataset.push_to_hub | true | įkelti sesijos pabaigoje; false palieka lokaliai |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | koduoti fiksavimo metu; nustatykite tai aiškiai |
| --dataset.encoder_queue_maxsize | 30 | buferizuoti kadrai vienai kamerai, ~1 s esant 30 kadrų per sekundę |
| --dataset.encoder_threads | null (codec decides) | gijos vienam koduotojui; sumažinkite, jei fiksavimas stringa |
| --dataset.no_stamp | false | išlaikyti repo_id tiksliai taip, kaip įvesta |
| --resume | false | pridėti prie esamo duomenų rinkinio; reikalingas --dataset.root |
Jūsų duomenų rinkinys nėra pavadintas taip, kaip įvedėte. lerobot prideda datos ir laiko žymę, todėl so100_pick_cube tampa so100_pick_cube_20260823_141530. Naudokite --dataset.no_stamp=true stabiliam pavadinimui. Tęsti skaičiuoja papildymus, o ne sumas. Su --resume=true, --dataset.num_episodes skaičiuoja papildomus epizodus, o --dataset.root tampa privalomas. Paprašykite 50 duomenų rinkinyje su 30 epizodų ir gausite 80.
Klaviatūros valdymas sesijos metu
- Dešinė rodyklė arba
n: baigti epizodą arba anksti iš naujo nustatyti fazę. Tai klavišas, kurį naudosite dažniausiai, nes švariam sugriebimui retai prireikia 25 sekundžių. - Kairė rodyklė arba
r: atmesti epizodą ir jį pakartoti. Blogas bandymas dabar nieko nekainuoja, o vėliau kainuos daug. - Escape arba
q: sustabdyti sesiją, užbaigti kodavimą, įkelti. - Tai veikia X11, Wayland ir SSH be grafinės sąsajos: be globalaus klavišų palaikymo, lerobot-record nuskaito tuos pačius klavišus iš valdymo terminalo. Raidės išlieka veikiančios per vėluojančias SSH jungtis, kur rodyklių sekos gali skilti.
- Klaviatūros teleoperacija yra kitokia ir jai reikalingas globalus palaikymas: X11, Windows arba macOS su prieinamumo funkcijomis.
Kiek epizodų ir kaip atrodo geras epizodas
Įrašymo vadovas siūlo bent 50 epizodų pirmajai užduočiai, maždaug 10 kiekvienai objekto vietai. The politikos puslapiai nurodo minimalų skaičių kiekvienam modeliui, žemiau kurio vykdymas neapsimoka GPU laiko.
| Politika | Min. epizodų | Duomenų rinkinio formatas | GPU lygis | Kaina už vykdymą |
|---|---|---|---|---|
| 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 |
Geresnis klausimas yra, kiek ko. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin ir kt., 2024) surinko daugiau nei 40 000 demonstracijų ir atliko daugiau nei 15 000 realaus pasaulio vykdymų. Apibendrinimas apytiksliai atitiko galios dėsnio ryšį su environments and objects, o viršijus tam tikrą slenkstį kiekvienai aplinkai ar objektui, papildomos demonstracijos turėjo minimalų poveikį. Ant vieno stendo: judinkite objektą, keiskite apšvietimą, keiskite kubą, o ne kartokite vieną kadrą.
- Nuolatinės jungčių trajektorijos, kurias gali atkurti servovariklis, skirtingai nei klaviatūra ar žaidimų pultas
- Veiksmas ir būsena dalijasi koordinatėmis, todėl politika išmoksta tikslą, kurį gali tiesiogiai valdyti
- 25 sekundžių epizodas plius 10 sekundžių atstatymas yra maždaug 100 epizodų per valandą
- Operatorius jaučia, kaip sekėjas stringa ar užstringa, todėl gedimai išryškėja prieš įrašant duomenis
- Antra ranka maždaug padvigubina dalių kainą
- Demonstracijos paveldi operatoriaus įpročius; Mandlekar ir kt. nustatė, kad politikos kokybė labai priklauso nuo demonstracijos kokybės
- Lyderis imamas ciklo dažniu, todėl pauzės tampa beveik identiškomis eilutėmis, kurios moko politiką laukti
- Niekas neužtikrina nuoseklumo tarp sesijų: 5 cm pastumta kamera yra paslėptas pasiskirstymo poslinkis
Geras epizodas yra nuobodus: pakartojama pradinė poza, vienas veiksmas atliktas, baigtas, kai objektas yra dėžėje, užduoties eilutė yra 25–50 simbolių, kaip rekomenduoja kontrolinis sąrašas. Paimkite raudoną kubą ir įdėkite jį į dėžę yra užduoties eilutė; task1 yra antipatternas, kurį kontrolinis sąrašas aiškiai nurodo. Neaiškios anotacijos yra jo problemų sąrašo viršuje ir jos svarbiausios , kur eilutė yra modelio įvestis, o ne failo pavadinimas.
Defektai, kurie tyliai sugadina duomenų rinkinį
Nė vienas neišmeta išimties. Visi išlieka treniruotėse, pasirodydami kaip gerai atrodanti nuostolių kreivė ir nieko nedarantis robotas. Patikrinkite, kol scena yra paruošta.
| Defektas | Kaip atrodo | Iš kur atsiranda | Kaip aptikti |
|---|---|---|---|
| Sukeisti kamerų vaizdai | riešo vaizdas po viršutiniu raktu | indekso perskirstymas po pakartotinio prijungimo | lerobot-find-cameras kiekvieną sesiją; by-id keliai |
| Užšalę kadrai | tas pats vaizdas dešimtims eilučių | kamera nustoja tiekti; ciklas kartoja paskutinį kadrą | peržiūrėkite tai lerobot-dataset-viz |
| Praleisti kadrai | eilučių skaičius mažesnis nei fps kartų sekundės | eilė perpildoma, praleidžia, o ne blokuoja | 'Encoder queue full' žurnale; eilučių skaičius vs fps kartų trukmė |
| Jungtis ties savo riba | viena jungtis plokščia ties min arba max | lyderio diapazonas viršija sekėjo, arba bloga vidurinė poza | kiekvienos jungties min/max ds.meta.stats; lerobot-find-joint-limits iš anksto |
| Vaizdas ir veiksmas nesinchronizuoti | politika numato arba vėluoja | kameros su skirtingu fps dažniu nei ciklas | laikykite kiekvieną kamerą ties --dataset.fps |
| Mirusysis laikas | ilgos identiškų veiksmų eilučių sekos | operatorius pristabdė su įrašymo įrenginiu | nuoseklių identiškų veiksmų eilučių dalis |
| Nenaudojama užduoties eilutė | task1, demo2, test | greitas rašymas | meta/tasks.parquet v3.0 (tai buvo meta/tasks.jsonl v2.1); pataisykite su lerobot-edit-dataset modify_tasks |
Koduotuvas kiekvienai kamerai laiko ribotą eilę, pagal numatytuosius nustatymus 30 kadrų. Kai jis nespėja, kadrai yra numetami, o ne blokuojami: fiksavimas tęsiasi ir niekas nesugenda. Gaunate Encoder queue full for {camera}, dropped N frame(s) ir bendrą kadrų skaičių kiekvienai kamerai epizodo pabaigoje. Lerobot riba: apie 5 procentai trūkstamų kadrų reiškia perkrautą sistemą, 2 procentai yra tikėtina paleidimo apkrova. Taisymo būdai eilės tvarka: --display_data=false, sumažinti --dataset.encoder_threads, vcodec=h264, išjungti srautinį perdavimą.
Vienas įspėjimas: srautinio kodavimo vadovo lentelėje numatytasis nustatymas nurodomas kaip True, o pagrindinėje duomenų klasėje rašoma streaming_encoding: bool = False. Dokumentacija ir kodas nesutampa, todėl nustatykite jį aiškiai; lerobot registruoja užuominą, rekomenduojančią tai daryti, kai tik paleidžiama su išjungtu žymekliu.
Patikrinkite duomenų rinkinį prieš nuomodami GPU
Priėmimo testas iš dokumentacijos: palyginkite vaizdo įrašo trukmę su epizodo trukme, kurią pranešė CLI, ir patvirtinkite, kad eilučių skaičius lygus kadrų per sekundę (fps) ir trukmės sandaugai. Kiekvienam epizodui, ne bendrai sumai.
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"])Tada pažiūrėkite į jį. lerobot-dataset-viz atkuria epizodą kadrą po kadro su jungčių pėdsakais šalia kameros vaizdų, Rerun arba Foxglove aplinkoje. Sukeistos kameros ir užšalę kadrai pasirodo per dešimt sekundžių. Žmonės praleidžia šį žingsnį.
# 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 arba v3.0: nuspręskite prieš įrašydami
v2.1 įrašė po vieną parquet ir vieną MP4 kiekvienam epizodui. v3.0 sujungia daug epizodų į bendrus fragmentus ir atkuria ribas iš metaduomenų, todėl info.json faile yra kelio šablonai, tokie kaip data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet vietoj epizodo numerio. Pagrindinis pagrindimas yra mažiau, didesnių failų: greitesnis inicijavimas ir mažesnis failų sistemos apkrovimas dideliu mastu.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Išdėstymas | vienas parquet ir vienas MP4 kiekvienam epizodui | daug epizodų vienam fragmentui |
| Epizodo metaduomenys | JSONL failai | fragmentuotas parquet po meta/episodes/, per duomenų rinkinių (datasets) krūvą |
| Transliavimas iš Hub | ne | taip, per StreamingLeRobotDataset |
| Parašyta lerobot 0.6.1 | ne | taip, ką gaunate šiandien |
| Skaito GR00T N1.7 ir N1.5 | taip | ne, turi būti konvertuota žemyn |
lerobot 0.6.1 rašo v3.0, bet GR00T N1.7 ir N1.5 skaito v2.0 arba v2.1 ir sugenda dėl to. Atkreipkite dėmesį į kryptį: src/lerobot/scripts/ yra convert_dataset_v21_to_v30.py ir nieko, kas veiktų priešinga kryptimi. Išspręskite tai prieš sesiją. Pataisymas: duomenų rinkinys atmestas kaip 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=falseDu keliai į tą patį duomenų rinkinį
Viskas aukščiau, jūsų pačių mašinoje: jūs valdote USB išvardijimą, ffmpeg kūrimą, koduotuvo derinimą ir kalibravimo failus. Teisingas būdas suprasti konvejerį, paleisti neįprastą kameros įrangą arba laikyti duomenis vietoje.
Laikas: vakaras vienai rankai surinkti, sudėtingas pirmasis kalibravimas ir pirmoji sesija, kurią išmetate, nes kamera buvo netinkamame lizde.
Darbalaukio klientas įrašo LeRobot formato duomenų rinkinius, epizodus, kamerų srautus ir jungčių būsenas, tiesiai iš teleoperacijos sesijos. Šis duomenų rinkinys maitina mokymo formą: pasirinkite modelį, duomenų rinkinį ir hiperparametrus, o galinė sistema išnuomoja GPU, kurio dydis atitinka modelio VRAM, paleidžia treniruoklį ir įrašo kontrolinius taškus į objektų saugyklą.
- 1Įdiekite klientą
Atsisiuntimo puslapyje; nustatymas kliento dokumentacijoje.
- 2Įrašykite iš teleoperacijos sesijos
Valdykite ranką; klientas įrašo epizodus LeRobot formatu. Instrukcija: įrašykite savo pirmąjį duomenų rinkinį.
- 3Arba atsineškite savo duomenis
Duomenų rinkinys taip pat gali būti iš Hugging Face repo id arba jūsų pačių mašinos: duomenų rinkinių dokumentacija, viešasis katalogas.
- 4Treniruokite ir paleiskite atgal
Pasirinkite kombinaciją mokymo matricoje, tada paleiskite politiką atgal ant rankos. Maždaug 1–3 USD 24 GB lygyje, 4–12 USD A100 arba H100 lygyje.
Jis nesurenka ir nekalibruoja jūsų rankos, ir nepataiso defektinio epizodo, todėl patikrinimo žingsnis vis dar taikomas. Taip pat yra griežtas apribojimas kitame gale: greitoms užduotims, išvados turi būti šalia servovariklių. Valdymo ciklas veikia 20–485 ms per veiksmo žingsnį, o viešojo interneto kelionės pirmyn ir atgal paverčia veikiančią politiką nedrąsia.
Įrašykite LeRobot duomenų rinkinius patys nejungdami konvejerio
AY-Robots darbalaukio klientas įrašo epizodus, kamerų srautus ir jungčių būsenas LeRobot formatu iš teleoperacijos sesijos, tada perduoda duomenų rinkinį treniruokliui.
Gaukite darbalaukio klientąNuo duomenų rinkinio iki politikos
Penkiasdešimt švarių epizodų maitina kiekvieną čia. apmoko nuo nulio tik jūsų užduočiai, apie 80 M parametrų maždaug 20 ms per veiksmo žingsnį, vienintelis iš penkių, patogus greitam judėjimui. yra apie 450 M parametrų 24 GB kortelėje. yra maždaug 3 B parametrų pagrindinis modelis, kuriame paliečia apie 40 M parametrų, reikalauja A100 arba H100 ir nori to v2.1 duomenų rinkinio.
Toliau – jūsų derinio vadovas: , arba ; pirmajam paleidimui, yra trumpesnis. Kai politika veikia ant stalo, bet sugriūva vos pajudinus stalą, tai yra duomenų problema: ir giliau nagrinėja įvairovę.
Kiek epizodų man iš tikrųjų reikia pirmajai veikiančiai politikai?▾
Trisdešimt SmolVLA, penkiasdešimt ACT, Pi0.5, GR00T N1.5 ir N1.7 – tai minimumai, kuriuos nustato AY-Robots apmokytojai. LeRobot vadovas nepriklausomai rekomenduoja bent 50 pirmajai užduočiai, apie 10 vienai objekto vietai. Duomenų mastelio keitimo darbai parodė, kad apibendrinimas priklauso nuo aplinkos ir objektų, o ne nuo demonstracijų skaičiaus, todėl šimtas vienos scenos įrašų yra blogiau nei penkiasdešimt penkiose vietose.
Ar man reikia pagrindinės rankos, ar galiu valdyti nuotoliniu būdu klaviatūra?▾
lerobot tiekia klaviatūros ir žaidimų pulto teleoperatorius, todėl pagrindinė ranka nėra griežtai būtina, tačiau ji yra labai pageidautina: „lyderis-sekėjas“ suteikia nuolatines jungčių trajektorijas pagal įrašyto veiksmo koordinavimo konvenciją, o klaviatūros įvestis sukuria laipsnišką judesį, kurį politika išmoksta kaip trūkčiojimą. Klaviatūros nuotoliniam valdymui taip pat reikalingas globalus klavišų fonas, todėl jis neveikia su Wayland ir be galvos (headless) sistemomis.
Ar galiu įrašyti naudojant Raspberry Pi ar mažą mini kompiuterį?▾
Taip, su derinimu. Srautinio kodavimo vadove yra mažų resursų kategorija, apimanti šiuolaikinius 4 branduolių kompiuterius ir Raspberry Pi 5, ir joje dvi kameros 640x480 ir 30 kadrų per sekundę yra priskiriamos stulpeliui „reikalauja tam tikro derinimo“. Patarimas: sustabdykite koduoklį, kad jis nekonkuruotų su fiksavimo ciklu, naudodami --dataset.rgb_encoder.vcodec=h264 ir --dataset.streaming_encoding=false. Jis vertina dvi kameras 640x480 kaip apie 55 milijonus pikselių per sekundę ir dvi 1920x1080 kaip apie 373 milijonus.
Kaip sužinoti, ar ką tik įrašytas duomenų rinkinys yra tikrai sveikas?▾
Trys pigūs patikrinimai. Palyginkite kiekvieno epizodo vaizdo įrašo trukmę su CLI pranešta trukme ir patvirtinkite, kad eilučių skaičius lygus kadrų per sekundę (fps) kartų ta trukmė, kiekvienam epizodui, o ne bendrai; tai yra priėmimo testas, kurį pateikia lerobot kodavimo vadovas. Perskaitykite ds.meta.stats, kur jungtis, kurios minimumas lygus maksimumui, niekada nejudėjo. Tada peržiūrėkite du ar tris epizodus lerobot-dataset-viz, tai vienintelis būdas pamatyti sukeistus vaizdus ir užšalusius kadrus. Dėl praleistų kadrų vadovas brėžia ribą ties maždaug 5 procentais trūkstamų; apie 2 procentus yra normali trumpalaikė apkrova, dažnai tik paleidimo metu.
Mano apmokymo užduotis atmetė duomenų rinkinį kaip v3.0. Ką daryti?▾
GR00T N1.7 ir N1.5 nuskaito LeRobot v2.0 arba v2.1 ir sugenda su v3.0, kurį įrašo lerobot 0.6.1. Prieš apmokymą nustatykite formatą arba naudokite politiką, kuri natūraliai nuskaito v3.0: Pi0.5, SmolVLA arba ACT. lerobot tiekia v2.1 į v3.0 konverterį ir nieko atvirkščiai.
Sources
- LeRobot: Imitacinis mokymasis su realaus pasaulio robotais
- LeRobot: SO-100 surinkimas, variklio nustatymas ir kalibravimas
- LeRobot: Kameros ir lerobot-find-cameras
- LeRobot: Diegimas ir priedų matrica
- LeRobotDataset v3.0: išdėstymas ir v2.1 migracija
- LeRobot: Vaizdo transliacijos kodavimas ir praleisti kadrai
- LeRobot: Didelių duomenų rinkinių perkėlimas į v3.0 (DROID)
- lerobot v0.6.1 išleidimas, 2026 m. rugpjūčio 3 d.
- DatasetRecordConfig: tikrieji įrašymo numatytieji nustatymai
- lerobot_record.py: įrašymo ciklas ir atnaujinimo valdymas
- TheRobotStudio/SO-ARM100: kūrimo saugykla ir medžiagų sąrašas
- Hugging Face: LeRobot bendruomenės duomenų rinkinių kontrolinis sąrašas
- lerobot/svla_so100_pickplace: 50 epizodų, 19 631 kadras
- Lin ir kt. (2024), Duomenų mastelio dėsniai imitaciniame mokymesi
- Mandlekar ir kt. (2021), Kas svarbu mokantis iš neprisijungusių žmogaus demonstracijų
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