AY-Robots handledningssida för att spela in ditt första LeRobot-dataset med en SO-100-arm
LeRobotSO-100DatasetinspelningTeleoperationImitationsinlärning

Spela in ditt första LeRobot-dataset med en SO-100

AY-Robots ResearchAugust 23, 202616 min läsning

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.

FunktionDatatypFormBeskrivning
actionfloat32[6]ledmål från ledararmen
observation.statefloat32[6]ledpositioner som följaren nådde
observation.images.topvideo[480, 640, 3]scenkamera, MP4 (av1 här)
observation.images.wristvideo[480, 640, 3]handledskamera, samma hastighet
timestampfloat32[1]sekunder sedan episodstart
frame_index, episode_index, index, task_indexint64[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.

En måttstock från ett verkligt dataset

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.

AY-Robots ordlistepost för LeRobot-datasetformatet, som visar katalogstrukturen och metadatafilerna
Vad som finns i data/, videos/ och meta/, och vilka policyer som läser vilken version.

Vad du behöver på arbetsbänken

ArtikelDetaljAnmärkning
FöljararmSO-100, sex Feetech STS3215 servoncirka 110 till 150 EUR i delar
Ledarmen andra SO-100, växlar borttagnaväxlar borttagna från alla sex ledarmotorer: endast encoder, mindre friktion
Strömförsörjningmatchad till 7.4 V STS3215-varianten i materiallistanse varningen nedan
Kamerortvå USB-kameror, 640x480 vid 30 fpsen scenvy, en på handleden
VärdPython 3.12 eller nyare, ffmpegrequires-python >= 3.12
Hub-kontoHugging Face skrivtokenvalfritt med --dataset.push_to_hub=false
7.4 V, inte 12 V

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

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 systemöversikt, inklusive den ffmpeg-version den kan hitta i PATH.

Tillä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.

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

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

    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
    Kalibrera 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. id blir profilens filnamn.

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

    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
Var kalibreringen hamnar, och varför ID:t är viktigt

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

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
Kör detta varje session: dokumentationen varnar för att dessa identifierare kan ändras efter en omstart eller omkoppling, beroende på operativsystemet.

Två 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.

Kameraindexet är inte en stabil identitet

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

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 är en shell-citerad sträng; de kapslade klammerparenteserna är inte shell-syntax.

Standardvärdena nedan kommer från src/lerobot/configs/dataset.py på main, inte en handledning. Flera är inte vad folk antar.

FlaggaStandardVad den gör
--dataset.repo_idemptynamn; tidsstämpel läggs till som standard
--dataset.single_taskemptyuppgiftssträng lagrad med varje episod
--dataset.root$HF_LEROBOT_HOME/repo_idskrivsökväg, standard ~/.cache/huggingface/lerobot/
--dataset.fps30kontrollloop-hastighet och dataset-bildfrekvens
--dataset.episode_time_s60sekunder innan en episod automatiskt går vidare
--dataset.reset_time_s60scenåterställning; armen rör sig, inget lagras
--dataset.num_episodes50episoder inspelade under denna session
--dataset.push_to_hubtrueladda upp vid sessionens slut; false stannar lokalt
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablekoda under inspelning; ställ in den explicit
--dataset.encoder_queue_maxsize30buffrade bildrutor per kamera, ~1 s vid 30 fps
--dataset.encoder_threadsnull (codec decides)trådar per kodare; sänk om inspelningen hackar
--dataset.no_stampfalsebehåll repo_id exakt som det skrevs
--resumefalselägg till i ett befintligt dataset; kräver --dataset.root
Två flaggor som oväntat kostar en timme

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.

PolicyMin antal episoderDatasetformatGPU-nivåKostnad per körning
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

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.

Ledar-följar-teleoperation som datakälla
Fördelar
  • 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
Kompromisser
  • 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.

DefektHur det ser utVar det kommer ifrånHur man upptäcker det
Bytta kameravyerhandledsbild under den översta nyckelnindexomtilldelning efter en omkopplinglerobot-find-cameras varje session; by-id paths
Frysta bildrutorsamma bild för dussintals raderkameran slutar leverera; loopen upprepar den sista bildrutangranska det i lerobot-dataset-viz
Tappade bildrutorradantal under fps gånger sekunderkö överflödar, tappar snarare än blockerar'Encoder queue full' i loggen; rader kontra fps gånger varaktighet
Led vid sin gränsen led platt vid min eller maxledarens räckvidd överstiger följarens, eller en dålig mittpositionper-joint min/max i ds.meta.stats; lerobot-find-joint-limits i förväg
Bild och handling i otaktpolicyn förutser eller släpar efterkameror med en annan fps än loopenhåll varje kamera vid --dataset.fps
Dödtidlånga serier av identiska aktionsraderoperatören pausade med inspelaren igångandel av på varandra följande identiska aktionsrader
Oanvändbar uppgiftssträngtask1, demo2, testskriver snabbtmeta/tasks.parquet i v3.0 (det var meta/tasks.jsonl i v2.1); fixa med lerobot-edit-dataset modify_tasks
Borttappade bildrutor döljer sig

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.

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 episod som avviker mycket från fps gånger varaktighet är en kandidat för radering, inte träning.

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.

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ör även delning, sammanslagning, borttagning av funktioner, modifiering av uppgifter och omberäkning av statistik. Radera generöst: en dålig episod kostar en episod; att behålla den kostar varje körning som tränas på den.
AY-Robots datasetkatalog som listar offentliga LeRobot-dataset med episodantal och format
Hur jämförbara dataset är dimensionerade och annoterade.

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.1LeRobot v3.0
Layouten parquet- och en MP4-fil per episodmånga episoder per shard
EpisodmetadataJSONL-filerchunked parquet under meta/episodes/, via datasets-stacken
Streaming från Hubbennejja, via StreamingLeRobotDataset
Skrivet av lerobot 0.6.1nejja, vad du får idag
Läses av GR00T N1.7 och N1.5janej, måste konverteras nedåt
Inspelning idag, träning av GR00T imorgon

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.

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
Snabbt för 50 avsnitt. Skalning är ett annat jobb: lerobots portningsguide, för rå DROID till v3.0, budgeterar 7+ dagar av lokal bearbetning och cirka 400 GB.

Två 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.

Vad denna väg kostar

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.

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 skrivbordsklienten

Frå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.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started