AY-Robots tutorialside for optagelse af dit første LeRobot-datasæt med en SO-100-arm
LeRobotSO-100DatasætoptagelseTeleoperationImitationslæring

Optag dit første LeRobot-datasæt med en SO-100

AY-Robots ResearchAugust 23, 202616 min læsning

Optag et brugbart LeRobot-datasæt med en SO-100: kalibrering, leder-følger teleoperation, de rigtige lerobot-record-flags og standardindstillinger, kameraopsætning, antal episoder og de fejl, der ødelægger en kørsel.

En SO-100 følger, en lederarm af samme design og to USB-kameraer kan finjustere en politik på en eftermiddag. Den samme testbænk kan lige så nemt producere tres episoder, der ser sunde ud i en filbrowser og spilde en seks-timers GPU-kørsel. Forskellen er sjældent modellen; det er, hvad der skete mellem servoerne og parquet-filen.

Her er den manuelle rute, derefter den kortere. Hver kommando er fra lerobot 0.6.1, udgivet 3. august 2026 og aktuel på PyPI. Den flyttede til konsolindgangspunkter, så tutorials, der kører python lerobot/scripts/control_robot.py beskriver en fil, der ikke længere eksisterer.

Den korte version

  • lerobot 0.6.1 optager v3.0; GR00T N1.7 og N1.5 ønsker v2.1. Aftal formatet, før du trykker på optag.
  • Fire kommandoer: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Brug de samme --robot.id og --teleop.id fra kalibreringen i optagelsessessionen.
  • Standardindstillinger: 30 fps, 60 s pr. episode, 60 s nulstilling, 50 episoder, ca. 100 minutters reel tid.
  • Minimum episoder her: 30 for SmolVLA, 50 for resten.
  • Mangfoldighed slår volumen. Datasæt dør af fire ting: ombyttede kamera-indekser, tabte eller frosne billeder, et led parkeret ved sin grænse, en ulæselig opgavestreng.

Hvad en optagelsessession fanger

Et LeRobot datasæt er ikke en mappe med videoer, men en tidsindekseret tabel med vedhæftet video: hvert kontrolsløjfe-tick skriver én række, der indeholder den kommanderende handling, den tilstand, følgeren nåede, én ramme per kamera, et tidsstempel og indekser. Politikken ser kun disse kolonner. Skemaet for lerobot/svla_so100_pickplace, læst fra dens meta/info.json.

FunktiondtypeFormHvad det er
actionfloat32[6]ledmål fra lederarmen
observation.statefloat32[6]ledpositioner følgeren nåede
observation.images.topvideo[480, 640, 3]scene-kamera, MP4 (av1 her)
observation.images.wristvideo[480, 640, 3]håndledskamera, samme hastighed
timestampfloat32[1]sekunder siden episode start
frame_index, episode_index, index, task_indexint64[1]automatisk udfyldt bogføring

Leddene er main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll og main_gripper: SO-100's seks frihedsgrader. Handling og tilstand deler en form, fordi leder-følger teleoperation registrerer et mål og den position, der blev nået et skridt senere. Dette mellemrum er information: hvor armen kæmpede mod tyngdekraften eller et fastsiddende objekt. Disse strenge er datasættets. En session optaget med 0.6.1 i dag skriver shoulder_pan.pos til gripper.pos, ID'er 1 til 6 på bussen: samme seks led, forskellige nøgler, hvilket er vigtigt i det øjeblik en konfiguration adresserer en funktion ved navn.

En målestok fra et reelt datasæt

Dette datasæt indeholder 50 episoder og 19.631 frames ved 30 fps: omkring 393 frames, eller 13 sekunder, per episode. Hvis dine i gennemsnit er et minut, laver du noget sværere eller optager dødtid i begge ender.

AY-Robots' ordlisteopslag for LeRobot datasætformatet, der viser mappestrukturen og metadatafilerne
Hvad der findes i data/, videos/ og meta/, og hvilke politikker der læser hvilken version.

Hvad du skal bruge på arbejdsbordet

EmneDetaljeBemærk
FølgerarmSO-100, seks Feetech STS3215 servoerca. 110 til 150 EUR i dele
Lederarmen anden SO-100, gear fjernetgear fjernet fra alle seks ledermotorer: kun encoder, mindre friktion
Strømtilpasset 7.4 V STS3215 varianten i styklistense advarslen nedenfor
Kameraerto USB-kameraer, 640x480 ved 30 fpsén scenevisning, én på håndleddet
VærtPython 3.12 eller nyere, ffmpegrequires-python >= 3.12
Hub-kontoHugging Face write tokenvalgfrit med --dataset.push_to_hub=false
7.4 V, ikke 12 V

