AY-Robots veiledningsside for å spille inn ditt første LeRobot datasett med en SO-100 arm
LeRobotSO-100DatasettinnspillingTeleoperasjonImitasjonslæring

Spill inn ditt første LeRobot datasett med en SO-100

AY-Robots ResearchAugust 23, 202616 min lesetid

Spill inn et brukbart LeRobot datasett med en SO-100: kalibrering, leder-følger teleoperasjon, de faktiske lerobot-record flaggene og standardinnstillingene, kameraoppsett, antall episoder, og feilene som ødelegger en kjøring.

En SO-100 følger, en lederarm av samme design og to USB-kameraer kan finjustere en policy på en ettermiddag. Samme testbenk kan like enkelt produsere seksti episoder som ser sunne ut i en filutforsker og kaste bort en seks-timers GPU-kjøring. Forskjellen er sjelden modellen; det er hva som skjedde mellom servoene og parquet-filen.

Her er den manuelle ruten, deretter den kortere. Hver kommando er fra lerobot 0.6.1, utgitt 3. august 2026 og gjeldende på PyPI. Den flyttet til konsoll-inngangspunkter, så veiledninger som kjører python lerobot/scripts/control_robot.py beskriver en fil som ikke lenger eksisterer.

Den korte versjonen

  • lerobot 0.6.1 tar opp v3.0; GR00T N1.7 og N1.5 ønsker v2.1. Avklar formatet før du trykker på opptak.
  • Fire kommandoer: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Bruk de samme --robot.id og --teleop.id fra kalibreringen inn i opptaksøkten.
  • Standardinnstillinger: 30 fps, 60 s per episode, 60 s tilbakestilling, 50 episoder, omtrent 100 minutter total tid.
  • Minimum episoder her: 30 for SmolVLA, 50 for resten.
  • Mangfold slår volum. Datasett dør av fire ting: byttede kameraindekser, tapte eller frosne bilder, et ledd parkert ved sin grense, en uleselig oppgavestreng.

Hva en opptaksøkt fanger

Et LeRobot datasett er ikke en mappe med videoer, men en tidsindeksert tabell med vedlagt video: hver kontrollsløyfe-tick skriver én rad som inneholder den kommanderte handlingen, tilstanden følgeren nådde, én ramme per kamera, et tidsstempel og indekser. Politikken ser bare disse kolonnene. Skjemaet for lerobot/svla_so100_pickplace, lest fra dens meta/info.json.

FunksjondtypeFormHva det er
actionfloat32[6]ledd-mål fra lederarmen
observation.statefloat32[6]leddposisjoner følgeren nådde
observation.images.topvideo[480, 640, 3]scenekamera, MP4 (av1 her)
observation.images.wristvideo[480, 640, 3]håndleddskamera, samme hastighet
timestampfloat32[1]sekunder siden episode start
frame_index, episode_index, index, task_indexint64[1]automatisk utfylt bokføring

Leddene er main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll og main_gripper: SO-100s seks frihetsgrader. Handling og tilstand deler form fordi leder-følger teleoperasjon registrerer et mål og posisjonen nådd ett trinn senere. Dette gapet er informasjon: hvor armen kjempet mot tyngdekraften eller et fastkjørt objekt. Disse strengene tilhører det datasettet. En økt registrert med 0.6.1 i dag skriver shoulder_pan.pos til gripper.pos, ID-er 1 til 6 på bussen: samme seks ledd, forskjellige nøkler, noe som betyr noe i det øyeblikket en konfigurasjon adresserer en funksjon ved navn.

En målestokk fra et reelt datasett

Dette datasettet inneholder 50 episoder og 19 631 rammer ved 30 fps: omtrent 393 rammer, eller 13 sekunder, per episode. Hvis dine i gjennomsnitt er ett minutt, gjør du noe vanskeligere eller registrerer dødtid i begge ender.

AY-Robots ordlisteoppføring for LeRobot datasettformatet, som viser katalogstrukturen og metadatafilene
Hva som finnes i data/, videos/ og meta/, og hvilke retningslinjer som leser hvilken versjon.

