
Nehmen Sie einen nutzbaren LeRobot-Datensatz mit einem SO-100 auf: Kalibrierung, Leader-Follower-Teleoperation, die echten lerobot-record Flags und Standardwerte, Kamera-Setup, Episodenanzahl und die Defekte, die einen Durchlauf ruinieren.
Ein SO-100 Follower, ein Leader-Arm desselben Designs und zwei USB-Kameras können eine Policy an einem Nachmittag feinabstimmen. Derselbe Prüfstand kann ebenso leicht sechzig Episoden erzeugen, die in einem Dateibrowser gesund aussehen und einen sechsstündigen GPU-Lauf verschwenden. Der Unterschied liegt selten am Modell; er liegt daran, was zwischen den Servos und der Parquet-Datei geschah.
Hier ist der manuelle Weg, dann der kürzere. Jeder Befehl stammt von lerobot 0.6.1, veröffentlicht am 3. August 2026 und aktuell auf PyPI. Es wurde auf Konsolen-Einstiegspunkte umgestellt, daher beschreiben Tutorials, die python lerobot/scripts/control_robot.py ausführen, eine Datei, die nicht mehr existiert.
Die Kurzversion
- •lerobot 0.6.1 zeichnet v3.0 auf; GR00T N1.7 und N1.5 benötigen v2.1. Legen Sie das Format fest, bevor Sie die Aufnahme starten.
- •Vier Befehle: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Übernehmen Sie dieselben --robot.id und --teleop.id von der Kalibrierung in die Aufnahmesitzung.
- •Standardwerte in der Praxis: 30 fps, 60 s pro Episode, 60 s Reset, 50 Episoden, etwa 100 Minuten Echtzeit.
- •Mindestanzahl Episoden hier: 30 für SmolVLA, 50 für den Rest.
- •Vielfalt schlägt Quantität. Datensätze sterben an vier Dingen: vertauschten Kameraindizes, verlorenen oder eingefrorenen Frames, einem Gelenk, das an seiner Grenze geparkt ist, einem unlesbaren Aufgaben-String.
Was eine Aufnahmesitzung erfasst
Ein LeRobot-Datensatz ist kein Ordner von Videos, sondern eine zeitlich indizierte Tabelle mit angehängtem Video: Jeder Steuerzyklus-Tick schreibt eine Zeile, die die befohlene Aktion, den vom Follower erreichten Zustand, einen Frame pro Kamera, einen Zeitstempel und Indizes enthält. Die Policy sieht nur diese Spalten. Das Schema von lerobot/svla_so100_pickplace, gelesen aus seiner meta/info.json.
| Merkmal | Datentyp | Form | Beschreibung |
|---|---|---|---|
| action | float32 | [6] | Gelenkziele vom Leader-Arm |
| observation.state | float32 | [6] | Gelenkpositionen, die der Follower erreicht hat |
| observation.images.top | video | [480, 640, 3] | Szenenkamera, MP4 (hier av1) |
| observation.images.wrist | video | [480, 640, 3] | Handgelenkkamera, gleiche Rate |
| timestamp | float32 | [1] | Sekunden seit Episodenstart |
| frame_index, episode_index, index, task_index | int64 | [1] | Automatisch ausgefüllte Buchhaltung |
Die Gelenke sind main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll und main_gripper: die sechs Freiheitsgrade des SO-100. Aktion und Zustand teilen sich eine Form, da die Leader-Follower-Teleoperation ein Ziel und die einen Schritt später erreichte Position aufzeichnet. Diese Lücke ist Information: wo der Arm gegen die Schwerkraft oder ein festsitzendes Objekt gekämpft hat. Diese Zeichenketten gehören zu diesem Datensatz. Eine heute mit 0.6.1 aufgezeichnete Sitzung schreibt shoulder_pan.pos bis gripper.pos, IDs 1 bis 6 auf dem Bus: dieselben sechs Gelenke, unterschiedliche Schlüssel, was wichtig wird, sobald eine Konfiguration ein Merkmal namentlich anspricht.
Dieser Datensatz enthält 50 Episoden und 19.631 Frames bei 30 fps: etwa 393 Frames oder 13 Sekunden pro Episode. Wenn Ihre durchschnittlich eine Minute dauern, tun Sie etwas Schwierigeres oder zeichnen an beiden Enden Leerlaufzeiten auf.

