De AY-Robots tutorialpagina voor het opnemen van je eerste LeRobot-dataset met een SO-100 arm
LeRobotSO-100Dataset OpnameTeleoperatieImitatie Leren

Neem je eerste LeRobot-dataset op met een SO-100

AY-Robots ResearchAugust 23, 202616 min leestijd

Neem een bruikbare LeRobot-dataset op met een SO-100: kalibratie, leader-follower teleoperatie, de echte lerobot-record flags en standaardinstellingen, camera-instelling, aantal afleveringen en de defecten die een run verpesten.

Een SO-100 volger, een leiderarm van hetzelfde ontwerp en twee USB-camera's kunnen een beleid in een middag verfijnen. Dezelfde opstelling kan even gemakkelijk zestig afleveringen produceren die er gezond uitzien in een bestandsbrowser en een GPU-run van zes uur verspillen. Het verschil zit zelden in het model; het is wat er gebeurde tussen de servo's en het parquet-bestand.

Hier is de handmatige route, dan de kortere. Elke opdracht is van lerobot 0.6.1, uitgebracht op 3 augustus 2026 en actueel op PyPI. Het is verplaatst naar console entry points, dus tutorials die python lerobot/scripts/control_robot.py uitvoeren, beschrijven een bestand dat niet langer bestaat.

De korte versie

  • lerobot 0.6.1 neemt v3.0 op; GR00T N1.7 en N1.5 willen v2.1. Bepaal het formaat voordat u opneemt.
  • Vier commando's: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Gebruik dezelfde --robot.id en --teleop.id van de kalibratie in de opnamesessie.
  • Standaardinstellingen: 30 fps, 60 s per aflevering, 60 s reset, 50 afleveringen, ongeveer 100 minuten werkelijke tijd.
  • Minimale afleveringen hier: 30 voor SmolVLA, 50 voor de rest.
  • Diversiteit verslaat volume. Datasets sterven door vier dingen: verwisselde camera-indices, weggevallen of bevroren frames, een gewricht dat op zijn limiet staat, een onleesbare taakstring.

Wat een opnamesessie vastlegt

Een LeRobot dataset is geen map met video's, maar een tijdgeïndexeerde tabel met bijbehorende video: elke control-loop tick schrijft één rij met de gecommandeerde actie, de toestand die de volger bereikte, één frame per camera, een tijdstempel en indexen. Het beleid ziet alleen die kolommen. Het schema van lerobot/svla_so100_pickplace, gelezen uit zijn meta/info.json.

FunctiedtypeVormWat het is
actionfloat32[6]gewrichtsdoelen van de leiderarm
observation.statefloat32[6]gewrichtsposities die de volger bereikte
observation.images.topvideo[480, 640, 3]scènecamera, MP4 (av1 hier)
observation.images.wristvideo[480, 640, 3]pols camera, zelfde frequentie
timestampfloat32[1]seconden sinds start van de aflevering
frame_index, episode_index, index, task_indexint64[1]automatisch ingevulde administratie

De gewrichten zijn main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll en main_gripper: de zes vrijheidsgraden van de SO-100. Actie en toestand delen een vorm omdat leider-volger teleoperatie een doel en de één stap later bereikte positie registreert. Die kloof is informatie: waar de arm vocht tegen de zwaartekracht of een vastzittend object. Die strings zijn van die dataset. Een sessie opgenomen met 0.6.1 vandaag schrijft shoulder_pan.pos tot en met gripper.pos, ids 1 tot 6 op de bus: dezelfde zes gewrichten, verschillende sleutels, wat van belang is zodra een configuratie een feature bij naam aanspreekt.

Een maatstaf uit een echte dataset

Die dataset bevat 50 afleveringen en 19.631 frames met 30 fps: ongeveer 393 frames, of 13 seconden, per aflevering. Als die van jou gemiddeld een minuut duren, doe je iets moeilijkers of neem je dode tijd op aan beide uiteinden.

De AY-Robots woordenlijstvermelding voor het LeRobot datasetformaat, met de directory-indeling en metadata bestanden
Wat zich bevindt in data/, videos/ en meta/, en welk beleid welke versie leest.

Wat je nodig hebt op de werkbank