Hva du trenger på benken

ElementDetaljMerknad
FølgerarmSO-100, seks Feetech STS3215 servoeromtrent 110 til 150 EUR i deler
Lederarmen andre SO-100, gir fjernetgir strippet fra alle seks ledermotorer: kun koder, mindre friksjon
Strømtilpasset 7.4 V STS3215-varianten i stykklistense advarselen nedenfor
Kameraerto USB-kameraer, 640x480 ved 30 fpsett scenebilde, ett på håndleddet
VertPython 3.12 eller nyere, ffmpegrequires-python >= 3.12
Hub-kontoHugging Face write tokenvalgfritt med --dataset.push_to_hub=false
7.4 V, ikke 12 V

STS3215 kommer i to versjoner: SO-ARM100 README vurderer 7.4 V-versjonen til 16.5 kg.cm stoppdreiemoment målt ved 6 V og 12 V-versjonen til 30 kg.cm, og bemerker at valg av 12 V-motorer også betyr å kjøpe en 12 V 5 A+ strømforsyning i stedet for 5 V-versjonen. Stykklisten oppgir 7.4 V servoer. Å mate 12 V til servoer vurdert for 7.4 V ødelegger dem, så les motor-etiketten før du kobler til noe. Servo svarer ikke.

Hvis armen ikke er bygget ennå, er det en egen kveld: start på og . Hvis du ikke har kjøpt noe, les først: SO-101 er den nyere revisjonen med forbedret kabling og ingen fjerning av gir, og opptaksarbeidsflyten er identisk.

Installer 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 skriver ut en systemoversikt, inkludert ffmpeg-versjonen den finner på PATH.

Ekstrautstyr forvirrer folk mest. pip install lerobot installerer kun kjerne ML-avhengigheter, ingenting som snakker med en robot. Koch-armer trenger dynamixel i stedet for feetech. Hvis skallet ditt aldri har hørt om lerobot-record, er dette grunnen.

Porter, motor-ID-er og kalibrering

Tre engangstrinn står mellom deler og en fungerende teleop-sløyfe. gjør at en policy trent på din arm kan kjøre på en annens, ved å mappe rå encoder-tellinger til en felles leddkonvensjon.

  1. 1
    Finn USB-porten til hver arm

    Kjør den med begge armene tilkoblet, koble fra den du identifiserer når du blir bedt om det, og noter hvilken port som forsvinner. På Linux kan du trenge 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
    Skriv motor-ID-er og baudrater

    ID-er skrives én motor om gangen, og dokumentasjonen er streng på hvordan: koble nøyaktig én motor til kontrollerkortet, ikke enda seriekoblet til noen annen. Skriptet går bakover i kjeden, ber om griperen først og gir den ID 6, deretter wrist_roll som 5, ned til shoulder_pan som 1. Gjør det før montering.

    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
    Kalibrer begge armene

    Flytt hvert ledd til midten av sitt bevegelsesområde, trykk Enter, og sveip deretter hvert ledd gjennom hele sitt bevegelsesområde. id blir profilfilnavnet.

    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
    Teleoperer før du tar opp noe

    Akseptansetesten for alt ovenfor. Hvis teleoperasjonen er rykkete, speilvendt, eller ett ledd ikke følger med, bevarer opptaket dette i 50 episoder.

    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
Hvor kalibreringen havner, og hvorfor ID-en er viktig

Profiler lagres i $HF_LEROBOT_CALIBRATION, standard ~/.cache/huggingface/lerobot/calibration, og ID-en er oppslagstasten. Gi lerobot-record en kalibrert ID, og den tilbyr Enter for å gjenbruke profilen eller c for å gjøre det på nytt. Gi den en ukjent ID, og det er ingen fil, så den går inn i kalibrering midt i økten.