STS3215 findes i to versioner: SO-ARM100 README angiver 7.4 V versionen til 16.5 kg.cm stallmoment målt ved 6 V og 12 V versionen til 30 kg.cm, og bemærker, at valg af 12 V motorer også betyder, at man skal købe en 12 V 5 A+ strømforsyning i stedet for en 5 V. Styklisten angiver 7.4 V servoer. Tilførsel af 12 V til servoer, der er klassificeret til 7.4 V, ødelægger dem, så læs motorlabelen, før du tilslutter noget. Servo reagerer ikke.

Hvis armen ikke er bygget endnu, er det en separat aften: start med SO-100 introduktion og den komplette SO-100 opsætningsguide. Hvis du ikke har købt noget, læs SO-100 mod SO-101 sammenligning først: SO-101 er den nyere revision med forbedret ledningsføring og intet trin med fjernelse af gear, og optagelsesworkflowet 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 udskriver en systemoversigt, inklusive den ffmpeg-version den kan finde på PATH.

Ekstraudstyr forvirrer de fleste. pip install lerobot installerer kun kerne ML-afhængigheder, intet der taler med en robot. Koch-arme kræver dynamixel i stedet for feetech. Hvis din shell aldrig har hørt om lerobot-record, er det derfor.

Porte, motor-ID'er og kalibrering

Tre engangstrin står mellem dele og en fungerende teleop-loop. får en politik trænet på din arm til at køre på en andens, idet rå encoder-tællinger mappes til en fælles ledkonvention.

  1. 1
    Find USB-porten for hver arm

    Kør den med begge arme tilsluttet, træk stikket ud af den, du identificerer, når du bliver bedt om det, og bemærk hvilken port der forsvinder. På Linux skal du muligvis bruge 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 ad gangen, og dokumentationen er streng med hensyn til hvordan: tilslut præcis én motor til controllerkortet, endnu ikke seriekoblet til nogen anden. Scriptet gennemgår kæden baglæns, beder først om griberen og giver den id 6, derefter wrist_roll som 5, ned til shoulder_pan som 1. Gør det før samling.

    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 arme

    Flyt hvert led til midten af dets bevægelsesområde, tryk Enter, og før derefter hvert led gennem dets fulde bevægelsesområde. id bliver 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 optager noget

    Acceptancetesten for alt ovenstående. Hvis teleoperationen er hakkende, spejlvendt, eller et led ikke følger med, bevares dette i 50 episoder ved optagelse.

    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 kalibrering gemmes, og hvorfor ID'et er vigtigt

Profiler gemmes i $HF_LEROBOT_CALIBRATION, standard ~/.cache/huggingface/lerobot/calibration, og ID'et er opslagsnøglen. Giv lerobot-record et kalibreret ID, og den tilbyder Enter for at genbruge profilen eller c for at gentage den. Giv den et ukendt ID, og der er ingen fil, så den falder ind i kalibrering midt i sessionen.

Kameraer bestemmer, hvad politikken 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 dette hver session: dokumentationen advarer om, at disse identifikatorer kan ændre sig efter en genstart eller et genindstik, afhængigt af operativsystemet.

To visninger, og hvor de er placeret, er vigtigt: et fast scenekamera, der dækker arbejdsområdet, og et håndledskamera nær end-effektor der viser, hvad griberen er ved at røre. LeRobot-fællesskabsdatasæt-tjeklisten beder om helst to visninger ved 480x640 / 720p eller bedre, en statisk baggrund, neutral stabil belysning og lederarmen og menneskelige lemmer uden for billedet. Optageguiden tilføjer tommelfingerreglen: du skal selv kunne udføre opgaven ved kun at se på kamerabillederne.

Kameraindekset er ikke en stabil identitet

OpenCV-indekser kommer fra opregningsrækkefølgen, så en genstart eller et genindstik kan få indeks 0 og 2 til at bytte plads og placere håndledsvisningen i den øverste plads for en hel session. lerobot siger det selv: dens kameraklasse tager en enhedssti såvel som et heltal og advarer om, at indekser er ustabile på tværs af genstarter eller portændringer, især på Linux. Peg index_or_path mod udev-symlinket under /dev/v4l/by-id/, som følger enheden snarere end opregningsrækkefølgen. Dette er den mest almindelige måde, et datasæt ender internt inkonsistent på, og træning kan ikke reparere det. Kamera ikke fundet.

Kommandoen `record` og alle flag

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 shell-citeret streng; de indlejrede krøllede parenteser er ikke shell-syntaks.