ItemDetailOpmerking
VolgerarmSO-100, zes Feetech STS3215 servo'songeveer 110 tot 150 EUR aan onderdelen
Leiderarmeen tweede SO-100, tandwielen verwijderdtandwielen verwijderd van alle zes leidermotoren: alleen encoder, minder wrijving
Voedingafgestemd op de 7.4 V STS3215 variant in de stuklijstzie de waarschuwing hieronder
Camera'stwee USB-camera's, 640x480 bij 30 fpséén scènebeeld, één op de pols
HostPython 3.12 of nieuwer, ffmpegrequires-python >= 3.12
Hub-accountHugging Face schrijftokenoptioneel met --dataset.push_to_hub=false
7.4 V, geen 12 V

De STS3215 is verkrijgbaar in twee versies: de SO-ARM100 README beoordeelt de 7.4 V versie op 16.5 kg.cm blokkeerkoppel gemeten bij 6 V en de 12 V versie op 30 kg.cm, en merkt op dat het kiezen van de 12 V motoren ook betekent dat je een 12 V 5 A+ voeding moet kopen in plaats van de 5 V versie. De stuklijst vermeldt 7.4 V servo's. Het voeden van 12 V aan servo's die beoordeeld zijn voor 7.4 V vernietigt ze, dus lees het motorlabel voordat je iets aansluit. Servo reageert niet.

Als de arm nog niet is gebouwd, is dat een aparte avond: begin bij SO-100 aan de slag en de complete SO-100 installatiegids. Als je nog niets hebt gekocht, lees dan eerst de SO-100 versus SO-101 vergelijking eerst: de SO-101 is de nieuwere revisie met verbeterde bedrading en zonder de stap van het verwijderen van tandwielen, en de opnameworkflow is identiek.

Installeer 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 print een systeemoverzicht, inclusief de ffmpeg-versie die het kan vinden op PATH.

Extra's zijn voor de meeste mensen het lastigst. pip install lerobot installeert alleen de kern ML-afhankelijkheden, niets dat met een robot communiceert. Koch-armen hebben dynamixel in plaats van feetech. Als je shell nog nooit van lerobot-record heeft gehoord, is dit de reden.

Poorten, motor-ID's en kalibratie

Drie eenmalige stappen staan tussen onderdelen en een werkende teleop-lus. zorgt ervoor dat een beleid dat op jouw arm is getraind, op die van iemand anders kan draaien, door ruwe encoderwaarden te koppelen aan een gedeelde gewrichtsconventie.

  1. 1
    Vind de USB-poort van elke arm

    Voer het uit met beide armen aangesloten, koppel de arm die je identificeert los wanneer daarom wordt gevraagd, en noteer welke poort verdwijnt. Op Linux heb je mogelijk sudo chmod 666 /dev/ttyACM0 nodig.

    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
    Schrijf motor-ID's en baudrates

    ID's worden één motor tegelijk geschreven, en de documentatie is strikt over hoe: sluit precies één motor aan op de controllerkaart, nog niet doorgelust naar een andere. Het script loopt de keten achterwaarts af, vraagt eerst naar de grijper en geeft deze ID 6, dan wrist_roll als 5, tot aan shoulder_pan als 1. Doe dit vóór de montage.

    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
    Kalibreer beide armen

    Beweeg elk gewricht naar het midden van zijn bereik, druk op Enter en beweeg vervolgens elk gewricht door zijn volledige bereik. De id wordt de profielbestandsnaam.

    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
    Teleopereer vóór het opnemen van iets

    De acceptatietest voor al het bovenstaande. Als teleoperatie schokkerig is, gespiegeld, of als één gewricht niet volgt, wordt dat vastgelegd in 50 episodes.

    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
Waar kalibratie terechtkomt, en waarom de id belangrijk is

Profielen gaan naar $HF_LEROBOT_CALIBRATION, standaard ~/.cache/huggingface/lerobot/calibration, en de id is de opzoekingssleutel. Geef lerobot-record een gekalibreerde id en het biedt Enter aan om het profiel te hergebruiken of c om het opnieuw te doen. Geef het een onbekende id en er is geen bestand, dus het start de kalibratie midden in de sessie.

