
Spela in ett användbart LeRobot-dataset med en SO-100: kalibrering, leader-follower teleoperation, de verkliga lerobot-record-flaggorna och standardinställningarna, kamerainställningar, antal episoder och de defekter som förstör en körning.
En SO-100-följare, en ledararm av samma design och två USB-kameror kan finjustera en policy på en eftermiddag. Samma testbänk kan lika enkelt producera sextio episoder som ser bra ut i en filbläddrare och slösa bort en sex timmars GPU-körning. Skillnaden är sällan modellen; det är vad som hände mellan servona och parquet-filen.
Här är den manuella vägen, sedan den kortare. Varje kommando är från lerobot 0.6.1, släppt 3 augusti 2026 och aktuell på PyPI. Den flyttades till konsolens ingångspunkter, så handledningar som kör python lerobot/scripts/control_robot.py beskriver en fil som inte längre existerar.
Den korta versionen
- •lerobot 0.6.1 spelar in v3.0; GR00T N1.7 och N1.5 vill ha v2.1. Bestäm formatet innan du trycker på spela in.
- •Fyra kommandon: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Använd samma --robot.id och --teleop.id från kalibreringen i inspelningssessionen.
- •Verkliga standardvärden: 30 fps, 60 s per episod, 60 s återställning, 50 episoder, cirka 100 minuter verklig tid.
- •Minsta antal episoder här: 30 för SmolVLA, 50 för resten.
- •Mångfald slår volym. Dataset dör av fyra saker: omkastade kameraindex, tappade eller frysta bildrutor, en led parkerad vid sin gräns, en oläsbar uppgiftssträng.
Vad en inspelningssession fångar
En LeRobot-dataset är inte en mapp med videor utan en tidsindexerad tabell med bifogad video: varje kontroll-loop-tick skriver en rad som innehåller den beordrade åtgärden, tillståndet som följaren nådde, en bildruta per kamera, en tidsstämpel och index. Policyn ser endast dessa kolumner. Schemat för lerobot/svla_so100_pickplace, läst från dess meta/info.json.
| Funktion | Datatyp | Form | Beskrivning |
|---|---|---|---|
| action | float32 | [6] | ledmål från ledararmen |
| observation.state | float32 | [6] | ledpositioner som följaren nådde |
| observation.images.top | video | [480, 640, 3] | scenkamera, MP4 (av1 här) |
| observation.images.wrist | video | [480, 640, 3] | handledskamera, samma hastighet |
| timestamp | float32 | [1] | sekunder sedan episodstart |
| frame_index, episode_index, index, task_index | int64 | [1] | automatiskt ifylld bokföring |
Lederna är main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll och main_gripper: SO-100:s sex frihetsgrader. Åtgärd och tillstånd delar en form eftersom ledar-följar-teleoperation registrerar ett mål och positionen som nåddes ett steg senare. Denna lucka är information: var armen kämpade mot gravitationen eller ett fastnat föremål. Dessa strängar tillhör det datasetet. En session inspelad med 0.6.1 idag skriver shoulder_pan.pos till gripper.pos, id 1 till 6 på bussen: samma sex leder, olika nycklar, vilket spelar roll i det ögonblick en konfiguration adresserar en funktion med namn.
Det datasetet innehåller 50 episoder och 19 631 bildrutor med 30 fps: cirka 393 bildrutor, eller 13 sekunder, per episod. Om dina i genomsnitt är en minut, gör du något svårare eller spelar in dödtid i båda ändar.