Standardværdierne nedenfor kommer fra src/lerobot/configs/dataset.py på main, ikke en tutorial. Flere er ikke, hvad folk antager.

FlagStandardHvad det gør
--dataset.repo_idemptynavn; tidsstempel tilføjes som standard
--dataset.single_taskemptyopgavestreng gemt med hver episode
--dataset.root$HF_LEROBOT_HOME/repo_idskrivesti, standard ~/.cache/huggingface/lerobot/
--dataset.fps30kontrolsløjfehastighed og datasæt-billedhastighed
--dataset.episode_time_s60sekunder før en episode automatisk går videre
--dataset.reset_time_s60nulstilling af scene; armen bevæger sig, intet gemmes
--dataset.num_episodes50episoder optaget i denne session
--dataset.push_to_hubtrueupload ved sessionsafslutning; false forbliver lokalt
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablekod under optagelse; indstil det eksplicit
--dataset.encoder_queue_maxsize30bufferede billeder pr. kamera, ~1 s ved 30 fps
--dataset.encoder_threadsnull (codec decides)tråde pr. encoder; sænk hvis optagelsen hakker
--dataset.no_stampfalsebehold repo_id præcis som indtastet
--resumefalsetilføj til et eksisterende datasæt; kræver --dataset.root
To flag, der uventet koster en time

Dit datasæt hedder ikke det, du indtastede. lerobot tilføjer et dato-tidsstempel, så so100_pick_cube bliver til so100_pick_cube_20260823_141530. Brug --dataset.no_stamp=true for et stabilt navn. Resume tæller tilføjelser, ikke totaler. Med --resume=true tæller --dataset.num_episodes yderligere episoder, og --dataset.root bliver obligatorisk. Bed om 50 på et datasæt med 30 episoder, og du får 80.

Tastaturkontrol under en session

  • Højre pil eller n: afslut episoden eller nulstil fasen tidligt. Den tast du bruger mest, da et rent greb sjældent kræver 25 sekunder.
  • Venstre pil eller r: forkast episoden og gentag den. En dårlig optagelse koster intet nu og meget senere.
  • Escape eller q: stop sessionen, afslut kodning, upload.
  • Disse virker på X11, Wayland og headless SSH: uden en global tastatur-backend læser lerobot-record de samme taster fra den kontrollerende terminal. Bogstaverne overlever langsomme SSH-forbindelser, hvor piletastsekvenser splittes.
  • Tastatur-teleoperation er anderledes og kræver en global backend: X11, Windows eller macOS med Tilgængelighed.

Hvor mange episoder, og hvordan en god en ser ud

Optageguiden foreslår mindst 50 episoder til en første opgave, cirka 10 per objektplacering. De politik-siderne lister et minimum per model, under hvilket en kørsel ikke er GPU-tiden værd.

PolitikMin. episoderDatasætformatGPU-niveauOmkostning per kørsel
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ørgsmål er, hvor mange af hvad. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) indsamlede over 40.000 demonstrationer og udførte mere end 15.000 real-world rollouts. Generalisering fulgte en omtrentlig potenslovsrelation med antallet af miljøer og objekter, og efter en tærskel per miljø eller objekt havde yderligere demonstrationer minimal effekt. På én testbænk: flyt objektet, skift belysningen, byt terningen, snarere end at gentage én optagelse.

Leder-følger teleoperation som datakilde
Fordele
  • Kontinuerlige led-trajektorier, som en servo kan reproducere, i modsætning til tastatur eller gamepad
  • Handling og tilstand deler en koordinatkonvention, så politikken lærer et mål, den kan styre direkte
  • En 25 sekunders episode plus en 10 sekunders nulstilling er cirka 100 episoder i timen
  • Operatøren mærker, at følgeren går i stå eller binder, så fejl opdages, før data er gemt
Kompromiser
  • En anden arm fordobler omtrentligt omkostningerne til dele
  • Demonstrationer arver operatørvaner; Mandlekar et al. fandt, at politikvaliteten afhænger stærkt af demonstrationskvaliteten
  • Lederen samples med loop-hastighed, så pauser bliver næsten identiske rækker, der lærer politikken at vente
  • Intet håndhæver konsistens mellem sessioner: et kamera, der er skubbet 5 cm, er et skjult distributionsskift

En god episode er kedelig: gentagelig hjemmeposition, én ting udført, afsluttet når objektet er i beholderen, opgavestreng på 25 til 50 tegn som tjeklisten anbefaler. Pick the red cube and drop it in the box er en opgavestreng; task1 er anti-mønsteret, som tjeklisten eksplicit nævner. Vage annotationer topper listen over problemer, og de er vigtigst for , hvor strengen er en modelinput, ikke et filnavn.