Camera's bepalen wat het beleid waarneemt

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
Voer dit elke sessie uit: de documentatie waarschuwt dat deze identificatiegegevens kunnen veranderen na een herstart of een heraansluiting, afhankelijk van het besturingssysteem.

Twee weergaven, en hun positie is belangrijk: een vaste scènecamera die de werkruimte bestrijkt, en een polscamera dicht bij de eindeffector die laat zien wat de grijper gaat aanraken. De LeRobot community-datasets checklist vraagt om bij voorkeur twee weergaven van 480x640 / 720p of beter, een statische achtergrond, neutrale stabiele verlichting, en de leiderarm en menselijke ledematen buiten beeld. De opnamegids voegt de vuistregel toe: je moet de taak zelf kunnen uitvoeren door alleen naar de camerabeelden te kijken.

De camera-index is geen stabiele identiteit

OpenCV-indices komen voort uit de enumeratievolgorde, dus een herstart of heraansluiting kan ervoor zorgen dat index 0 en 2 van plaats wisselen en de polsweergave voor een hele sessie bovenaan komt te staan. lerobot zegt het zelf: de cameraklasse accepteert zowel een apparaatpad als een geheel getal, en waarschuwt dat indices onstabiel zijn bij herstarts of poortwijzigingen, vooral op Linux. Wijs index_or_path naar de udev-symlink onder /dev/v4l/by-id/, die het apparaat volgt in plaats van de enumeratievolgorde. Dit is de meest voorkomende manier waarop een dataset intern inconsistent wordt, en training kan dit niet herstellen. Camera niet gedetecteerd.

Het record-commando en elke vlag

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
De cameradict is één shell-gequote string; de geneste accolades zijn geen shell-syntaxis.

De onderstaande standaardwaarden komen uit src/lerobot/configs/dataset.py op main, niet uit een tutorial. Verschillende zijn niet wat mensen aannemen.

VlagStandaardwaardeWat het doet
--dataset.repo_idemptynaam; tijdstempel wordt standaard toegevoegd
--dataset.single_taskemptytaakstring opgeslagen bij elke aflevering
--dataset.root$HF_LEROBOT_HOME/repo_idschrijfpad, standaard ~/.cache/huggingface/lerobot/
--dataset.fps30regellusfrequentie en dataset framerate
--dataset.episode_time_s60seconden voordat een aflevering automatisch verdergaat
--dataset.reset_time_s60scène reset; arm beweegt, niets opgeslagen
--dataset.num_episodes50afleveringen opgenomen in deze sessie
--dataset.push_to_hubtrueuploaden aan het einde van de sessie; false blijft lokaal
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablecoderen tijdens opname; stel dit expliciet in
--dataset.encoder_queue_maxsize30gebufferde frames per camera, ~1 s bij 30 fps
--dataset.encoder_threadsnull (codec decides)threads per encoder; lager instellen als de opname stottert
--dataset.no_stampfalsehoud repo_id exact zoals getypt
--resumefalsetoevoegen aan een bestaande dataset; vereist --dataset.root
Twee vlaggen die onverwacht een uur kosten

Uw dataset heet niet wat u hebt ingevoerd. lerobot voegt een datum-tijd-tag toe, dus so100_pick_cube wordt so100_pick_cube_20260823_141530. Gebruik --dataset.no_stamp=true voor een stabiele naam. Resume telt toevoegingen, geen totalen. Met --resume=true telt --dataset.num_episodes extra afleveringen en wordt --dataset.root verplicht. Vraag om 50 op een dataset van 30 afleveringen en u krijgt er 80.

Toetsenbordbediening tijdens een sessie

  • Pijl naar rechts of n: beëindig de aflevering of reset de fase vroegtijdig. De toets die u het meest gebruikt, omdat een schone greep zelden 25 seconden nodig heeft.
  • Pijl naar links of r: verwijder de aflevering en doe het opnieuw. Een slechte opname kost nu niets en later veel.
  • Escape of q: stop de sessie, voltooi de codering, upload.
  • Deze werken op X11, Wayland en headless SSH: zonder globale toetsenbackend leest lerobot-record dezelfde toetsen van de controlerende terminal. De letters overleven trage SSH-verbindingen, waar pijlenreeksen splitsen.
  • Toetsenbord teleoperatie is anders en heeft wel een globale backend nodig: X11, Windows, of macOS met Toegankelijkheid.