Kameraer avgjør hva policyen ser

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
Kjør dette hver økt: dokumentasjonen advarer om at disse identifisererne kan endre seg etter en omstart eller en ny tilkobling, avhengig av operativsystemet.

To visninger, og hvor de er plassert er viktig: et fast scenekamera som dekker arbeidsområdet, og et håndleddskamera nær endeeffektor som viser hva griperen er i ferd med å berøre. LeRobot-fellesskapets datasett-sjekkliste ber om fortrinnsvis to visninger på 480x640 / 720p eller bedre, en statisk bakgrunn, nøytral stabil belysning, og at lederarmen og menneskelige lemmer er utenfor bildet. Opptaksguiden legger til tommelfingerregelen: du skal kunne utføre oppgaven selv ved å kun se på kamerabildene.

Kameraindeksen er ikke en stabil identitet

OpenCV-indekser kommer fra oppregningsrekkefølgen, så en omstart eller ny tilkobling kan føre til at indeks 0 og 2 bytter plass og plasserer håndleddsvisningen i toppsporet for en hel økt. lerobot sier det selv: kameraklassen tar en enhetsbane så vel som et heltall, og advarer om at indekser er ustabile over omstarter eller portendringer, spesielt på Linux. Pek index_or_path mot udev-symlinken under /dev/v4l/by-id/, som følger enheten i stedet for oppregningsrekkefølgen. Dette er den vanligste måten et datasett ender opp internt inkonsekvent, og trening kan ikke reparere det. Kamera ikke oppdaget.

Kommandoen `record` og alle flagg

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
Kameradikten er en skall-sitert streng; de nestede klammeparentesene er ikke skall-syntaks.

Standardverdiene nedenfor kommer fra src/lerobot/configs/dataset.py på main, ikke en veiledning. Flere er ikke det folk antar.

FlaggStandardHva det gjør
--dataset.repo_idemptynavn; tidsstempel legges til som standard
--dataset.single_taskemptyoppgavestreng lagret med hver episode
--dataset.root$HF_LEROBOT_HOME/repo_idskrivebane, standard ~/.cache/huggingface/lerobot/
--dataset.fps30kontrollsløyfehastighet og datasettets bildefrekvens
--dataset.episode_time_s60sekunder før en episode automatisk går videre
--dataset.reset_time_s60tilbakestilling av scene; armen beveger seg, ingenting lagres
--dataset.num_episodes50episoder registrert i denne økten
--dataset.push_to_hubtruelast opp ved øktens slutt; false forblir lokalt
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablekode under opptak; sett det eksplisitt
--dataset.encoder_queue_maxsize30bufrede rammer per kamera, ~1 s ved 30 fps
--dataset.encoder_threadsnull (codec decides)tråder per koder; senk hvis opptaket hakker
--dataset.no_stampfalsebehold repo_id nøyaktig som skrevet
--resumefalselegg til et eksisterende datasett; krever --dataset.root
To flagg som uventet koster en time

Datasettet ditt heter ikke det du skrev. lerobot legger til en dato-tid-tag, så so100_pick_cube blir so100_pick_cube_20260823_141530. Bruk --dataset.no_stamp=true for et stabilt navn. Gjenoppta teller tillegg, ikke totaler. Med --resume=true teller --dataset.num_episodes ytterligere episoder og --dataset.root blir obligatorisk. Be om 50 på et datasett med 30 episoder, og du får 80.

Tastaturkontroll under en økt

  • Høyre pil eller n: avslutt episoden eller tilbakestill fasen tidlig. Tastaturet du bruker mest, fordi et rent grep sjelden trenger 25 sekunder.
  • Venstre pil eller r: forkast episoden og gjør den på nytt. Et dårlig opptak koster ingenting nå og mye senere.
  • Escape eller q: stopp økten, fullfør koding, last opp.
  • Disse fungerer på X11, Wayland og hodeløs SSH: uten en global nøkkel-backend, leser lerobot-record de samme tastene fra den kontrollerende terminalen. Bokstavene overlever trege SSH-lenker, der pilsekvenser splittes.
  • Tastatur-teleoperasjon er annerledes og krever en global backend: X11, Windows, eller macOS med Tilgjengelighet.

