
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.
| Functie | dtype | Vorm | Wat het is |
|---|---|---|---|
| action | float32 | [6] | gewrichtsdoelen van de leiderarm |
| observation.state | float32 | [6] | gewrichtsposities die de volger bereikte |
| observation.images.top | video | [480, 640, 3] | scènecamera, MP4 (av1 hier) |
| observation.images.wrist | video | [480, 640, 3] | pols camera, zelfde frequentie |
| timestamp | float32 | [1] | seconden sinds start van de aflevering |
| frame_index, episode_index, index, task_index | int64 | [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.
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.

Wat je nodig hebt op de werkbank
| Item | Detail | Opmerking |
|---|---|---|
| Volgerarm | SO-100, zes Feetech STS3215 servo's | ongeveer 110 tot 150 EUR aan onderdelen |
| Leiderarm | een tweede SO-100, tandwielen verwijderd | tandwielen verwijderd van alle zes leidermotoren: alleen encoder, minder wrijving |
| Voeding | afgestemd op de 7.4 V STS3215 variant in de stuklijst | zie de waarschuwing hieronder |
| Camera's | twee USB-camera's, 640x480 bij 30 fps | één scènebeeld, één op de pols |
| Host | Python 3.12 of nieuwer, ffmpeg | requires-python >= 3.12 |
| Hub-account | Hugging Face schrijftoken | optioneel met --dataset.push_to_hub=false |
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
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-infoExtra'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.
- 1Vind 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/ttyACM0nodig.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. - 2Schrijf 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.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Kalibreer beide armen
Beweeg elk gewricht naar het midden van zijn bereik, druk op Enter en beweeg vervolgens elk gewricht door zijn volledige bereik. De
idwordt de profielbestandsnaam.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 - 4Teleopereer 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.
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
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
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.0Twee 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.
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
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=2De onderstaande standaardwaarden komen uit src/lerobot/configs/dataset.py op main, niet uit een tutorial. Verschillende zijn niet wat mensen aannemen.
| Vlag | Standaardwaarde | Wat het doet |
|---|---|---|
| --dataset.repo_id | empty | naam; tijdstempel wordt standaard toegevoegd |
| --dataset.single_task | empty | taakstring opgeslagen bij elke aflevering |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | schrijfpad, standaard ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | regellusfrequentie en dataset framerate |
| --dataset.episode_time_s | 60 | seconden voordat een aflevering automatisch verdergaat |
| --dataset.reset_time_s | 60 | scène reset; arm beweegt, niets opgeslagen |
| --dataset.num_episodes | 50 | afleveringen opgenomen in deze sessie |
| --dataset.push_to_hub | true | uploaden aan het einde van de sessie; false blijft lokaal |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | coderen tijdens opname; stel dit expliciet in |
| --dataset.encoder_queue_maxsize | 30 | gebufferde frames per camera, ~1 s bij 30 fps |
| --dataset.encoder_threads | null (codec decides) | threads per encoder; lager instellen als de opname stottert |
| --dataset.no_stamp | false | houd repo_id exact zoals getypt |
| --resume | false | toevoegen aan een bestaande dataset; vereist --dataset.root |
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.
| Beleid | Min. afleveringen | Datasetformaat | GPU-klasse | Kosten per run |
|---|---|---|---|---|
| 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 |
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.
- 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
- 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.
| Defect | Hoe het eruitziet | Waar het vandaan komt | Hoe het te detecteren |
|---|---|---|---|
| Verwisselde camerabeelden | polsbeeld onder de bovenste sleutel | indexherindeling na opnieuw aansluiten | lerobot-find-cameras elke sessie; paden op basis van ID |
| Bevroren frames | dezelfde afbeelding voor tientallen rijen | camera stopt met leveren; lus herhaalt het laatste frame | doorloop het in lerobot-dataset-viz |
| Gedropte frames | rijtelling onder fps maal seconden | wachtrij 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 max | bereik van de leider overschrijdt dat van de volger, of een slechte middenpositie | min/max per gewricht in ds.meta.stats; lerobot-find-joint-limits vooraf |
| Afbeelding en actie niet synchroon | het beleid anticipeert of loopt achter | camera's met een andere fps dan de lus | houd elke camera op --dataset.fps |
| Dode tijd | lange reeksen identieke actierijen | operator gepauzeerd terwijl de recorder liep | aandeel van opeenvolgende identieke actierijen |
| Onbruikbare taakstring | task1, demo2, test | snel typen | meta/tasks.parquet in v3.0 (het was meta/tasks.jsonl in v2.1); repareren met lerobot-edit-dataset modify_tasks |
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.
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"])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.
# 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 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.1 | LeRobot v3.0 | |
|---|---|---|
| Indeling | één parquet en één MP4 per aflevering | veel afleveringen per shard |
| Afleveringsmetadata | JSONL-bestanden | gechunked parquet onder meta/episodes/, via de datasets-stack |
| Streamen vanaf de Hub | nee | ja, via StreamingLeRobotDataset |
| Geschreven door lerobot 0.6.1 | nee | ja, wat u vandaag krijgt |
| Gelezen door GR00T N1.7 en N1.5 | ja | nee, moet worden geconverteerd |
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.
# 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=falseTwee 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.
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.
De desktopclient neemt datasets, afleveringen, camerastreams en gewrichtstoestanden in LeRobot-formaat op, rechtstreeks uit een teleoperatie sessie. Die dataset voedt het trainingsformulier: kies model, dataset en hyperparameters, en de backend huurt een GPU ter grootte van het VRAM van het model, draait de trainer en schrijft checkpoints naar objectopslag.
- 1Installeer de client
Op de downloadpagina; installatie in de clientdocumentatie.
- 2Opnemen vanuit een teleoperatiesessie
Bestuur de arm; de client schrijft afleveringen in LeRobot-formaat. Walkthrough: neem je eerste dataset op.
- 3Of breng je eigen data mee
Een dataset kan ook afkomstig zijn van een Hugging Face repo id of je eigen machine: datasetdocumentatie, openbare directory.
- 4Train en voer het terug uit
Kies de combinatie op de trainingsmatrix, en voer vervolgens het beleid terug uit op de arm. Ongeveer 1 tot 3 USD op de 24 GB-laag, 4 tot 12 op de A100- of H100-laag.
Het assembleert of kalibreert je arm niet, en het repareert geen defecte aflevering, dus de inspectiestap blijft van toepassing. Er is ook een harde limiet aan de andere kant: voor snelle taken moet inferentie naast de servo's plaatsvinden. De besturingslus draait 20 tot 485 ms per actiestap, en roundtrips via het openbare internet maken van een werkend beleid een aarzelend beleid.
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 desktopclientVan 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.
Sources
- LeRobot: Imitatie Leren op Robots in de Echte Wereld
- LeRobot: SO-100 assemblage, motorinstelling en kalibratie
- LeRobot: Camera's en lerobot-find-cameras
- LeRobot: Installatie en de extras matrix
- LeRobotDataset v3.0: lay-out en v2.1 migratie
- LeRobot: Streaming video-codering en verloren frames
- LeRobot: Porten van grote datasets naar v3.0 (DROID)
- lerobot v0.6.1 release, 3 augustus 2026
- DatasetRecordConfig: de echte opname-standaardinstellingen
- lerobot_record.py: opnamelus en hervatting
- TheRobotStudio/SO-ARM100: build repo en stuklijst
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 afleveringen, 19.631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), Wat Belangrijk Is bij Leren van Offline Menselijke Demonstraties
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