Hoeveel afleveringen, en hoe een goede eruitziet

De opnamegids stelt minstens 50 afleveringen voor voor een eerste taak, ongeveer 10 per objectlocatie. De beleidspagina's vermelden een minimum per model, waaronder een run de GPU-tijd niet waard is.

BeleidMin. afleveringenDatasetformaatGPU-klasseKosten per run
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

De betere vraag is hoeveel van wat. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) verzamelden meer dan 40.000 demonstraties en voerden meer dan 15.000 real-world rollouts uit. Generalisatie volgde een ruwweg machtswetrelatie met het aantal environments and objects, en voorbij een drempel per omgeving of object hadden extra demonstraties een minimaal effect. Op één testbank: verplaats het object, verander de belichting, verwissel de kubus, in plaats van één opname te herhalen.

Leader-follower teleoperatie als databron
Voordelen
  • Continue gewrichtstrajecten die een servo kan reproduceren, in tegenstelling tot toetsenbord of gamepad
  • Actie en toestand delen een coördinatenconventie, zodat het beleid een doel leert dat het direct kan aansturen
  • Een aflevering van 25 seconden plus een reset van 10 seconden is ruwweg 100 afleveringen per uur
  • De operator voelt de volger vastlopen of blokkeren, zodat fouten aan het licht komen voordat gegevens worden vastgelegd
Afwegingen
  • Een tweede arm verdubbelt ruwweg de kosten van onderdelen
  • Demonstraties erven operatorgewoonten; Mandlekar et al. vonden dat de beleidskwaliteit sterk afhangt van de demonstratiekwaliteit
  • De leider wordt gesampled met de lusfrequentie, dus pauzes worden bijna identieke rijen die het beleid leren wachten
  • Niets dwingt consistentie af tussen sessies: een camera die 5 cm is verschoven, is een verborgen distributieverschuiving

Een goede episode is saai: herhaalbare thuispositie, één ding gedaan, beëindigd zodra het object in de bak ligt, taakstring van 25 tot 50 tekens zoals de checklist aanbeveelt. Pak de rode kubus en leg deze in de doos is een taakstring; task1 is het anti-patroon dat de checklist expliciet noemt. Vage annotaties staan bovenaan de lijst met problemen, en ze zijn het belangrijkst voor visie-taal-actiemodellen, waarbij de string een modelinvoer is, niet een bestandsnaam.

Defecten die stilletjes een dataset ruïneren

Geen enkele werpt een uitzondering op. Ze overleven allemaal de training en manifesteren zich als een verliescurve die er goed uitziet en een robot die niets doet. Controleer terwijl de scène is opgezet.

DefectHoe het eruitzietWaar het vandaan komtHoe het te detecteren
Verwisselde camerabeeldenpolsbeeld onder de bovenste sleutelindexherindeling na opnieuw aansluitenlerobot-find-cameras elke sessie; paden op basis van ID
Bevroren framesdezelfde afbeelding voor tientallen rijencamera stopt met leveren; lus herhaalt het laatste framedoorloop het in lerobot-dataset-viz
Gedropte framesrijtelling onder fps maal secondenwachtrij loopt over, dropt in plaats van blokkeert'Encoder queue full' in het logboek; rijen versus fps maal duur
Gewricht op zijn limietéén gewricht vlak op min of maxbereik van de leider overschrijdt dat van de volger, of een slechte middenpositiemin/max per gewricht in ds.meta.stats; lerobot-find-joint-limits vooraf
Afbeelding en actie niet synchroonhet beleid anticipeert of loopt achtercamera's met een andere fps dan de lushoud elke camera op --dataset.fps
Dode tijdlange reeksen identieke actierijenoperator gepauzeerd terwijl de recorder liepaandeel van opeenvolgende identieke actierijen
Onbruikbare taakstringtask1, demo2, testsnel typenmeta/tasks.parquet in v3.0 (het was meta/tasks.jsonl in v2.1); repareren met lerobot-edit-dataset modify_tasks
Gedropte frames verbergen zichzelf

