AY-Robots mokymo puslapis, skirtas įrašyti jūsų pirmąjį LeRobot duomenų rinkinį su SO-100 ranka
LeRobotSO-100Duomenų rinkinio įrašymasTeleoperacijaImitacinis mokymasis

Įrašykite savo pirmąjį LeRobot duomenų rinkinį su SO-100

AY-Robots ResearchAugust 23, 202616 min. skaitymo

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

FunkcijadtypeFormaKas tai yra
actionfloat32[6]jungčių taikiniai iš lyderio rankos
observation.statefloat32[6]jungčių pozicijos, kurias pasiekė sekėjas
observation.images.topvideo[480, 640, 3]scenos kamera, MP4 (čia av1)
observation.images.wristvideo[480, 640, 3]riešo kamera, toks pat dažnis
timestampfloat32[1]sekundės nuo epizodo pradžios
frame_index, episode_index, index, task_indexint64[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ą.

Tikro duomenų rinkinio matas

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

AY-Robots žodyno įrašas apie LeRobot duomenų rinkinio formatą, rodantis katalogų išdėstymą ir metaduomenų failus
Kas yra data/, videos/ ir meta/ kataloguose ir kokios politikos skaito kurią versiją.

Ko jums reikės ant stalo

ElementasAprašymasPastaba
Sekimo rankaSO-100, six Feetech STS3215 servosapie 110–150 EUR dalims
Vado rankaantra SO-100, pašalintos pavarosnuimtos pavaros nuo visų šešių vado variklių: tik enkoderis, mažiau trinties
Maitinimaspritaikytas 7.4 V STS3215 variantui, nurodytam medžiagų sąrašežr. įspėjimą žemiau
Kamerosdvi USB kameros, 640x480, 30 kadrų per sekundęvienas scenos vaizdas, vienas ant riešo
Pagrindinis kompiuterisPython 3.12 or newer, ffmpegrequires-python >= 3.12
Hub paskyraHugging Face write tokenoptional with --dataset.push_to_hub=false
7.4 V, ne 12 V

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

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 atspausdina sistemos suvestinę, įskaitant ffmpeg versiją, kurią ji gali rasti PATH.

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

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

    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
    Į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ą.

    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
    Kalibruokite abi rankas

    Perkelkite kiekvieną jungtį į jos diapazono vidurį, paspauskite Enter, tada perbraukite kiekvieną per visą jos diapazoną. id tampa profilio failo pavadinimu.

    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
    Teleoperuokite 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ų.

    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
Kur atliekamas kalibravimas ir kodėl ID yra svarbus

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

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
Vykdykite tai kiekvieną sesiją: dokumentacija įspėja, kad šie identifikatoriai gali pasikeisti po perkrovimo ar pakartotinio prijungimo, priklausomai nuo operacinės sistemos.

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

Kameros indeksas nėra stabili tapatybė

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ė

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
Kameros žodynas yra viena apvalkalo kabutėmis apgaubta eilutė; įdėtos riestinės skliaustelės nėra apvalkalo sintaksė.

Ž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_idemptypavadinimas; laiko žyma pridedama automatiškai
--dataset.single_taskemptyužduoties eilutė, saugoma su kiekvienu epizodu
--dataset.root$HF_LEROBOT_HOME/repo_idrašymo kelias, numatytasis ~/.cache/huggingface/lerobot/
--dataset.fps30valdymo ciklo dažnis ir duomenų rinkinio kadrų dažnis
--dataset.episode_time_s60sekundės iki epizodo automatinio persijungimo
--dataset.reset_time_s60scenos atstatymas; ranka juda, niekas nesaugoma
--dataset.num_episodes50epizodai, įrašyti šioje sesijoje
--dataset.push_to_hubtrueįkelti sesijos pabaigoje; false palieka lokaliai
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablekoduoti fiksavimo metu; nustatykite tai aiškiai
--dataset.encoder_queue_maxsize30buferizuoti kadrai vienai kamerai, ~1 s esant 30 kadrų per sekundę
--dataset.encoder_threadsnull (codec decides)gijos vienam koduotojui; sumažinkite, jei fiksavimas stringa
--dataset.no_stampfalseišlaikyti repo_id tiksliai taip, kaip įvesta
--resumefalsepridėti prie esamo duomenų rinkinio; reikalingas --dataset.root
Dvi žymės, kurios netikėtai kainuoja valandą

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.

PolitikaMin. epizodųDuomenų rinkinio formatasGPU lygisKaina už vykdymą
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

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

Lyderio-sekėjo teleoperacija kaip duomenų šaltinis
Privalumai
  • 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
Kompromisai
  • 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.

DefektasKaip atrodoIš kur atsirandaKaip aptikti
Sukeisti kamerų vaizdairiešo vaizdas po viršutiniu raktuindekso perskirstymas po pakartotinio prijungimolerobot-find-cameras kiekvieną sesiją; by-id keliai
Užšalę kadraitas pats vaizdas dešimtims eilučiųkamera nustoja tiekti; ciklas kartoja paskutinį kadrąperžiūrėkite tai lerobot-dataset-viz
Praleisti kadraieilučių skaičius mažesnis nei fps kartų sekundėseilė perpildoma, praleidžia, o ne blokuoja'Encoder queue full' žurnale; eilučių skaičius vs fps kartų trukmė
Jungtis ties savo ribaviena jungtis plokščia ties min arba maxlyderio diapazonas viršija sekėjo, arba bloga vidurinė pozakiekvienos jungties min/max ds.meta.stats; lerobot-find-joint-limits iš anksto
Vaizdas ir veiksmas nesinchronizuotipolitika numato arba vėluojakameros su skirtingu fps dažniu nei ciklaslaikykite kiekvieną kamerą ties --dataset.fps
Mirusysis laikasilgos identiškų veiksmų eilučių sekosoperatorius pristabdė su įrašymo įrenginiunuoseklių identiškų veiksmų eilučių dalis
Nenaudojama užduoties eilutėtask1, demo2, testgreitas rašymasmeta/tasks.parquet v3.0 (tai buvo meta/tasks.jsonl v2.1); pataisykite su lerobot-edit-dataset modify_tasks
Numesti kadrai slepiasi

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.

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"])
Epizodas, kurio fps ir trukmės santykis yra per didelis, yra kandidatas šalinimui, o ne apmokymui.

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

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 taip pat atlieka padalijimą, sujungimą, funkcijų pašalinimą, užduočių modifikavimą ir statistikos perskaičiavimą. Šalinkite negailestingai: blogas epizodas kainuoja vieną epizodą; jo palikimas kainuoja kiekvieną apmokymą, atliktą su juo.
AY-Robots duomenų rinkinio katalogas, kuriame pateikiami vieši LeRobot duomenų rinkiniai su epizodų skaičiumi ir formatais
Kaip lyginamieji duomenų rinkiniai yra dydžio ir anotuoti.

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.1LeRobot v3.0
Išdėstymasvienas parquet ir vienas MP4 kiekvienam epizoduidaug epizodų vienam fragmentui
Epizodo metaduomenysJSONL failaifragmentuotas parquet po meta/episodes/, per duomenų rinkinių (datasets) krūvą
Transliavimas iš Hubnetaip, per StreamingLeRobotDataset
Parašyta lerobot 0.6.1netaip, ką gaunate šiandien
Skaito GR00T N1.7 ir N1.5taipne, turi būti konvertuota žemyn
Įrašymas šiandien, GR00T apmokymas rytoj

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.

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
Greita 50 epizodų. Mastelis yra kitas darbas: lerobot perkėlimo vadovas, skirtas neapdorotam DROID į v3.0, numato 7+ dienas vietinio apdorojimo ir apie 400 GB.

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

Kiek kainuoja šis kelias

Laikas: vakaras vienai rankai surinkti, sudėtingas pirmasis kalibravimas ir pirmoji sesija, kurią išmetate, nes kamera buvo netinkamame lizde.

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

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started