Hvor mange episoder, og hvordan en god en ser ut

Opptaksguiden foreslår minst 50 episoder for en første oppgave, omtrent 10 per objektplassering. retningslinjesidene lister opp et minimum per modell, under hvilket en kjøring ikke er verdt GPU-tiden.

RetningslinjeMin. episoderDatasettformatGPU-nivåKostnad per kjøring
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

Det bedre spørsmålet er hvor mange av hva. Dataskaleringslover i imitasjonslæring for robotmanipulasjon (Lin et al., 2024) samlet inn over 40 000 demonstrasjoner og kjørte mer enn 15 000 utrullinger i den virkelige verden. Generalisering fulgte et omtrentlig potenslovforhold med antallet miljøer og objekter, og forbi en terskel per miljø eller objekt hadde ytterligere demonstrasjoner minimal effekt. På én testbenk: flytt objektet, endre belysningen, bytt ut kuben, i stedet for å gjenta ett opptak.

Leder-følger teleoperasjon som datakilde
Fordeler
  • Kontinuerlige leddbaner en servo kan gjengi, i motsetning til tastatur eller gamepad
  • Handling og tilstand deler en koordinatkonvensjon, slik at retningslinjen lærer et mål den kan kommandere direkte
  • En 25 sekunders episode pluss en 10 sekunders tilbakestilling er omtrent 100 episoder i timen
  • Operatøren føler at følgeren stopper eller binder seg, slik at feil dukker opp før data er forpliktet
Avveininger
  • En andre arm dobler omtrentlig deleprisen
  • Demonstrasjoner arver operatørvaner; Mandlekar et al. fant at retningslinjekvaliteten avhenger sterkt av demonstrasjonskvaliteten
  • Lederen samples med sløyfehastighet, så pauser blir nesten identiske rader som lærer retningslinjen å vente
  • Ingenting håndhever konsistens mellom økter: et kamera som flyttes 5 cm er et skjult distribusjonsskifte

En god episode er kjedelig: repeterbar hjemmeposisjon, én ting gjort, avsluttet når objektet er i beholderen, oppgavestreng på 25 til 50 tegn som sjekklisten anbefaler. Plukk den røde kuben og slipp den i boksen er en oppgavestreng; task1 er anti-mønsteret sjekklisten navngir eksplisitt. Vage annotasjoner topper listen over problemer, og de er viktigst for , der strengen er en modellinndata, ikke et filnavn.

Feil som stille ødelegger et datasett

Ingen kaster en unntak. Alle overlever inn i trening, og dukker opp som en taps-kurve som ser fin ut og en robot som ikke gjør noe. Sjekk mens scenen er satt opp.

FeilHvordan det ser utHvor det kommer fraHvordan fange det
Byttede kameravisningerhåndleddsbilde under toppnøkkelenindeksomfordeling etter en gjeninnkoblinglerobot-find-cameras hver sesjon; by-id stier
Frosne rammersamme bilde for dusinvis av raderkamera slutter å levere; løkken gjentar siste rammeskrubb det i lerobot-dataset-viz
Mistede rammerradantall under fps ganger sekunderkøen flyter over, dropper heller enn blokkerer'Encoder queue full' i loggen; rader vs fps ganger varighet
Leddet på sin grenseett ledd flatt på min eller makslederens rekkevidde overskrider følgerens, eller en dårlig midtposisjonper-ledd min/maks i ds.meta.stats; lerobot-find-joint-limits på forhånd
Bilde og handling ute av taktpolitikken forutser eller henger etterkameraer med en annen fps enn løkkenhold hvert kamera på --dataset.fps
Dødtidlange serier med identiske handlingsraderoperatør pauset med opptakeren kjørendeandel av sammenhengende identiske handlingsrader
Ubrukbar oppgavestrengtask1, demo2, testskriver fortmeta/tasks.parquet i v3.0 (det var meta/tasks.jsonl i v2.1); fiks med lerobot-edit-dataset modify_tasks
Dropped frames skjuler seg