De encoder heeft een begrensde wachtrij per camera, standaard 30 frames. Wanneer deze het niet kan bijhouden, worden frames gedropt in plaats van geblokkeerd: de opname gaat door en niets crasht. Je krijgt Encoder queue full for {camera}, dropped N frame(s) en een totaal per camera aan het einde van de episode. De lerobot-drempel: ongeveer 5 procent ontbrekend betekent een overbelast systeem, 2 procent is de verwachte opstartbelasting. Oplossingen in volgorde: --display_data=false, verlaag --dataset.encoder_threads, vcodec=h264, streaming uit.

Eén kanttekening: de tabel van de streaming-encoding gids vermeldt de standaardwaarde als True, terwijl de dataclass op main leest streaming_encoding: bool = False. Documentatie en code komen niet overeen, dus stel het expliciet in; lerobot logt een hint die dit aanbeveelt wanneer het start met de vlag uitgeschakeld.

Controleer de dataset voordat je een GPU huurt

De acceptatietest uit de documentatie: vergelijk de videoduur met de episode-duur die de CLI rapporteerde, en bevestig dat het aantal rijen gelijk is aan fps maal duur. Per episode, niet op het totaal.

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"])
Een aflevering die ver afwijkt van fps maal duur is een kandidaat voor verwijdering, niet voor training.

Bekijk het dan. lerobot-dataset-viz speelt een aflevering frame voor frame af met gewrichtstraceringen naast de camerabeelden, in Rerun of Foxglove. Verwisselde camera's en bevroren frames verschijnen binnen tien seconden. Mensen slaan deze stap 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 doet ook splitsen, samenvoegen, features verwijderen, taken aanpassen en statistieken herberekenen. Verwijder royaal: een slechte aflevering kost één aflevering; deze behouden kost elke run die erop getraind is.
De AY-Robots dataset directory met openbare LeRobot datasets, inclusief afleveringentellingen en formaten.
Hoe vergelijkbare datasets worden geschaald en geannoteerd.

v2.1 of v3.0: beslis voordat u opneemt

v2.1 schreef één parquet en één MP4 per aflevering. v3.0 voegt veel afleveringen samen in gedeelde shards en herbouwt grenzen vanuit metadata, dus info.json bevat padtemplates zoals data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet in plaats van een afleveringsnummer. De onderliggende rechtvaardiging is minder, grotere bestanden: snellere initialisatie en minder druk op het bestandssysteem op schaal.

LeRobot v2.1LeRobot v3.0
Indelingéén parquet en één MP4 per afleveringveel afleveringen per shard
AfleveringsmetadataJSONL-bestandengechunked parquet onder meta/episodes/, via de datasets-stack
Streamen vanaf de Hubneeja, via StreamingLeRobotDataset
Geschreven door lerobot 0.6.1neeja, wat u vandaag krijgt
Gelezen door GR00T N1.7 en N1.5janee, moet worden geconverteerd
Vandaag opnemen, morgen GR00T trainen

lerobot 0.6.1 schrijft v3.0, maar GR00T N1.7 en N1.5 lezen v2.0 of v2.1 en crashen erop. Let op de reisrichting: src/lerobot/scripts/ bevat convert_dataset_v21_to_v30.py en niets dat de andere kant op gaat. Regel dit vóór de sessie. Oplossing: dataset afgewezen als 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
Snel voor 50 afleveringen. Schaal is een andere taak: de porteringsgids van lerobot, voor ruwe DROID naar v3.0, begroot 7+ dagen lokale verwerking en ongeveer 400 GB.

Twee routes naar dezelfde dataset

Alles hierboven, op je eigen machine: jij bent eigenaar van de USB-enumeratie, de ffmpeg-build, de encoder-tuning en de kalibratiebestanden. De juiste route om de pijplijn te begrijpen, een ongebruikelijke camera-opstelling te draaien, of gegevens lokaal te houden.

Wat deze route kost

Tijd: een avond per arm om te monteren, een lastige eerste kalibratie, en een eerste sessie die je weggooit omdat een camera in de verkeerde sleuf zat.