Fejl der stille og roligt ødelægger et datasæt

Ingen kaster en undtagelse. Alle overlever til træning og viser sig som en tabskurve, der ser fin ud, og en robot, der intet gør. Tjek mens scenen er sat op.

FejlHvordan det ser udHvor det kommer fraHvordan man fanger det
Byttede kameravisningerhåndledsbillede under den øverste nøgleindeksomfordeling efter genindsættelselerobot-find-cameras each session; by-id paths
Frosne billederdet samme billede i snesevis af rækkerkamera stopper med at levere; loop gentager det sidste billedescrub it in lerobot-dataset-viz
Tabte billederantal rækker under fps gange sekunderkøen løber over, dropper i stedet for at blokere'Encoder queue full' in the log; rows vs fps times duration
Led ved sin grænseet led fladt ved min eller maxlederens rækkevidde overstiger følgerens, eller en dårlig midterpositionper-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand
Billede og handling ude af tritpolitikken foregriber eller halterkameraer med en anden fps end loopetkeep every camera at --dataset.fps
Dødtidlange serier af identiske handlingsrækkeroperatør pausede med optageren kørendeshare of consecutive identical action rows
Uanvendelig opgavestrengtask1, demo2, testhurtig indtastningmeta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks
Tabte billeder skjuler sig

Encoderen holder en begrænset kø per kamera, 30 billeder som standard. Når den ikke kan følge med, bliver billeder droppet i stedet for blokeret: optagelsen fortsætter, og intet går ned. Du får Encoder queue full for {camera}, dropped N frame(s) og et total per kamera ved episodens afslutning. Lerobot-grænsen: omkring 5 procent manglende betyder et overbelastet system, 2 procent er forventet opstartsbelastning. Løsninger i rækkefølge: --display_data=false, sænk --dataset.encoder_threads, vcodec=h264, streaming slået fra.

En advarsel: streaming-encoding-guidens tabel angiver standardværdien som True, mens dataclassen på main læser streaming_encoding: bool = False. Dokumentation og kode er uenige, så sæt den eksplicit; lerobot logger et tip, der anbefaler det, hver gang den starter med flaget slået fra.

Tjek datasættet, før du lejer en GPU

Acceptancetesten fra dokumentationen: sammenlign videoens varighed med den episodevarighed, CLI'en rapporterede, og bekræft, at rækkeantallet svarer til fps gange varighed. 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, der afviger meget fra fps gange varighed, er en kandidat til sletning, ikke træning.

Se derefter på det. lerobot-dataset-viz afspiller en episode frame for frame med ledspor ved siden af kameravisningerne, i Rerun eller Foxglove. Ombyttede kameraer og frosne billeder dukker op på ti sekunder. Folk springer dette trin over.

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 udfører også opdeling, fletning, fjernelse af funktioner, ændring af opgaver og genberegning af statistik. Slet generøst: en dårlig episode koster én episode; at beholde den koster hver kørsel, der er trænet på den.
AY-Robots datasætmappen viser offentlige LeRobot datasæt med episodeantal og formater
Hvordan sammenlignelige datasæt dimensioneres og annoteres.

v2.1 eller v3.0: beslut før du optager

v2.1 skrev én parquet og én MP4 per episode. v3.0 samler mange episoder i delte shards og genopbygger grænser fra metadata, så info.json indeholder stiskabeloner som data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet i stedet for et episodenummer. Den bagvedliggende begrundelse er færre, større filer: hurtigere initialisering og mindre filsystemtryk i stor skala.

LeRobot v2.1LeRobot v3.0
Layoutén parquet og én MP4 per episodemange episoder per shard
Episode metadataJSONL-filerchunked parquet under meta/episodes/, via datasets-stakken
Streaming fra Hub'ennejja, via StreamingLeRobotDataset
Skrevet af lerobot 0.6.1nejja, hvad du får i dag
Læst af GR00T N1.7 og N1.5janej, skal konverteres ned
Optager i dag, træner GR00T i morgen

lerobot 0.6.1 skriver v3.0, men GR00T N1.7 og N1.5 læser v2.0 eller v2.1 og crasher på det. Bemærk retningen: src/lerobot/scripts/ indeholder convert_dataset_v21_to_v30.py og intet, der går den anden vej. Afgør dette før sessionen. Løsning: datasæt afvist 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
Hurtigt for 50 episoder. Skalering er en anden opgave: lerobots porteguide, for rå DROID til v3.0, budgetterer 7+ dages lokal behandling og omkring 400 GB.

To veje til det samme datasæt