Was Sie auf dem Prüfstand benötigen
| Element | Detail | Hinweis |
|---|---|---|
| Folgearm | SO-100, sechs Feetech STS3215 Servos | etwa 110 bis 150 EUR an Teilen |
| Führungsarm | ein zweiter SO-100, Zahnräder entfernt | Zahnräder von allen sechs Führungsmotoren entfernt: nur Encoder, weniger Reibung |
| Stromversorgung | abgestimmt auf die 7.4 V STS3215 Variante in der Stückliste | siehe Warnung unten |
| Kameras | zwei USB-Kameras, 640x480 bei 30 fps | eine Szenenansicht, eine am Handgelenk |
| Host | Python 3.12 oder neuer, ffmpeg | requires-python >= 3.12 |
| Hub-Konto | Hugging Face Schreib-Token | optional mit --dataset.push_to_hub=false |
Der STS3215 ist in zwei Versionen erhältlich: Das SO-ARM100 README bewertet die 7.4 V Version mit 16.5 kg.cm Haltemoment, gemessen bei 6 V, und die 12 V Version mit 30 kg.cm. Es weist darauf hin, dass die Wahl der 12 V Motoren auch den Kauf eines 12 V 5 A+ Netzteils anstelle des 5 V Netzteils bedeutet. Die Stückliste führt 7.4 V Servos auf. Das Anlegen von 12 V an Servos, die für 7.4 V ausgelegt sind, zerstört diese. Lesen Sie daher das Motorlabel, bevor Sie etwas verdrahten. Servo reagiert nicht.
Wenn der Arm noch nicht gebaut ist, ist das ein separater Abend: Beginnen Sie bei SO-100 Erste Schritte und dem vollständigen SO-100 Einrichtungsleitfaden. Wenn Sie noch nichts gekauft haben, lesen Sie zuerst den SO-100 vs. SO-101 Vergleich zuerst: Der SO-101 ist die neuere Revision mit verbesserter Verkabelung und ohne Schritt zur Zahnradentfernung, und der Aufnahmeworkflow ist identisch.
lerobot 0.6.1 installieren
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-infoExtras verwirren die meisten Leute. pip install lerobot installiert nur die Kern-ML-Abhängigkeiten, nichts, was mit einem Roboter kommuniziert. Koch-Arme benötigen dynamixel anstelle von feetech. Wenn Ihre Shell noch nie von lerobot-record gehört hat, ist dies der Grund.
Ports, Motor-IDs und Kalibrierung
Drei einmalige Schritte trennen die Komponenten von einer funktionierenden Teleoperationsschleife. ermöglicht es, eine an Ihrem Arm trainierte Policy auf einem anderen Arm auszuführen, indem Roh-Encoder-Werte auf eine gemeinsame Gelenkkonvention abgebildet werden.
- 1USB-Port jedes Arms finden
Führen Sie es mit beiden angeschlossenen Armen aus, ziehen Sie den Arm, den Sie identifizieren möchten, auf Aufforderung ab und notieren Sie, welcher Port verschwindet. Unter Linux benötigen Sie möglicherweise
sudo chmod 666 /dev/ttyACM0.bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2Motor-IDs und Baudraten schreiben
IDs werden einzeln für jeden Motor geschrieben, und die Dokumentation ist streng bezüglich der Vorgehensweise: Schließen Sie genau einen Motor an die Steuerplatine an, noch nicht in Reihe mit anderen. Das Skript geht die Kette rückwärts durch, fordert zuerst den Greifer auf und gibt ihm die ID 6, dann wrist_roll als 5, bis hin zu shoulder_pan als 1. Führen Sie dies vor der Montage durch.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Beide Arme kalibrieren
Bewegen Sie jedes Gelenk in die Mitte seines Bereichs, drücken Sie Enter und bewegen Sie dann jedes Gelenk durch seinen gesamten Bereich. Die
idwird zum Profil-Dateinamen.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 - 4Teleoperation vor der Aufzeichnung
Der Akzeptanztest für alles oben Genannte. Wenn die Teleoperation ruckelig, spiegelverkehrt ist oder ein Gelenk nicht folgt, wird dies in 50 Episoden aufgezeichnet.
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
Profile werden unter $HF_LEROBOT_CALIBRATION gespeichert, standardmäßig ~/.cache/huggingface/lerobot/calibration, und die ID ist der Suchschlüssel. Geben Sie lerobot-record eine kalibrierte ID, und es wird angeboten, das Profil mit Enter wiederzuverwenden oder mit c neu zu erstellen. Geben Sie eine unbekannte ID ein, und es gibt keine Datei, sodass die Kalibrierung mitten in der Sitzung gestartet wird.
Kameras entscheiden, was die Policy sieht
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.0Zwei Ansichten, und ihre Position ist wichtig: eine feste Szenenkamera, die den Arbeitsbereich abdeckt, und eine Handgelenkskamera in der Nähe des Endeffektors, die zeigt, was der Greifer gleich berühren wird. Die LeRobot Community-Datasets-Checkliste fordert vorzugsweise zwei Ansichten mit 480x640 / 720p oder besser, einen statischen Hintergrund, neutrale, stabile Beleuchtung und dass der Führungsarm sowie menschliche Gliedmaßen außerhalb des Bildes sind. Der Aufnahmeleitfaden fügt die Faustregel hinzu: Sie sollten die Aufgabe selbst erledigen können, indem Sie nur die Kamerabilder betrachten.
OpenCV-Indizes stammen aus der Enumerationsreihenfolge, sodass ein Neustart oder erneutes Anschließen dazu führen kann, dass Index 0 und 2 die Plätze tauschen und die Handgelenksansicht für eine ganze Sitzung an die erste Stelle rückt. lerobot sagt es selbst: Seine Kameraklasse akzeptiert sowohl einen Gerätepfad als auch eine Ganzzahl und warnt davor, dass Indizes über Neustarts oder Portänderungen hinweg instabil sind, insbesondere unter Linux. Verweisen Sie index_or_path auf den udev-Symlink unter /dev/v4l/by-id/, der dem Gerät und nicht der Enumerationsreihenfolge folgt. Dies ist der häufigste Grund, warum ein Datensatz intern inkonsistent wird, und das Training kann dies nicht beheben. Kamera nicht erkannt.
Der Record-Befehl und alle Flags
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=2Die untenstehenden Standardwerte stammen aus src/lerobot/configs/dataset.py im Main-Branch, nicht aus einem Tutorial. Einige davon sind nicht das, was man annimmt.
| Flag | Standardwert | Funktion |
|---|---|---|
| --dataset.repo_id | leer | Name; Zeitstempel wird standardmäßig angehängt |
| --dataset.single_task | leer | Aufgaben-String, der mit jeder Episode gespeichert wird |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | Schreibpfad, Standard ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | Regelkreisrate und Datensatz-Bildrate |
| --dataset.episode_time_s | 60 | Sekunden, bevor eine Episode automatisch fortgesetzt wird |
| --dataset.reset_time_s | 60 | Szenen-Reset; Arm bewegt sich, nichts wird gespeichert |
| --dataset.num_episodes | 50 | Episoden, die in dieser Sitzung aufgezeichnet wurden |
| --dataset.push_to_hub | true | Upload am Ende der Sitzung; false bleibt lokal |
| --dataset.streaming_encoding | false in der Dataclass, true in der Doku-Tabelle | Kodierung während der Aufnahme; explizit setzen |
| --dataset.encoder_queue_maxsize | 30 | gepufferte Frames pro Kamera, ~1 s bei 30 fps |
| --dataset.encoder_threads | null (Codec entscheidet) | Threads pro Encoder; reduzieren, wenn die Aufnahme stottert |
| --dataset.no_stamp | false | repo_id genau wie eingegeben beibehalten |
| --resume | false | an einen bestehenden Datensatz anhängen; benötigt --dataset.root |
Ihr Datensatz heißt nicht so, wie Sie es eingegeben haben. lerobot fügt einen Datums-Zeit-Tag an, sodass so100_pick_cube zu so100_pick_cube_20260823_141530 wird. Verwenden Sie --dataset.no_stamp=true für einen stabilen Namen. Resume zählt Ergänzungen, nicht Gesamtsummen. Mit --resume=true zählt --dataset.num_episodes zusätzliche Episoden und --dataset.root wird obligatorisch. Fordern Sie 50 bei einem 30-Episoden-Datensatz an, und Sie erhalten 80.
Tastatursteuerung während einer Sitzung
- Rechtspfeil oder
n: Beendet die Episode oder setzt die Phase frühzeitig zurück. Dies ist die Taste, die Sie am häufigsten verwenden werden, da ein sauberer Griff selten 25 Sekunden benötigt. - Linkspfeil oder
r: Verwirft die Episode und wiederholt sie. Eine schlechte Aufnahme kostet jetzt nichts und später viel. - Escape oder
q: Beendet die Sitzung, schließt die Kodierung ab, lädt hoch. - Diese funktionieren unter X11, Wayland und headless SSH: Ohne globales Tastatur-Backend liest lerobot-record dieselben Tasten vom steuernden Terminal. Die Buchstaben überleben verzögerte SSH-Verbindungen, bei denen Pfeilsequenzen geteilt werden.
- Tastatur-Teleoperation ist anders und benötigt ein globales Backend: X11, Windows oder macOS mit Accessibility.
Wie viele Episoden, und wie eine gute aussieht
Der Aufnahmeleitfaden empfiehlt mindestens 50 Episoden für eine erste Aufgabe, etwa 10 pro Objektposition. Die Richtlinienseiten listen ein Minimum pro Modell auf, unterhalb dessen ein Durchlauf die GPU-Zeit nicht wert ist.
| Richtlinie | Min. Episoden | Datensatzformat | GPU-Klasse | Kosten pro Durchlauf |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | etwa 1 bis 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | etwa 1 bis 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | etwa 4 bis 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | etwa 4 bis 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | etwa 4 bis 12 USD |
Die bessere Frage ist, wie viele von was. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) sammelten über 40.000 Demonstrationen und führten mehr als 15.000 reale Rollouts durch. Die Generalisierung folgte einer annähernd potenzgesetzlichen Beziehung mit der Anzahl der Umgebungen und Objekte, und jenseits eines Schwellenwerts pro Umgebung oder Objekt hatten zusätzliche Demonstrationen minimale Auswirkungen. Auf einer Testbank: Bewegen Sie das Objekt, ändern Sie die Beleuchtung, tauschen Sie den Würfel aus, anstatt eine Aufnahme zu wiederholen.
- Kontinuierliche Gelenktrajektorien, die ein Servo reproduzieren kann, im Gegensatz zu Tastatur oder Gamepad
- Aktion und Zustand teilen eine Koordinatenkonvention, sodass die Richtlinie ein Ziel lernt, das sie direkt steuern kann
- Eine 25-sekündige Episode plus ein 10-sekündiger Reset ergeben ungefähr 100 Episoden pro Stunde
- Der Bediener spürt, wenn der Follower stockt oder klemmt, sodass Fehler auftreten, bevor Daten festgeschrieben werden
- Ein zweiter Arm verdoppelt ungefähr die Teilekosten
- Demonstrationen übernehmen die Gewohnheiten des Bedieners; Mandlekar et al. fanden heraus, dass die Richtlinienqualität stark von der Demonstrationsqualität abhängt
- Der Leader wird mit der Schleifenrate abgetastet, sodass Pausen zu nahezu identischen Zeilen werden, die der Richtlinie beibringen zu warten
- Nichts erzwingt Konsistenz zwischen den Sitzungen: Eine um 5 cm verschobene Kamera ist eine versteckte Verteilungsverschiebung
Eine gute Episode ist langweilig: wiederholbare Ausgangsposition, eine Sache erledigt, beendet sobald das Objekt im Behälter ist, Aufgabenstring in den 25 bis 50 Zeichen, die die Checkliste empfiehlt. Nimm den roten Würfel und lege ihn in die Box ist ein Aufgabenstring; task1 ist das Anti-Muster, das die Checkliste explizit nennt. Vage Anmerkungen stehen ganz oben auf der Problemliste, und sie sind am wichtigsten für , wo der String eine Modelleingabe ist, nicht ein Dateiname.
Fehler, die einen Datensatz stillschweigend ruinieren
Keiner wirft eine Ausnahme. Alle überleben das Training und zeigen sich als Verlustkurve, die gut aussieht, und ein Roboter, der nichts tut. Überprüfen Sie, während die Szene eingerichtet ist.
| Fehler | Wie es aussieht | Woher es kommt | Wie man ihn erkennt |
|---|---|---|---|
| Vertauschte Kameraansichten | Handgelenksbild unter dem oberen Schlüssel | Index-Neuzuordnung nach erneutem Anschließen | lerobot-find-cameras each session; by-id paths |
| Eingefrorene Frames | Dasselbe Bild für Dutzende von Zeilen | Kamera liefert nicht mehr; Schleife wiederholt den letzten Frame | scrub it in lerobot-dataset-viz |
| Verlorene Frames | Zeilenanzahl unterhalb von fps mal Sekunden | Warteschlange läuft über, verwirft statt zu blockieren | 'Encoder queue full' in the log; rows vs fps times duration |
| Gelenk am Limit | Ein Gelenk flach bei Min oder Max | Führungsbereich überschreitet den des Folgers, oder eine schlechte Mittelposition | per-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand |
| Bild und Aktion nicht synchron | Die Policy antizipiert oder hinkt hinterher | Kameras mit einer anderen Bildrate als die Schleife | keep every camera at --dataset.fps |
| Totzeit | Lange Reihen identischer Aktionszeilen | Operator pausierte bei laufendem Recorder | Anteil aufeinanderfolgender identischer Aktionszeilen |
| Unbrauchbarer Aufgabenstring | task1, demo2, test | Schnelles Tippen | meta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks |
Der Encoder verwaltet eine begrenzte Warteschlange pro Kamera, standardmäßig 30 Bilder. Wenn er nicht mithalten kann, werden Bilder verworfen statt blockiert: Die Aufnahme wird fortgesetzt und nichts stürzt ab. Sie erhalten Encoder queue full for {camera}, dropped N frame(s) und eine kamera-spezifische Gesamtzahl am Ende der Episode. Der lerobot-Schwellenwert: etwa 5 Prozent fehlende Bilder bedeuten ein überlastetes System, 2 Prozent sind die erwartete Startlast. Lösungen in der Reihenfolge: --display_data=false, --dataset.encoder_threads reduzieren, vcodec=h264, Streaming ausschalten.
Ein Vorbehalt: Die Tabelle des Streaming-Encoding-Leitfadens listet den Standardwert als True, während die Dataclass auf main liest streaming_encoding: bool = False. Dokumentation und Code stimmen nicht überein, daher explizit setzen; lerobot protokolliert einen Hinweis, der dies empfiehlt, wann immer es mit ausgeschaltetem Flag startet.
Überprüfen Sie den Datensatz, bevor Sie eine GPU mieten
Der Akzeptanztest aus der Dokumentation: Vergleichen Sie die Videodauer mit der von der CLI gemeldeten Episodendauer und bestätigen Sie, dass die Zeilenanzahl der fps mal Dauer entspricht. Pro Episode, nicht in der Summe.
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"])Dann sehen Sie es sich an. lerobot-dataset-viz spielt eine Episode Bild für Bild mit Gelenkspuren neben den Kameraansichten in Rerun oder Foxglove ab. Vertauschte Kameras und eingefrorene Bilder werden in zehn Sekunden sichtbar. Die Leute überspringen diesen Schritt.
# 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 oder v3.0: entscheiden Sie vor der Aufnahme
v2.1 schrieb ein Parquet und eine MP4 pro Episode. v3.0 verkettet viele Episoden zu gemeinsamen Shards und rekonstruiert Grenzen aus Metadaten, sodass info.json Pfadvorlagen wie data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet anstelle einer Episodennummer enthält. Die übergeordnete Begründung sind weniger, größere Dateien: schnellere Initialisierung und geringerer Dateisystemdruck im großen Maßstab.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Layout | ein Parquet und eine MP4 pro Episode | viele Episoden pro Shard |
| Episodenmetadaten | JSONL-Dateien | chunked Parquet unter meta/episodes/, über den Datensatz-Stack |
| Streaming vom Hub | nein | ja, über StreamingLeRobotDataset |
| Geschrieben von lerobot 0.6.1 | nein | ja, was Sie heute erhalten |
| Gelesen von GR00T N1.7 und N1.5 | ja | nein, muss herunterkonvertiert werden |
lerobot 0.6.1 schreibt v3.0, aber GR00T N1.7 und N1.5 lesen v2.0 oder v2.1 und stürzen dabei ab. Beachten Sie die Richtung der Entwicklung: src/lerobot/scripts/ enthält convert_dataset_v21_to_v30.py und nichts, was in die andere Richtung geht. Klären Sie dies vor der Sitzung. Lösung: Datensatz als v3 abgelehnt.
# 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=falseZwei Wege zum selben Datensatz
Alles oben Genannte, auf Ihrer eigenen Maschine: Sie sind verantwortlich für die USB-Enumeration, den ffmpeg-Build, die Encoder-Abstimmung und die Kalibrierungsdateien. Der richtige Weg, um die Pipeline zu verstehen, ein ungewöhnliches Kamera-Rig zu betreiben oder Daten lokal zu halten.
Der Desktop-Client zeichnet Datensätze, Episoden, Kamerastreams und Gelenkzustände im LeRobot-Format direkt aus einer Teleoperation Sitzung auf. Dieser Datensatz speist das Trainingsformular: Wählen Sie Modell, Datensatz und Hyperparameter aus, und das Backend mietet eine GPU, die an den VRAM des Modells angepasst ist, führt den Trainer aus und schreibt Checkpoints in den Objektspeicher.
- 1Client installieren
Auf der Downloadseite; Einrichtung in den Client-Dokumenten.
- 2Aufnahme aus einer Teleoperationssitzung
Steuern Sie den Arm; der Client schreibt Episoden im LeRobot-Format. Anleitung: zeichnen Sie Ihren ersten Datensatz auf.
- 3Oder bringen Sie Ihre eigenen Daten mit
Ein Datensatz kann auch von einer Hugging Face Repo-ID oder Ihrer eigenen Maschine stammen: Datensatz-Dokumentation, öffentliches Verzeichnis.
- 4Trainieren und zurückführen
Wählen Sie die Kombination auf der Trainingsmatrix, und führen Sie dann die Policy wieder auf dem Arm aus. Grob 1 bis 3 USD auf der 24-GB-Stufe, 4 bis 12 auf der A100- oder H100-Stufe.
LeRobot-Datensätze aufzeichnen, ohne die Pipeline selbst zu verdrahten
Der AY-Robots Desktop-Client zeichnet Episoden, Kamerastreams und Gelenkzustände im LeRobot-Format aus einer Teleoperationssitzung auf und übergibt den Datensatz dann an den Trainer.
Desktop-Client herunterladenVom Datensatz zur Policy
Fünfzig saubere Episoden speisen jeden Lauf hier. trainiert von Grund auf nur für Ihre Aufgabe, etwa 80 Millionen Parameter bei ungefähr 20 ms pro Aktionsschritt, die einzige der fünf, die mit schnellen Bewegungen zurechtkommt. hat etwa 450 Millionen Parameter auf einer 24-GB-Karte. ist ein etwa 3 Milliarden Parameter umfassendes Basismodell, bei dem etwa 40 Millionen Parameter berührt, eine A100 oder H100 benötigt und den v2.1-Datensatz will.
Als Nächstes die Anleitung für Ihre Kombination: , oder ; für einen ersten Lauf ist kürzer. Wenn die Policy auf dem Prüfstand funktioniert, aber zusammenbricht, sobald Sie den Tisch bewegen, ist das ein Datenproblem: und gehen tiefer auf Diversität ein.
Wie viele Episoden benötige ich wirklich für eine erste funktionierende Policy?▾
Dreißig für SmolVLA, fünfzig für ACT, Pi0.5, GR00T N1.5 und N1.7, die Mindestwerte, die die AY-Robots Trainer durchsetzen. Der LeRobot-Leitfaden empfiehlt unabhängig davon mindestens 50 für eine erste Aufgabe, etwa 10 pro Objektposition. Arbeiten zur Datenskalierung haben ergeben, dass die Generalisierung mit Umgebungen und Objekten skaliert und nicht mit der Anzahl der Demonstrationen, daher sind hundert Aufnahmen einer Szene schlechter als fünfzig über fünf Platzierungen hinweg.
Benötige ich einen Leader-Arm, oder kann ich mit einer Tastatur teleoperieren?▾
lerobot liefert Tastatur- und Gamepad-Teleoperatoren, daher ist ein Leader-Arm nicht zwingend erforderlich, aber stark bevorzugt: Leader-Follower liefert kontinuierliche Gelenktrajektorien in der Koordinatenkonvention der aufgezeichneten Aktion, während Tastatureingaben eine gestufte Bewegung erzeugen, die eine Policy als Ruck lernt. Die Tastatur-Teleoperation benötigt auch ein globales Key-Backend, daher schlägt sie unter Wayland und headless fehl.
Kann ich auf einem Raspberry Pi oder einem kleinen Mini-PC aufnehmen?▾
Ja, mit Abstimmung. Der Leitfaden zur Streaming-Kodierung enthält eine Kategorie für geringe Ressourcen, die moderne 4-Kern-Maschinen und den Raspberry Pi 5 abdeckt, und platziert zwei Kameras mit 640x480 und 30 fps in seiner Spalte 'erfordert etwas Abstimmung'. Sein Rat: Verhindern Sie, dass der Encoder mit der Erfassungsschleife konkurriert, über --dataset.rgb_encoder.vcodec=h264 und --dataset.streaming_encoding=false. Es bewertet zwei Kameras mit 640x480 als etwa 55 Millionen Pixel pro Sekunde und zwei mit 1920x1080 als etwa 373 Millionen.
Woher weiß ich, dass der gerade aufgenommene Datensatz tatsächlich intakt ist?▾
Drei einfache Prüfungen. Vergleichen Sie die Videodauer jeder Episode mit der von der CLI gemeldeten Dauer und bestätigen Sie, dass die Zeilenanzahl der fps mal dieser Dauer entspricht, pro Episode und nicht insgesamt; das ist der Akzeptanztest, den der Kodierungsleitfaden von lerobot angibt. Lesen Sie ds.meta.stats, wo ein Gelenk, dessen Minimum seinem Maximum entspricht, sich nie bewegt hat. Spielen Sie dann zwei oder drei Episoden in lerobot-dataset-viz ab, die einzige Möglichkeit, vertauschte Ansichten und eingefrorene Bilder zu erkennen. Bei verlorenen Frames zieht der Leitfaden die Grenze bei etwa 5 Prozent fehlenden; etwa 2 Prozent ist normale transiente Last, oft nur beim Start.
Mein Trainingsjob hat den Datensatz als v3.0 abgelehnt. Was nun?▾
GR00T N1.7 und N1.5 lesen LeRobot v2.0 oder v2.1 und stürzen bei v3.0 ab, was lerobot 0.6.1 aufzeichnet. Entweder legen Sie das Format vor dem Training fest, oder Sie verwenden eine Policy, die v3.0 nativ liest: Pi0.5, SmolVLA oder ACT. lerobot liefert einen v2.1 zu v3.0 Konverter und nichts in umgekehrter Richtung.
Sources
- LeRobot: Imitationslernen auf realen Robotern
- LeRobot: SO-100 Montage, Motoreinrichtung und Kalibrierung
- LeRobot: Kameras und lerobot-find-cameras
- LeRobot: Installation und die Extras-Matrix
- LeRobotDataset v3.0: Layout und v2.1 Migration
- LeRobot: Streaming-Video-Kodierung und verlorene Frames
- LeRobot: Portierung großer Datensätze auf v3.0 (DROID)
- lerobot v0.6.1 Release, 3 August 2026
- DatasetRecordConfig: die echten Aufnahmestandards
- lerobot_record.py: Aufnahmeschleife und Wiederaufnahmebehandlung
- TheRobotStudio/SO-ARM100: Build-Repo und Stückliste
- Hugging Face: LeRobot Community Datasets Checkliste
- lerobot/svla_so100_pickplace: 50 Episoden, 19,631 Frames
- Lin et al. (2024), Skalierungsgesetze für Daten im Imitationslernen
- Mandlekar et al. (2021), Was zählt beim Lernen aus Offline-Menschlichen Demonstrationen
Quellen
- 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
Bereit für hochwertige Robotik-Daten?
AY-Robots verbindet Ihre Roboter mit qualifizierten Operatoren weltweit.
Jetzt starten