Koderen holder en begrenset kø per kamera, 30 bilder som standard. Når den ikke klarer å holde tritt, blir bilder droppet i stedet for blokkert: opptaket fortsetter og ingenting krasjer. Du får Encoder queue full for {camera}, dropped N frame(s) og en total per kamera ved episodens slutt. Lerobot-terskelen: omtrent 5 prosent manglende betyr et overbelastet system, 2 prosent er forventet oppstartsbelastning. Løsninger i rekkefølge: --display_data=false, lavere --dataset.encoder_threads, vcodec=h264, streaming av.

En advarsel: tabellen i streaming-encoding-guiden lister standardverdien som True, mens dataklassen på main leser streaming_encoding: bool = False. Dokumentasjon og kode er uenige, så sett den eksplisitt; lerobot logger et hint som anbefaler det når den starter med flagget av.

Sjekk datasettet før du leier en GPU

Akseptansetesten fra dokumentasjonen: sammenlign videovarigheten med episodens varighet som CLI rapporterte, og bekreft at antall rader tilsvarer fps ganger varighet. Per episode, ikke på totalen.

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"])
En episode som avviker mye fra fps ganger varighet er en kandidat for sletting, ikke trening.

Se så på det. lerobot-dataset-viz spiller av en episode bilde for bilde med leddspor ved siden av kameravisningene, i Rerun eller Foxglove. Byttede kameraer og frosne bilder dukker opp på ti sekunder. Folk hopper over dette trinnet.

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 utfører også splitting, sammenslåing, fjerning av funksjoner, endring av oppgaver og ny beregning av statistikk. Slett generøst: en dårlig episode koster én episode; å beholde den koster hver kjøring som er trent på den.
AY-Robots datasettkatalog som viser offentlige LeRobot-datasett med episodeantall og formater
Hvordan sammenlignbare datasett er dimensjonert og annotert.

v2.1 eller v3.0: bestem deg før du tar opp

v2.1 skrev én parquet og én MP4 per episode. v3.0 slår sammen mange episoder til delte shards og gjenoppbygger grenser fra metadata, så info.json inneholder stimaler som data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet i stedet for et episodenummer. Den bakenforliggende begrunnelsen er færre, større filer: raskere initialisering og mindre filsystemtrykk i stor skala.

LeRobot v2.1LeRobot v3.0
Oppsettén parquet og én MP4 per episodemange episoder per shard
EpisodemetadataJSONL-filerchunked parquet under meta/episodes/, via datasettstakken
Strømming fra Hub-enneija, via StreamingLeRobotDataset
Skrevet av lerobot 0.6.1neija, det du får i dag
Lest av GR00T N1.7 og N1.5janei, må konverteres ned
Tar opp i dag, trener GR00T i morgen

lerobot 0.6.1 skriver v3.0, men GR00T N1.7 og N1.5 leser v2.0 eller v2.1 og krasjer på det. Merk retningen: src/lerobot/scripts/ inneholder convert_dataset_v21_to_v30.py og ingenting som går den andre veien. Avklar dette før økten. Fiks: datasett avvist som 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
Raskt for 50 episoder. Skalering er en annen jobb: lerobots porteringsguide, for rå DROID til v3.0, budsjetterer 7+ dager med lokal prosessering og omtrent 400 GB.

To veier til samme datasett

Alt ovenfor, på din egen maskin: du eier USB-opplistingen, ffmpeg-bygget, koderjusteringen og kalibreringsfilene. Den rette veien for å forstå pipelinen, kjøre et uvanlig kameraoppsett, eller holde data lokalt.

Ta opp LeRobot-datasett uten å koble sammen pipelinen selv

AY-Robots skrivebordsklient registrerer episoder, kamerastrømmer og leddtilstander i LeRobot-format fra en teleoperasjonsøkt, og overleverer deretter datasettet til treneren.

