Die AY-Robots Tutorial-Seite zum Aufzeichnen Ihres ersten LeRobot-Datensatzes mit einem SO-100 Arm
LeRobotSO-100DatensatzaufzeichnungTeleoperationImitationslernen

Nehmen Sie Ihren ersten LeRobot-Datensatz mit einem SO-100 auf

AY-Robots Research23. August 202616 min Lesezeit

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.

MerkmalDatentypFormBeschreibung
actionfloat32[6]Gelenkziele vom Leader-Arm
observation.statefloat32[6]Gelenkpositionen, die der Follower erreicht hat
observation.images.topvideo[480, 640, 3]Szenenkamera, MP4 (hier av1)
observation.images.wristvideo[480, 640, 3]Handgelenkkamera, gleiche Rate
timestampfloat32[1]Sekunden seit Episodenstart
frame_index, episode_index, index, task_indexint64[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.

Ein Maßstab aus einem realen Datensatz

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.

Der AY-Robots Glossareintrag für das LeRobot-Datensatzformat, der das Verzeichnislayout und die Metadatendateien zeigt.
Was in data/, videos/ und meta/ lebt und welche Richtlinien welche Version lesen.

Was Sie auf dem Prüfstand benötigen

ElementDetailHinweis
FolgearmSO-100, sechs Feetech STS3215 Servosetwa 110 bis 150 EUR an Teilen
Führungsarmein zweiter SO-100, Zahnräder entferntZahnräder von allen sechs Führungsmotoren entfernt: nur Encoder, weniger Reibung
Stromversorgungabgestimmt auf die 7.4 V STS3215 Variante in der Stücklistesiehe Warnung unten
Kameraszwei USB-Kameras, 640x480 bei 30 fpseine Szenenansicht, eine am Handgelenk
HostPython 3.12 oder neuer, ffmpegrequires-python >= 3.12
Hub-KontoHugging Face Schreib-Tokenoptional mit --dataset.push_to_hub=false
7.4 V, nicht 12 V

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

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 gibt eine Systemzusammenfassung aus, einschließlich der ffmpeg-Version, die es im PATH finden kann.

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

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

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

    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
    Beide 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 id wird zum Profil-Dateinamen.

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

    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
Wo die Kalibrierung gespeichert wird und warum die ID wichtig ist

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

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
Dies bei jeder Sitzung ausführen: Die Dokumentation warnt, dass diese Bezeichner nach einem Neustart oder erneuten Anschließen, abhängig vom Betriebssystem, ändern können.

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

Der Kamera-Index ist keine stabile Identität

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

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
Das Kamera-Dict ist ein in der Shell zitierter String; die verschachtelten Klammern sind keine Shell-Syntax.

Die untenstehenden Standardwerte stammen aus src/lerobot/configs/dataset.py im Main-Branch, nicht aus einem Tutorial. Einige davon sind nicht das, was man annimmt.

FlagStandardwertFunktion
--dataset.repo_idleerName; Zeitstempel wird standardmäßig angehängt
--dataset.single_taskleerAufgaben-String, der mit jeder Episode gespeichert wird
--dataset.root$HF_LEROBOT_HOME/repo_idSchreibpfad, Standard ~/.cache/huggingface/lerobot/
--dataset.fps30Regelkreisrate und Datensatz-Bildrate
--dataset.episode_time_s60Sekunden, bevor eine Episode automatisch fortgesetzt wird
--dataset.reset_time_s60Szenen-Reset; Arm bewegt sich, nichts wird gespeichert
--dataset.num_episodes50Episoden, die in dieser Sitzung aufgezeichnet wurden
--dataset.push_to_hubtrueUpload am Ende der Sitzung; false bleibt lokal
--dataset.streaming_encodingfalse in der Dataclass, true in der Doku-TabelleKodierung während der Aufnahme; explizit setzen
--dataset.encoder_queue_maxsize30gepufferte Frames pro Kamera, ~1 s bei 30 fps
--dataset.encoder_threadsnull (Codec entscheidet)Threads pro Encoder; reduzieren, wenn die Aufnahme stottert
--dataset.no_stampfalserepo_id genau wie eingegeben beibehalten
--resumefalsean einen bestehenden Datensatz anhängen; benötigt --dataset.root
Zwei Flags, die unerwartet eine Stunde kosten

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.

RichtlinieMin. EpisodenDatensatzformatGPU-KlasseKosten pro Durchlauf
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardetwa 1 bis 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardetwa 1 bis 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBetwa 4 bis 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBetwa 4 bis 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBetwa 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.

Leader-Follower-Teleoperation als Datenquelle
Vorteile
  • 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
Nachteile
  • 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.

FehlerWie es aussiehtWoher es kommtWie man ihn erkennt
Vertauschte KameraansichtenHandgelenksbild unter dem oberen SchlüsselIndex-Neuzuordnung nach erneutem Anschließenlerobot-find-cameras each session; by-id paths
Eingefrorene FramesDasselbe Bild für Dutzende von ZeilenKamera liefert nicht mehr; Schleife wiederholt den letzten Framescrub it in lerobot-dataset-viz
Verlorene FramesZeilenanzahl unterhalb von fps mal SekundenWarteschlange läuft über, verwirft statt zu blockieren'Encoder queue full' in the log; rows vs fps times duration
Gelenk am LimitEin Gelenk flach bei Min oder MaxFührungsbereich überschreitet den des Folgers, oder eine schlechte Mittelpositionper-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand
Bild und Aktion nicht synchronDie Policy antizipiert oder hinkt hinterherKameras mit einer anderen Bildrate als die Schleifekeep every camera at --dataset.fps
TotzeitLange Reihen identischer AktionszeilenOperator pausierte bei laufendem RecorderAnteil aufeinanderfolgender identischer Aktionszeilen
Unbrauchbarer Aufgabenstringtask1, demo2, testSchnelles Tippenmeta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks
Verworfene Bilder verbergen sich

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.

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"])
Eine Episode, deren fps-Wert weit von der Dauer abweicht, ist ein Kandidat für die Löschung, nicht für das Training.

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.

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 führt auch Split, Merge, remove_feature, modify_tasks und die Neuberechnung von Statistiken durch. Löschen Sie großzügig: Eine schlechte Episode kostet eine Episode; sie zu behalten, kostet jeden darauf trainierten Lauf.
Das AY-Robots Datensatzverzeichnis listet öffentliche LeRobot-Datensätze mit Episodenzahlen und Formaten auf.
Wie vergleichbare Datensätze dimensioniert und annotiert werden.

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.1LeRobot v3.0
Layoutein Parquet und eine MP4 pro Episodeviele Episoden pro Shard
EpisodenmetadatenJSONL-Dateienchunked Parquet unter meta/episodes/, über den Datensatz-Stack
Streaming vom Hubneinja, über StreamingLeRobotDataset
Geschrieben von lerobot 0.6.1neinja, was Sie heute erhalten
Gelesen von GR00T N1.7 und N1.5janein, muss herunterkonvertiert werden
Heute aufnehmen, morgen GR00T trainieren

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.

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
Schnell für 50 Episoden. Skalierung ist eine andere Aufgabe: lerobots Portierungsleitfaden für rohes DROID in v3.0 kalkuliert 7+ Tage lokaler Verarbeitung und etwa 400 GB ein.

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

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 herunterladen

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

Bereit für hochwertige Robotik-Daten?

AY-Robots verbindet Ihre Roboter mit qualifizierten Operatoren weltweit.

Jetzt starten