
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.
| Funksjon | dtype | Form | Hva det er |
|---|---|---|---|
| action | float32 | [6] | ledd-mål fra lederarmen |
| observation.state | float32 | [6] | leddposisjoner følgeren nådde |
| observation.images.top | video | [480, 640, 3] | scenekamera, MP4 (av1 her) |
| observation.images.wrist | video | [480, 640, 3] | håndleddskamera, samme hastighet |
| timestamp | float32 | [1] | sekunder siden episode start |
| frame_index, episode_index, index, task_index | int64 | [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.
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.

Hva du trenger på benken
| Element | Detalj | Merknad |
|---|---|---|
| Følgerarm | SO-100, seks Feetech STS3215 servoer | omtrent 110 til 150 EUR i deler |
| Lederarm | en andre SO-100, gir fjernet | gir strippet fra alle seks ledermotorer: kun koder, mindre friksjon |
| Strøm | tilpasset 7.4 V STS3215-varianten i stykklisten | se advarselen nedenfor |
| Kameraer | to USB-kameraer, 640x480 ved 30 fps | ett scenebilde, ett på håndleddet |
| Vert | Python 3.12 eller nyere, ffmpeg | requires-python >= 3.12 |
| Hub-konto | Hugging Face write token | valgfritt med --dataset.push_to_hub=false |
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
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-infoEkstrautstyr 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.
- 1Finn 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.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. - 2Skriv 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.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Kalibrer begge armene
Flytt hvert ledd til midten av sitt bevegelsesområde, trykk Enter, og sveip deretter hvert ledd gjennom hele sitt bevegelsesområde.
idblir profilfilnavnet.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 - 4Teleoperer 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.
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
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
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.0To 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.
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
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=2Standardverdiene nedenfor kommer fra src/lerobot/configs/dataset.py på main, ikke en veiledning. Flere er ikke det folk antar.
| Flagg | Standard | Hva det gjør |
|---|---|---|
| --dataset.repo_id | empty | navn; tidsstempel legges til som standard |
| --dataset.single_task | empty | oppgavestreng lagret med hver episode |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | skrivebane, standard ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | kontrollsløyfehastighet og datasettets bildefrekvens |
| --dataset.episode_time_s | 60 | sekunder før en episode automatisk går videre |
| --dataset.reset_time_s | 60 | tilbakestilling av scene; armen beveger seg, ingenting lagres |
| --dataset.num_episodes | 50 | episoder registrert i denne økten |
| --dataset.push_to_hub | true | last opp ved øktens slutt; false forblir lokalt |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | kode under opptak; sett det eksplisitt |
| --dataset.encoder_queue_maxsize | 30 | bufrede rammer per kamera, ~1 s ved 30 fps |
| --dataset.encoder_threads | null (codec decides) | tråder per koder; senk hvis opptaket hakker |
| --dataset.no_stamp | false | behold repo_id nøyaktig som skrevet |
| --resume | false | legg til et eksisterende datasett; krever --dataset.root |
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.
| Retningslinje | Min. episoder | Datasettformat | GPU-nivå | Kostnad per kjøring |
|---|---|---|---|---|
| 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 |
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.
- 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
- 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.
| Feil | Hvordan det ser ut | Hvor det kommer fra | Hvordan fange det |
|---|---|---|---|
| Byttede kameravisninger | håndleddsbilde under toppnøkkelen | indeksomfordeling etter en gjeninnkobling | lerobot-find-cameras hver sesjon; by-id stier |
| Frosne rammer | samme bilde for dusinvis av rader | kamera slutter å levere; løkken gjentar siste ramme | skrubb det i lerobot-dataset-viz |
| Mistede rammer | radantall under fps ganger sekunder | køen flyter over, dropper heller enn blokkerer | 'Encoder queue full' i loggen; rader vs fps ganger varighet |
| Leddet på sin grense | ett ledd flatt på min eller maks | lederens rekkevidde overskrider følgerens, eller en dårlig midtposisjon | per-ledd min/maks i ds.meta.stats; lerobot-find-joint-limits på forhånd |
| Bilde og handling ute av takt | politikken forutser eller henger etter | kameraer med en annen fps enn løkken | hold hvert kamera på --dataset.fps |
| Dødtid | lange serier med identiske handlingsrader | operatør pauset med opptakeren kjørende | andel av sammenhengende identiske handlingsrader |
| Ubrukbar oppgavestreng | task1, demo2, test | skriver fort | meta/tasks.parquet i v3.0 (det var meta/tasks.jsonl i v2.1); fiks med lerobot-edit-dataset modify_tasks |
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.
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"])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.
# 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 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.1 | LeRobot v3.0 | |
|---|---|---|
| Oppsett | én parquet og én MP4 per episode | mange episoder per shard |
| Episodemetadata | JSONL-filer | chunked parquet under meta/episodes/, via datasettstakken |
| Strømming fra Hub-en | nei | ja, via StreamingLeRobotDataset |
| Skrevet av lerobot 0.6.1 | nei | ja, det du får i dag |
| Lest av GR00T N1.7 og N1.5 | ja | nei, må konverteres ned |
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.
# 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=falseTo 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.
Skrivebordsklienten registrerer datasett i LeRobot-format, episoder, kamerastrømmer og leddtilstander, rett ut av en teleoperasjonsøkt. Dette datasettet mates inn i treningsskjemaet: velg modell, datasett og hyperparametere, og bakenden leier en GPU dimensjonert etter modellens VRAM, kjører treneren og skriver sjekkpunkter til objektlagring.
- 1Installer klienten
På nedlastingssiden; oppsett i klientdokumentasjonen.
- 2Ta opp fra en teleoperasjonsøkt
Kjør armen; klienten skriver episoder i LeRobot-format. Gjennomgang: ta opp ditt første datasett.
- 3Eller ta med egne data
Et datasett kan også komme fra en Hugging Face repo-ID eller din egen maskin: datasett-dokumentasjon, offentlig katalog.
- 4Tren og kjør den tilbake
Velg kombinasjonen på treningsmatrisen, og kjør deretter policyen tilbake på armen. Omtrent 1 til 3 USD på 24 GB-nivået, 4 til 12 på A100- eller H100-nivået.
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 skrivebordsklientenFra 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.
Sources
- LeRobot: Imitasjonslæring på virkelige roboter
- LeRobot: SO-100 montering, motoroppsett og kalibrering
- LeRobot: Kameraer og lerobot-find-cameras
- LeRobot: Installasjon og ekstramatrisen
- LeRobotDataset v3.0: layout og v2.1-migrering
- LeRobot: Strømming av videokoding og tapte bilder
- LeRobot: Porting av store datasett til v3.0 (DROID)
- lerobot v0.6.1 utgivelse, 3 August 2026
- DatasetRecordConfig: de virkelige standardinnstillingene for opptak
- lerobot_record.py: opptaksløkke og håndtering av gjenopptakelse
- TheRobotStudio/SO-ARM100: bygge-repo og stykkliste
- Hugging Face: LeRobot fellesskapsdatasett sjekkliste
- lerobot/svla_so100_pickplace: 50 episoder, 19,631 bilder
- Lin et al. (2024), Dataskaleringslover innen imitasjonslæring
- Mandlekar et al. (2021), Hva som betyr noe i læring fra offline menneskelige demonstrasjoner
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