Skaff skrivebordsklienten

Fra datasett til policy

Femti rene episoder mater hver imitasjonslæring kjøring her. ACT trenes fra bunnen av på din oppgave alene, omtrent 80 M parametere ved rundt 20 ms per handlingssteg, den eneste av de fem som er komfortabel med rask bevegelse. SmolVLA er omtrent 450 M parametere på et 24 GB kort. GR00T N1.7 er en grunnmodell med omtrent 3 B parametere hvor finjustering påvirker omtrent 40 M parametere, krever en A100 eller H100, og ønsker det v2.1-datasettet.

Deretter, veiledningen for din kombinasjon: ACT on SO-100, SmolVLA on SO-100 eller GR00T N1.7 on SO-100; for en første kjøring er trene din første policy kortere. Når policyen fungerer på testbenken, men kollapser i det øyeblikket du flytter bordet, er det et dataproblem: policy fungerer bare i ett oppsett og innsamling av høykvalitets VLA-treningsdata går dypere inn i mangfold.

Hvor mange episoder trenger jeg egentlig for en første fungerende policy?

Tretti for SmolVLA, femti for ACT, Pi0.5, GR00T N1.5 og N1.7, som er minimumene AY-Robots-trenerne håndhever. LeRobot-veiledningen anbefaler uavhengig minst 50 for en første oppgave, rundt 10 per objektplassering. Arbeid med datascalering fant at generalisering skalerer med miljøer og objekter snarere enn antall demonstrasjoner, så hundre opptak av én scene er verre enn femti fordelt på fem plasseringer.

Trenger jeg en lederarm, eller kan jeg fjernstyre med et tastatur?

lerobot leveres med tastatur- og gamepad-fjernstyring, så en lederarm er ikke strengt nødvendig, men det er sterkt å foretrekke: leder-følger gir kontinuerlige leddbaner i koordinatkonvensjonen til den innspilte handlingen, mens tastaturinndata produserer trinnvis bevegelse som en policy lærer som rykk. Tastaturfjernstyring krever også en global nøkkel-backend, så det feiler på Wayland og headless-systemer.

Kan jeg ta opp på en Raspberry Pi eller en liten mini-PC?

Ja, med justering. Veiledningen for strømmekoding har en lavressurskategori som dekker moderne 4-kjerners maskiner og Raspberry Pi 5, og plasserer to kameraer på 640x480 og 30 fps i sin 'krever-litt-justering'-kolonne. Rådet er: stopp koderen fra å konkurrere med opptaksløkken, via --dataset.rgb_encoder.vcodec=h264 og --dataset.streaming_encoding=false. Den vurderer to kameraer på 640x480 til omtrent 55 millioner piksler per sekund og to på 1920x1080 til omtrent 373 millioner.

Hvordan vet jeg at datasettet jeg nettopp spilte inn faktisk er i orden?

Tre enkle kontroller. Sammenlign hver episodes videovarighet med varigheten CLI rapporterte, og bekreft at radantallet tilsvarer fps ganger den varigheten, per episode snarere enn totalt; det er akseptansetesten lerobots kodingsveiledning gir. Les ds.meta.stats, der et ledd hvis min er lik maks aldri beveget seg. Spill deretter av to eller tre episoder i lerobot-dataset-viz, den eneste måten å avdekke byttede visninger og frosne bilder på. Når det gjelder tapte bilder, trekker veiledningen grensen ved omtrent 5 prosent manglende; omtrent 2 prosent er normal forbigående belastning, ofte bare ved oppstart.

Treningsjobben min avviste datasettet som v3.0. Hva nå?

GR00T N1.7 og N1.5 leser LeRobot v2.0 eller v2.1 og krasjer på v3.0, som er det lerobot 0.6.1 tar opp. Enten avklar formatet før trening, eller bruk en policy som leser v3.0 nativt: Pi0.5, SmolVLA eller ACT. lerobot leveres med en v2.1 til v3.0-konverterer og ingenting i revers.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started