Vad du behöver på arbetsbänken
| Artikel | Detalj | Anmärkning |
|---|---|---|
| Följararm | SO-100, sex Feetech STS3215 servon | cirka 110 till 150 EUR i delar |
| Ledarm | en andra SO-100, växlar borttagna | växlar borttagna från alla sex ledarmotorer: endast encoder, mindre friktion |
| Strömförsörjning | matchad till 7.4 V STS3215-varianten i materiallistan | se varningen nedan |
| Kameror | två USB-kameror, 640x480 vid 30 fps | en scenvy, en på handleden |
| Värd | Python 3.12 eller nyare, ffmpeg | requires-python >= 3.12 |
| Hub-konto | Hugging Face skrivtoken | valfritt med --dataset.push_to_hub=false |
STS3215 finns i två versioner: SO-ARM100 README anger 7.4 V-versionen till 16.5 kg.cm stallmoment mätt vid 6 V och 12 V-versionen till 30 kg.cm, och noterar att om man väljer 12 V-motorerna innebär det också att man måste köpa en 12 V 5 A+ strömförsörjning istället för den 5 V. Materiallistan anger 7.4 V servon. Att mata 12 V till servon klassade för 7.4 V förstör dem, så läs motorernas etikett innan du kopplar något. Servo svarar inte.
Om armen inte är byggd än, är det en separat kväll: börja på Komma igång med SO-100 och den kompletta installationsguiden för SO-100. Om du inte har köpt något, läs jämförelsen mellan SO-100 och SO-101 först: SO-101 är den nyare revisionen med förbättrad kabeldragning och inget steg för att ta bort växlar, och inspelningsflödet är identiskt.
Installera 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-infoTillägg är det som oftast ställer till det. pip install lerobot installerar endast kärn-ML-beroenden, inget som kommunicerar med en robot. Koch-armar behöver dynamixel istället för feetech. Om din shell aldrig har hört talas om lerobot-record, är det därför.
Portar, motor-ID:n och kalibrering
Tre engångssteg skiljer delarna från en fungerande teleop-loop. gör att en policy tränad på din arm kan köras på någon annans, genom att mappa råa pulsgivarvärden till en gemensam ledkonvention.
- 1Hitta USB-porten för varje arm
Kör det med båda armarna inkopplade, koppla ur den du identifierar när du uppmanas, och notera vilken port som försvinner. På Linux kan du behöva
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:n och baudrates
ID:n skrivs en motor i taget, och dokumentationen är strikt om hur: anslut exakt en motor till styrkortet, ännu inte seriekopplad med någon annan. Skriptet går baklänges genom kedjan, frågar efter griparen först och ger den ID 6, sedan wrist_roll som 5, ner till shoulder_pan som 1. Gör detta före montering.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Kalibrera båda armarna
Flytta varje led till mitten av dess rörelseområde, tryck Enter, och svep sedan varje led genom dess fulla rörelseområde.
idblir profilens filnamn.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 - 4Teleoperera före inspelning
Acceptanstestet för allt ovan. Om teleoperationen är ryckig, spegelvänd, eller om en led inte följer, bevaras detta i 50 episoder vid inspelning.
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 hamnar i $HF_LEROBOT_CALIBRATION, standard är ~/.cache/huggingface/lerobot/calibration, och ID:t är uppslagnyckeln. Ge lerobot-record ett kalibrerat ID så erbjuds Enter för att återanvända profilen eller c för att göra om den. Ge det ett okänt ID och det finns ingen fil, så det går in i kalibrering mitt under sessionen.
Kameror avgör vad policyn 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.0Två vyer, och var de sitter spelar roll: en fast scenkamera som täcker arbetsytan, och en handledskamera nära gripdonet som visar vad griparen är på väg att röra. LeRobots checklista för community-dataset efterfrågar helst två vyer på 480x640 / 720p eller bättre, en statisk bakgrund, neutral stabil belysning, samt att ledararmen och mänskliga lemmar är utanför bild. Inspelningsguiden lägger till tumregeln: du ska kunna utföra uppgiften själv genom att bara titta på kamerabilderna.
OpenCV-index kommer från uppräkningsordningen, så en omstart eller omkoppling kan få index 0 och 2 att byta plats och placera handledsvyn i den översta platsen för en hel session. lerobot säger det själv: dess kameraklass tar en enhetssökväg såväl som ett heltal, och varnar för att index är instabila över omstarter eller portändringar, särskilt på Linux. Peka index_or_path mot udev-symlänken under /dev/v4l/by-id/, som följer enheten snarare än uppräkningsordningen. Detta är det vanligaste sättet ett dataset blir internt inkonsekvent, och träning kan inte reparera det. Kamera ej upptäckt.
Kommandot record och alla flaggor
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=2Standardvärdena nedan kommer från src/lerobot/configs/dataset.py på main, inte en handledning. Flera är inte vad folk antar.
| Flagga | Standard | Vad den gör |
|---|---|---|
| --dataset.repo_id | empty | namn; tidsstämpel läggs till som standard |
| --dataset.single_task | empty | uppgiftssträng lagrad med varje episod |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | skrivsökväg, standard ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | kontrollloop-hastighet och dataset-bildfrekvens |
| --dataset.episode_time_s | 60 | sekunder innan en episod automatiskt går vidare |
| --dataset.reset_time_s | 60 | scenåterställning; armen rör sig, inget lagras |
| --dataset.num_episodes | 50 | episoder inspelade under denna session |
| --dataset.push_to_hub | true | ladda upp vid sessionens slut; false stannar lokalt |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | koda under inspelning; ställ in den explicit |
| --dataset.encoder_queue_maxsize | 30 | buffrade bildrutor per kamera, ~1 s vid 30 fps |
| --dataset.encoder_threads | null (codec decides) | trådar per kodare; sänk om inspelningen hackar |
| --dataset.no_stamp | false | behåll repo_id exakt som det skrevs |
| --resume | false | lägg till i ett befintligt dataset; kräver --dataset.root |
Din datamängd heter inte det du skrev. lerobot lägger till en datum-tids-tagg, så so100_pick_cube blir so100_pick_cube_20260823_141530. Använd --dataset.no_stamp=true för ett stabilt namn. Återuppta räknar tillägg, inte totaler. Med --resume=true räknar --dataset.num_episodes ytterligare episoder och --dataset.root blir obligatoriskt. Be om 50 på en datamängd med 30 episoder och du får 80.
Tangentbordskontroll under en session
- Högerpil eller
n: avsluta episoden eller återställ fasen tidigt. Tangenten du använder mest, eftersom ett rent grepp sällan behöver 25 sekunder. - Vänsterpil eller
r: kasta episoden och gör om den. Ett dåligt försök kostar inget nu och mycket senare. - Escape eller
q: stoppa sessionen, slutför kodning, ladda upp. - Dessa fungerar på X11, Wayland och headless SSH: utan en global tangentbordsbackend läser lerobot-record samma tangenter från den kontrollerande terminalen. Bokstäverna överlever fördröjda SSH-länkar, där pilsekvenser delas.
- Tangentbords-teleoperation är annorlunda och behöver en global backend: X11, Windows, eller macOS med Accessibility.
Hur många episoder, och hur en bra sådan ser ut
Inspelningsguiden föreslår minst 50 episoder för en första uppgift, cirka 10 per objektplats. policysidorna listar ett minimum per modell, under vilket en körning inte är värd GPU-tiden.
| Policy | Min antal episoder | Datasetformat | GPU-nivå | Kostnad per körning |
|---|---|---|---|---|
| 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 |
Den bättre frågan är hur många av vad. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) samlade in över 40 000 demonstrationer och körde mer än 15 000 verkliga rollouts. Generaliseringen följde ett ungefärligt potenslagförhållande med antalet miljöer och objekt, och efter en tröskel per miljö eller objekt hade ytterligare demonstrationer minimal effekt. På en testbänk: flytta objektet, ändra belysningen, byt kuben, snarare än att upprepa en tagning.
- Kontinuerliga ledrörelser som en servo kan reproducera, till skillnad från tangentbord eller gamepad
- Åtgärd och tillstånd delar en koordinatkonvention, så policyn lär sig ett mål den kan styra direkt
- En 25 sekunders episod plus en 10 sekunders återställning är ungefär 100 episoder i timmen
- Operatören känner när följaren stannar eller fastnar, så fel upptäcks innan data sparas
- En andra arm fördubblar ungefär komponentkostnaden
- Demonstrationer ärver operatörsvanor; Mandlekar et al. fann att policykvaliteten beror starkt på demonstrationskvaliteten
- Ledaren samplas med loopfrekvens, så pauser blir nästan identiska rader som lär policyn att vänta
- Inget säkerställer konsistens mellan sessioner: en kamera som flyttats 5 cm är ett dolt distributionsskifte
En bra episod är tråkig: repeterbar hemposition, en sak gjord, avslutad när objektet är i behållaren, uppgiftssträng på 25 till 50 tecken som checklistan rekommenderar. Plocka den röda kuben och släpp den i lådan är en uppgiftssträng; task1 är anti-mönstret som checklistan uttryckligen nämner. Vaga anteckningar toppar dess lista över problem, och de är viktigast för , där strängen är en modellinput, inte ett filnamn.
Defekter som tyst förstör ett dataset
Ingen kastar ett undantag. Alla överlever in i träningen och visar sig som en förlustkurva som ser bra ut och en robot som inte gör någonting. Kontrollera medan scenen är uppsatt.
| Defekt | Hur det ser ut | Var det kommer ifrån | Hur man upptäcker det |
|---|---|---|---|
| Bytta kameravyer | handledsbild under den översta nyckeln | indexomtilldelning efter en omkoppling | lerobot-find-cameras varje session; by-id paths |
| Frysta bildrutor | samma bild för dussintals rader | kameran slutar leverera; loopen upprepar den sista bildrutan | granska det i lerobot-dataset-viz |
| Tappade bildrutor | radantal under fps gånger sekunder | kö överflödar, tappar snarare än blockerar | 'Encoder queue full' i loggen; rader kontra fps gånger varaktighet |
| Led vid sin gräns | en led platt vid min eller max | ledarens räckvidd överstiger följarens, eller en dålig mittposition | per-joint min/max i ds.meta.stats; lerobot-find-joint-limits i förväg |
| Bild och handling i otakt | policyn förutser eller släpar efter | kameror med en annan fps än loopen | håll varje kamera vid --dataset.fps |
| Dödtid | långa serier av identiska aktionsrader | operatören pausade med inspelaren igång | andel av på varandra följande identiska aktionsrader |
| Oanvändbar uppgiftssträng | task1, demo2, test | skriver snabbt | meta/tasks.parquet i v3.0 (det var meta/tasks.jsonl i v2.1); fixa med lerobot-edit-dataset modify_tasks |
Kodaren har en begränsad kö per kamera, 30 bildrutor som standard. När den inte kan hålla jämna steg, släpps bildrutor snarare än blockeras: inspelningen fortsätter och inget kraschar. Du får Encoder queue full for {camera}, dropped N frame(s) och en totalsumma per kamera vid avsnittets slut. Lerobot-tröskeln: cirka 5 procent saknade bildrutor indikerar ett överbelastat system, 2 procent är förväntad startbelastning. Lösningar i ordning: --display_data=false, sänk --dataset.encoder_threads, vcodec=h264, stäng av streaming.
En varning: tabellen i guiden för streaming-kodning listar standardvärdet som True, medan dataklassen på main läser streaming_encoding: bool = False. Dokumentation och kod skiljer sig åt, så ställ in det explicit; lerobot loggar en rekommendation närhelst det startar med flaggan avstängd.
Kontrollera datasetet innan du hyr en GPU
Acceptanstestet från dokumentationen: jämför videons längd med avsnittets längd som CLI rapporterade, och bekräfta att antalet rader är lika med fps gånger längden. Per avsnitt, inte 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"])Titta sedan på den. lerobot-dataset-viz spelar upp en episod bildruta för bildruta med ledspår bredvid kameravyerna, i Rerun eller Foxglove. Utbytta kameror och frysta bildrutor dyker upp inom tio sekunder. Folk hoppar över det här steget.
# 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: bestäm dig innan du spelar in
v2.1 skrev en parquet- och en MP4-fil per episod. v3.0 sammanfogar många episoder till delade shards och återskapar gränser från metadata, så info.json innehåller sökvägsmallar som data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet istället för ett episodnummer. Den bakomliggande motiveringen är färre, större filer: snabbare initialisering och mindre filsystemstryck i stor skala.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Layout | en parquet- och en MP4-fil per episod | många episoder per shard |
| Episodmetadata | JSONL-filer | chunked parquet under meta/episodes/, via datasets-stacken |
| Streaming från Hubben | nej | ja, via StreamingLeRobotDataset |
| Skrivet av lerobot 0.6.1 | nej | ja, vad du får idag |
| Läses av GR00T N1.7 och N1.5 | ja | nej, måste konverteras nedåt |
lerobot 0.6.1 skriver v3.0, men GR00T N1.7 och N1.5 läser v2.0 eller v2.1 och kraschar på det. Observera färdriktningen: src/lerobot/scripts/ innehåller convert_dataset_v21_to_v30.py och inget som går åt andra hållet. Lös detta innan sessionen. Fix: dataset avvisat 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=falseTvå vägar till samma dataset
Allt ovan, på din egen maskin: du äger USB-uppräkningen, ffmpeg-byggnaden, kodarinställningen och kalibreringsfilerna. Rätt väg för att förstå pipelinen, köra en ovanlig kamerauppsättning eller hålla data lokalt.
Tid: en kväll per arm för montering, en pillrig första kalibrering och en första session du kastar bort för att en kamera satt i fel plats.
Skrivbordsklienten spelar in dataset i LeRobot-format, avsnitt, kameraströmmar och ledtillstånd, direkt från en teleoperation session. Det datasetet matar träningsformuläret: välj modell, dataset och hyperparametrar, och backend hyr en GPU dimensionerad efter modellens VRAM, kör tränaren och skriver kontrollpunkter till objektlagring.
- 1Installera klienten
På nedladdningssidan; installation i klientdokumentationen.
- 2Spela in från en teleoperationssession
Styr armen; klienten skriver avsnitt i LeRobot-format. Genomgång: spela in ditt första dataset.
- 3Eller ta med din egen data
Ett dataset kan också komma från ett Hugging Face repo-ID eller din egen maskin: datasetdokumentation, offentlig katalog.
- 4Träna och kör tillbaka den
Välj kombinationen på träningsmatrisen, kör sedan policyn tillbaka på armen. Ungefär 1 till 3 USD på 24 GB-nivån, 4 till 12 på A100- eller H100-nivån.
Den monterar eller kalibrerar inte din arm, och den reparerar inte ett defekt avsnitt, så inspektionssteget gäller fortfarande. Det finns också en hård gräns i andra änden: för snabba uppgifter måste inferensen sitta bredvid servona. Kontrollslingan körs 20 till 485 ms per åtgärdssteg, och offentliga internet-rundresor ovanpå förvandlar en fungerande policy till en tveksam.
Spela in LeRobot-dataset utan att koppla ihop pipelinen själv
AY-Robots skrivbordsklient spelar in avsnitt, kameraströmmar och ledtillstånd i LeRobot-format från en teleoperationssession, och överlämnar sedan datasetet till tränaren.
Skaffa skrivbordsklientenFrån dataset till policy
Femtio rena episoder matar varje körning här. tränar från grunden på din uppgift ensam, cirka 80 M parametrar vid ungefär 20 ms per åtgärdssteg, den enda av de fem som är bekväm med snabb rörelse. är cirka 450 M parametrar på ett 24 GB-kort. är en ungefär 3 B parameter grundmodell där rör vid cirka 40 M parametrar, behöver en A100 eller H100, och vill ha det v2.1-datasetet.
Därefter, guiden för din kombination: , eller ; för en första körning, är kortare. När policyn fungerar på bänken men kollapsar i samma ögonblick som du flyttar bordet, då är det ett dataproblem: och går djupare in på mångfald.
Hur många episoder behöver jag egentligen för en första fungerande policy?▾
Trettio för SmolVLA, femtio för ACT, Pi0.5, GR00T N1.5 och N1.7, de miniminivåer som AY-Robots tränare upprätthåller. LeRobot-guiden rekommenderar oberoende minst 50 för en första uppgift, cirka 10 per objektplats. Data-skalningsarbete fann att generalisering skalas med miljöer och objekt snarare än demonstrationsantal, så hundra tagningar av en scen är sämre än femtio över fem placeringar.
Behöver jag en ledararm, eller kan jag fjärrstyra med ett tangentbord?▾
lerobot levereras med tangentbords- och gamepad-teleoperatorer, så en ledararm är inte strikt nödvändig, men den är starkt att föredra: ledare-följare ger kontinuerliga ledrörelser i den inspelade åtgärdens koordinatkonvention, medan tangentbordsinmatning producerar stegvis rörelse som en policy lär sig som ryck. Tangentbordsfjärrstyrning behöver också en global nyckel-backend, så den misslyckas på Wayland och headless.
Kan jag spela in på en Raspberry Pi eller en liten mini-PC?▾
Ja, med justering. Guiden för strömmande kodning har en lågresurskategori som täcker moderna 4-kärniga maskiner och Raspberry Pi 5, och placerar två kameror vid 640x480 och 30 fps i sin kolumn för 'kräver viss justering'. Dess råd: stoppa kodaren från att konkurrera med inspelningsloopen, via --dataset.rgb_encoder.vcodec=h264 och --dataset.streaming_encoding=false. Den bedömer två kameror vid 640x480 som cirka 55 miljoner pixlar per sekund och två vid 1920x1080 som cirka 373 miljoner.
Hur vet jag att datasetet jag just spelade in faktiskt är friskt?▾
Tre enkla kontroller. Jämför varje episodens videolängd med den längd som CLI rapporterade och bekräfta att radantalet är lika med fps gånger den längden, per episod snarare än totalt; det är acceptanstestet som lerobots kodningsguide ger. Läs ds.meta.stats, där en led vars minsta värde är lika med dess maximala aldrig rörde sig. Spela sedan upp två eller tre episoder i lerobot-dataset-viz, det enda sättet att upptäcka bytta vyer och frysta bildrutor. När det gäller tappade bildrutor drar guiden gränsen vid ungefär 5 procent saknade; cirka 2 procent är normal tillfällig belastning, ofta bara vid uppstart.
Mitt träningsjobb avvisade datasetet som v3.0. Vad nu?▾
GR00T N1.7 och N1.5 läser LeRobot v2.0 eller v2.1 och kraschar på v3.0, vilket är vad lerobot 0.6.1 spelar in. Antingen bestämmer du formatet före träning, eller så använder du en policy som läser v3.0 nativt: Pi0.5, SmolVLA eller ACT. lerobot levererar en v2.1 till v3.0-konverterare och inget i omvänd riktning.
Sources
- LeRobot: Imitationsinlärning på verkliga robotar
- LeRobot: SO-100 montering, motorinställning och kalibrering
- LeRobot: Kameror och lerobot-find-cameras
- LeRobot: Installation och tilläggsmatrisen
- LeRobotDataset v3.0: layout och v2.1 migrering
- LeRobot: Strömmande videokodning och tappade bildrutor
- LeRobot: Portning av stora dataset till v3.0 (DROID)
- lerobot v0.6.1 release, 3 augusti 2026
- DatasetRecordConfig: de verkliga inspelningsstandarderna
- lerobot_record.py: inspelningsslinga och hantering av återupptagning
- TheRobotStudio/SO-ARM100: bygg-repo och materiallista
- Hugging Face: LeRobot gemenskapsdataset checklista
- lerobot/svla_so100_pickplace: 50 avsnitt, 19,631 frames
- Lin et al. (2024), Datalagars skalning inom imitationsinlärning
- Mandlekar et al. (2021), Vad som är viktigt vid inlärning från offline mänskliga demonstrationer
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