Alt ovenfor, på din egen maskine: du ejer USB-enumereringen, ffmpeg-buildet, encoder-justeringen og kalibreringsfilerne. Den rette vej til at forstå pipelinen, køre et usædvanligt kamera-setup eller holde data lokalt.

Hvad denne rute koster

Tid: en aften per arm til at samle, en besværlig første kalibrering og en første session, du smider væk, fordi et kamera sad i den forkerte port.

Optag LeRobot-datasæt uden selv at kable pipelinen

AY-Robots desktopklienten optager episoder, kamerastrømme og ledtilstande i LeRobot-format fra en fjernstyringssession og overfører derefter datasættet til træneren.

Hent desktopklienten

Fra datasæt til politik

Halvtreds rene episoder føder hver imitationslæring kørsel her. ACT træner fra bunden på din opgave alene, omkring 80 M parametre ved cirka 20 ms pr. handlingstrin, den eneste af de fem, der er komfortabel med hurtig bevægelse. SmolVLA er omkring 450 M parametre på et 24 GB kort. GR00T N1.7 er en grundmodel med cirka 3 B parametre, hvor finjustering berører omkring 40 M parametre, kræver en A100 eller H100 og ønsker det v2.1 datasæt.

Dernæst, guiden til din kombination: ACT på SO-100, SmolVLA på SO-100 eller GR00T N1.7 på SO-100; for en første kørsel, træn din første politik er kortere. Når politikken virker på testbænken, men kollapser i det øjeblik du flytter bordet, er det et dataproblem: politik virker kun i én opsætning og indsamling af VLA-træningsdata af høj kvalitet går dybere ind i diversitet.

Hvor mange episoder har jeg virkelig brug for til en første fungerende politik?

Tredive for SmolVLA, halvtreds for ACT, Pi0.5, GR00T N1.5 og N1.7, de minimumskrav som AY-Robots trænere håndhæver. LeRobot-guiden anbefaler uafhængigt mindst 50 til en første opgave, omkring 10 pr. objektplacering. Arbejde med datascalering viste, at generalisering skalerer med miljøer og objekter snarere end antal demonstrationer, så hundrede optagelser af én scene er værre end halvtreds fordelt på fem placeringer.

Har jeg brug for en lederarm, eller kan jeg teleoperere med et tastatur?

lerobot leverer tastatur- og gamepad-teleoperatorer, så en lederarm er ikke strengt nødvendig, men den er stærkt at foretrække: leder-følger giver kontinuerlige ledbaner i den koordinatkonvention, der er brugt i den optagede handling, mens tastaturinput producerer trinvis bevægelse, som en politik lærer som ryk. Tastaturteleoperation kræver også en global nøgle-backend, så den fejler på Wayland og headless systemer.

Kan jeg optage på en Raspberry Pi eller en lille mini-pc?

Ja, med justering. Streaming-encoding-guiden har en lavressourcekategori, der dækker moderne 4-kernede maskiner og Raspberry Pi 5, og placerer to kameraer ved 640x480 og 30 fps i sin 'kræver-noget-justering'-kolonne. Dets råd: stop encoderen fra at konkurrere med optagelsesløkken via --dataset.rgb_encoder.vcodec=h264 og --dataset.streaming_encoding=false. Den vurderer to kameraer ved 640x480 til omkring 55 millioner pixels pr. sekund og to ved 1920x1080 til omkring 373 millioner.

Hvordan ved jeg, om det datasæt, jeg lige har optaget, faktisk er sundt?

Tre billige tjek. Sammenlign hver episodes videovarighed med den varighed, CLI'en rapporterede, og bekræft, at rækkeantallet er lig med fps gange den varighed, pr. episode snarere end totalt; det er den accepttest, lerobots encoding-guide giver. Læs ds.meta.stats, hvor et led, hvis min er lig med dets max, aldrig bevægede sig. Afspil derefter to eller tre episoder i lerobot-dataset-viz, den eneste måde, hvorpå byttede visninger og frosne billeder viser sig. Ved tabte billeder trækker guiden grænsen ved cirka 5 procent manglende; omkring 2 procent er normal forbigående belastning, ofte kun ved opstart.

Mit træningsjob afviste datasættet som v3.0. Hvad nu?

GR00T N1.7 og N1.5 læser LeRobot v2.0 eller v2.1 og crasher på v3.0, hvilket er hvad lerobot 0.6.1 optager. Enten afklar formatet før træning, eller brug en politik, der læser v3.0 nativt: Pi0.5, SmolVLA eller ACT. lerobot leverer en v2.1 til v3.0 konverter og intet i den modsatte retning.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started