Neem LeRobot-datasets op zonder zelf de pijplijn te bedraden

De AY-Robots desktopclient neemt afleveringen, camerastreams en gewrichtstoestanden in LeRobot-formaat op vanuit een teleoperatiesessie, en geeft de dataset vervolgens door aan de trainer.

Download de desktopclient

Van dataset naar beleid

Vijftig schone episodes voeden elke uitvoering hier. traint vanaf nul aan uw taak alleen, ongeveer 80 M parameters met ruwweg 20 ms per actiestap, de enige van de vijf die comfortabel is met snelle beweging. is ongeveer 450 M parameters op een 24 GB kaart. is een ruwweg 3 B parameter fundamenteel model waar ongeveer 40 M parameters aanraakt, een A100 of H100 nodig heeft, en die v2.1 dataset wil.

Vervolgens, de gids voor uw combinatie: , of ; voor een eerste uitvoering, is korter. Wanneer het beleid op de testbank werkt maar instort zodra u de tafel beweegt, is dat een dataprobbleem: en gaan dieper in op diversiteit.

Hoeveel episodes heb ik echt nodig voor een eerste werkend beleid?

Dertig voor SmolVLA, vijftig voor ACT, Pi0.5, GR00T N1.5 en N1.7, de minima die de AY-Robots trainers afdwingen. De LeRobot gids beveelt onafhankelijk ten minste 50 aan voor een eerste taak, ongeveer 10 per objectlocatie. Werk aan dataschaling toonde aan dat generalisatie schaalt met omgevingen en objecten in plaats van met het aantal demonstraties, dus honderd opnames van één scène is slechter dan vijftig over vijf plaatsingen.

Heb ik een leiderarm nodig, of kan ik teleopereren met een toetsenbord?

lerobot levert toetsenbord- en gamepad-teleoperators, dus een leiderarm is niet strikt noodzakelijk, maar het is sterk de voorkeur: leider-volger geeft continue gewrichtstrajecten in de coördinatenconventie van de opgenomen actie, terwijl toetsenbordinvoer stapsgewijze beweging produceert die een beleid leert als schok. Toetsenbord-teleoperatie heeft ook een globale toetsen-backend nodig, dus het faalt op Wayland en headless.

Kan ik opnemen op een Raspberry Pi of een kleine mini-pc?

Ja, met afstemming. De streaming-encoding gids heeft een laag-resource segment dat moderne 4-core machines en de Raspberry Pi 5 omvat, en plaatst twee camera's op 640x480 en 30 fps in de kolom 'vereist enige afstemming'. Het advies: voorkom dat de encoder concurreert met de opnameloop, via --dataset.rgb_encoder.vcodec=h264 en --dataset.streaming_encoding=false. Het beoordeelt twee camera's op 640x480 als ongeveer 55 miljoen pixels per seconde en twee op 1920x1080 als ongeveer 373 miljoen.

Hoe weet ik of de dataset die ik zojuist heb opgenomen daadwerkelijk gezond is?

Drie eenvoudige controles. Vergelijk de videoduur van elke episode met de duur die de CLI rapporteerde en bevestig dat het aantal rijen gelijk is aan fps maal die duur, per episode in plaats van in totaal; dat is de acceptatietest die de encoding gids van lerobot geeft. Lees ds.meta.stats, waar een gewricht waarvan het minimum gelijk is aan het maximum nooit bewoog. Speel vervolgens twee of drie episodes af in lerobot-dataset-viz, de enige manier waarop verwisselde weergaven en bevroren frames verschijnen. Bij weggevallen frames trekt de gids de grens bij ruwweg 5 procent ontbrekend; ongeveer 2 procent is normale tijdelijke belasting, vaak alleen bij het opstarten.

Mijn trainingstaak heeft de dataset als v3.0 afgewezen. Wat nu?

GR00T N1.7 en N1.5 lezen LeRobot v2.0 of v2.1 en crashen op v3.0, wat lerobot 0.6.1 opneemt. Bepaal het formaat vóór de training, of gebruik een beleid dat v3.0 native leest: Pi0.5, SmolVLA of ACT. lerobot levert een v2.1 naar v3.0 converter en niets in omgekeerde richting.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started