Η σελίδα εκπαιδευτικού υλικού των AY-Robots για την καταγραφή του πρώτου σας LeRobot συνόλου δεδομένων με ένα βραχίονα SO-100
LeRobotSO-100Καταγραφή ΔεδομένωνΤηλελειτουργίαΜάθηση μέσω Μίμησης

Καταγράψτε το Πρώτο σας LeRobot Σύνολο Δεδομένων με ένα SO-100

AY-Robots ResearchAugust 23, 202616 min ανάγνωσης

Καταγράψτε ένα χρησιμοποιήσιμο σύνολο δεδομένων LeRobot με ένα SO-100: βαθμονόμηση, τηλελειτουργία leader-follower, οι πραγματικές σημαίες και προεπιλογές του lerobot-record, ρύθμιση κάμερας, αριθμός επεισοδίων, και τα ελαττώματα που καταστρέφουν μια εκτέλεση.

Ένας SO-100 ακολουθητής, ένας βραχίονας οδηγός του ίδιου σχεδιασμού και δύο κάμερες USB μπορούν να ρυθμίσουν λεπτομερώς μια πολιτική μέσα σε ένα απόγευμα. Ο ίδιος πάγκος μπορεί εξίσου εύκολα να παράγει εξήντα επεισόδια που φαίνονται υγιή σε ένα πρόγραμμα περιήγησης αρχείων και να σπαταλήσει μια εξάωρη εκτέλεση GPU. Η διαφορά σπάνια είναι το μοντέλο· είναι αυτό που συνέβη μεταξύ των σερβομηχανισμών και του αρχείου parquet.

Εδώ είναι η χειροκίνητη διαδρομή, και μετά η συντομότερη. Κάθε εντολή προέρχεται από το lerobot 0.6.1, που κυκλοφόρησε στις 3 Αυγούστου 2026 και είναι τρέχον στο PyPI. Μετακινήθηκε σε σημεία εισόδου κονσόλας, οπότε τα tutorials που εκτελούν python lerobot/scripts/control_robot.py περιγράφουν ένα αρχείο που δεν υπάρχει πλέον.

Η σύντομη έκδοση

  • Το lerobot 0.6.1 καταγράφει v3.0· τα GR00T N1.7 και N1.5 θέλουν v2.1. Καθορίστε τη μορφή πριν πατήσετε εγγραφή.
  • Τέσσερις εντολές: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Χρησιμοποιήστε τα ίδια --robot.id και --teleop.id από τη βαθμονόμηση στην περίοδο καταγραφής.
  • Πραγματικές προεπιλογές: 30 fps, 60 δευτερόλεπτα ανά επεισόδιο, 60 δευτερόλεπτα επαναφορά, 50 επεισόδια, περίπου 100 λεπτά πραγματικού χρόνου.
  • Ελάχιστα επεισόδια εδώ: 30 για το SmolVLA, 50 για τα υπόλοιπα.
  • Η ποικιλομορφία υπερτερεί του όγκου. Τα σύνολα δεδομένων αποτυγχάνουν λόγω τεσσάρων πραγμάτων: εναλλαγμένων δεικτών κάμερας, χαμένων ή παγωμένων καρέ, μιας άρθρωσης παρκαρισμένης στο όριό της, μιας μη αναγνώσιμης συμβολοσειράς εργασίας.

Τι καταγράφει μια περίοδος καταγραφής

Ένα σύνολο δεδομένων LeRobot δεν είναι ένας φάκελος βίντεο αλλά ένας χρονο-ευρετηριασμένος πίνακας με συνημμένο βίντεο: κάθε κύκλος ελέγχου γράφει μία γραμμή που περιέχει την εντολή δράσης, την κατάσταση που έφτασε ο ακόλουθος, ένα καρέ ανά κάμερα, μια χρονική σήμανση και δείκτες. Η πολιτική βλέπει μόνο αυτές τις στήλες. Το σχήμα του lerobot/svla_so100_pickplace, όπως διαβάζεται από το meta/info.json του.

ΧαρακτηριστικόdtypeΣχήμαΤι είναι
actionfloat32[6]στόχοι αρθρώσεων από τον βραχίονα του ηγέτη
observation.statefloat32[6]θέσεις αρθρώσεων που έφτασε ο ακόλουθος
observation.images.topvideo[480, 640, 3]κάμερα σκηνής, MP4 (av1 εδώ)
observation.images.wristvideo[480, 640, 3]κάμερα καρπού, ίδια συχνότητα
timestampfloat32[1]δευτερόλεπτα από την έναρξη του επεισοδίου
frame_index, episode_index, index, task_indexint64[1]αυτόματα συμπληρωμένη λογιστική καταγραφή

Οι αρθρώσεις είναι main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll και main_gripper: οι έξι βαθμοί ελευθερίας του SO-100. Η δράση και η κατάσταση μοιράζονται ένα σχήμα επειδή τηλελειτουργία ηγέτη-ακόλουθου καταγράφει έναν στόχο και τη θέση που επιτεύχθηκε ένα βήμα αργότερα. Αυτό το κενό είναι πληροφορία: πού ο βραχίονας πάλεψε τη βαρύτητα ή ένα κολλημένο αντικείμενο. Αυτές οι συμβολοσειρές ανήκουν σε αυτό το σύνολο δεδομένων. Μια συνεδρία που καταγράφηκε με 0.6.1 σήμερα γράφει shoulder_pan.pos έως gripper.pos, αναγνωριστικά 1 έως 6 στον δίαυλο: οι ίδιες έξι αρθρώσεις, διαφορετικά κλειδιά, κάτι που έχει σημασία τη στιγμή που μια διαμόρφωση αναφέρεται σε ένα χαρακτηριστικό με το όνομά του.

Ένα μέτρο σύγκρισης από ένα πραγματικό σύνολο δεδομένων

Αυτό το σύνολο δεδομένων περιέχει 50 επεισόδια και 19.631 καρέ στα 30 fps: περίπου 393 καρέ, ή 13 δευτερόλεπτα, ανά επεισόδιο. Εάν τα δικά σας έχουν μέσο όρο ένα λεπτό, κάνετε κάτι πιο δύσκολο ή καταγράφετε νεκρό χρόνο και στα δύο άκρα.

Η καταχώριση γλωσσαρίου AY-Robots για τη μορφή συνόλου δεδομένων LeRobot, που δείχνει τη διάταξη καταλόγου και τα αρχεία μεταδεδομένων.
Τι περιέχεται στα data/, videos/ και meta/, και ποιες πολιτικές διαβάζουν ποια έκδοση.

Τι χρειάζεστε στον πάγκο εργασίας

ΣτοιχείοΛεπτομέρειαΣημείωση
Βραχίονας ακολούθησηςSO-100, έξι σερβοκινητήρες Feetech STS3215περίπου 110 έως 150 EUR σε ανταλλακτικά
Βραχίονας οδηγούένας δεύτερος SO-100, αφαιρεμένα γρανάζιααφαιρεμένα γρανάζια από όλους τους έξι κινητήρες οδηγού: μόνο κωδικοποιητής, λιγότερη τριβή
Τροφοδοσίααντιστοιχισμένη στην έκδοση 7.4 V STS3215 στον κατάλογο υλικώνδείτε την προειδοποίηση παρακάτω
Κάμερεςδύο κάμερες USB, 640x480 στα 30 fpsμία προβολή σκηνής, μία στον καρπό
Κεντρικός υπολογιστήςPython 3.12 ή νεότερη, ffmpegrequires-python >= 3.12
Λογαριασμός HubHugging Face write tokenπροαιρετικό με --dataset.push_to_hub=false
7.4 V, όχι 12 V

Ο STS3215 διατίθεται σε δύο εκδόσεις: το README του SO-ARM100 αξιολογεί την έκδοση 7.4 V στα 16.5 kg.cm ροπή στάσης μετρημένη στα 6 V και την έκδοση 12 V στα 30 kg.cm, και σημειώνει ότι η επιλογή των κινητήρων 12 V σημαίνει επίσης την αγορά τροφοδοτικού 12 V 5 A+ αντί για το 5 V. Ο κατάλογος υλικών αναφέρει σερβοκινητήρες 7.4 V. Η τροφοδοσία 12 V σε σερβοκινητήρες ονομαστικής τάσης 7.4 V τους καταστρέφει, οπότε διαβάστε την ετικέτα του κινητήρα πριν συνδέσετε οτιδήποτε. Ο σερβοκινητήρας δεν ανταποκρίνεται.

Εάν ο βραχίονας δεν έχει κατασκευαστεί ακόμα, αυτό είναι ένα ξεχωριστό βράδυ: ξεκινήστε από Ξεκινώντας με το SO-100 και τον πλήρη οδηγό εγκατάστασης του SO-100. Εάν δεν έχετε αγοράσει τίποτα, διαβάστε την σύγκριση SO-100 έναντι SO-101 πρώτα: το SO-101 είναι η νεότερη αναθεώρηση με βελτιωμένη καλωδίωση και χωρίς βήμα αφαίρεσης γραναζιών, και η ροή εργασίας καταγραφής είναι πανομοιότυπη.

Εγκατάσταση 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 εκτυπώνει μια σύνοψη συστήματος, συμπεριλαμβανομένης της έκδοσης ffmpeg που μπορεί να βρει στο PATH.

Τα πρόσθετα μπερδεύουν τους περισσότερους. pip install lerobot εγκαθιστά μόνο βασικές εξαρτήσεις ML, τίποτα που να επικοινωνεί με ένα ρομπότ. Οι βραχίονες Koch χρειάζονται dynamixel αντί για feetech. Εάν το κέλυφός σας δεν έχει ακούσει ποτέ για το lerobot-record, αυτός είναι ο λόγος.

Θύρες, αναγνωριστικά κινητήρων και βαθμονόμηση

Τρία εφάπαξ βήματα χωρίζουν τα εξαρτήματα από έναν λειτουργικό βρόχο τηλελειτουργίας. επιτρέπει σε μια πολιτική εκπαιδευμένη στον δικό σας βραχίονα να λειτουργεί σε κάποιον άλλον, αντιστοιχίζοντας τις ακατέργαστες μετρήσεις κωδικοποιητή σε μια κοινή σύμβαση άρθρωσης.

  1. 1
    Βρείτε τη θύρα USB κάθε βραχίονα

    Εκτελέστε το με τους δύο βραχίονες συνδεδεμένους, αποσυνδέστε αυτόν που αναγνωρίζετε όταν σας ζητηθεί και σημειώστε ποια θύρα εξαφανίζεται. Σε Linux ενδέχεται να χρειαστείτε 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
    Γράψτε τα αναγνωριστικά κινητήρων και τις ταχύτητες baud

    Τα αναγνωριστικά γράφονται ένας κινητήρας τη φορά, και οι οδηγίες είναι αυστηρές ως προς τον τρόπο: συνδέστε ακριβώς έναν κινητήρα στην πλακέτα ελέγχου, όχι ακόμα σε σειρά με κανέναν άλλο. Το σενάριο διασχίζει την αλυσίδα προς τα πίσω, ζητώντας πρώτα την αρπάγη και δίνοντάς της το αναγνωριστικό 6, μετά τον καρπό (wrist_roll) ως 5, μέχρι τον ώμο (shoulder_pan) ως 1. Κάντε το πριν τη συναρμολόγηση.

    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
    Βαθμονόμηση και των δύο βραχιόνων

    Μετακινήστε κάθε άρθρωση στη μέση του εύρους της, πατήστε Enter και, στη συνέχεια, σαρώστε την πλήρη της εμβέλεια. Το id γίνεται το όνομα αρχείου του προφίλ.

    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
    Τηλελειτουργία πριν από οποιαδήποτε καταγραφή

    Η δοκιμή αποδοχής για όλα τα παραπάνω. Εάν η τηλελειτουργία είναι ασταθής, αντικατοπτρισμένη ή μια άρθρωση δεν ακολουθεί, η καταγραφή το διατηρεί σε 50 επεισόδια.

    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
Πού αποθηκεύεται η βαθμονόμηση και γιατί το αναγνωριστικό έχει σημασία

Τα προφίλ αποθηκεύονται στο $HF_LEROBOT_CALIBRATION, προεπιλογή ~/.cache/huggingface/lerobot/calibration, και το αναγνωριστικό είναι το κλειδί αναζήτησης. Δώστε στο lerobot-record ένα βαθμονομημένο αναγνωριστικό και θα σας προσφέρει Enter για να επαναχρησιμοποιήσετε το προφίλ ή c για να το επαναλάβετε. Δώστε του ένα άγνωστο αναγνωριστικό και δεν υπάρχει αρχείο, οπότε μεταβαίνει σε βαθμονόμηση εν μέσω συνεδρίας.

Οι κάμερες αποφασίζουν τι βλέπει η πολιτική

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
Εκτελέστε αυτό σε κάθε συνεδρία: η τεκμηρίωση προειδοποιεί ότι αυτοί οι αναγνωριστικοί κωδικοί ενδέχεται να αλλάξουν μετά από επανεκκίνηση ή επανασύνδεση, ανάλογα με το λειτουργικό σύστημα.

Δύο όψεις, και η θέση τους έχει σημασία: μια σταθερή κάμερα σκηνής που καλύπτει τον χώρο εργασίας, και μια κάμερα καρπού κοντά στο τελικό εκτελεστικό όργανο που δείχνει τι πρόκειται να αγγίξει η αρπάγη. Η λίστα ελέγχου των συνόλων δεδομένων της κοινότητας LeRobot ζητά κατά προτίμηση δύο όψεις στα 480x640 / 720p ή καλύτερα, ένα στατικό φόντο, ουδέτερο σταθερό φωτισμό, και το κύριο χέρι και τα ανθρώπινα άκρα εκτός κάδρου. Ο οδηγός καταγραφής προσθέτει τον εμπειρικό κανόνα: θα πρέπει να μπορείτε να εκτελέσετε την εργασία μόνοι σας κοιτάζοντας μόνο τις εικόνες της κάμερας.

Ο δείκτης κάμερας δεν είναι σταθερή ταυτότητα

Οι δείκτες OpenCV προέρχονται από τη σειρά απαρίθμησης, οπότε μια επανεκκίνηση ή επανασύνδεση μπορεί να κάνει τους δείκτες 0 και 2 να αλλάξουν θέσεις και να τοποθετήσουν την όψη καρπού στην κορυφαία θέση για ολόκληρη τη συνεδρία. Το lerobot το λέει και το ίδιο: η κλάση κάμερας του δέχεται μια διαδρομή συσκευής καθώς και έναν ακέραιο αριθμό, και προειδοποιεί ότι οι δείκτες είναι ασταθείς σε επανεκκινήσεις ή αλλαγές θυρών, ειδικά στο Linux. Στρέψτε το index_or_path στον συμβολικό σύνδεσμο udev κάτω από το /dev/v4l/by-id/, ο οποίος ακολουθεί τη συσκευή και όχι τη σειρά απαρίθμησης. Αυτός είναι ο πιο συνηθισμένος τρόπος με τον οποίο ένα σύνολο δεδομένων καταλήγει εσωτερικά ασυνεπές, και η εκπαίδευση δεν μπορεί να το επιδιορθώσει. Η κάμερα δεν ανιχνεύτηκε.

Η εντολή record και κάθε σημαία

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
Το λεξικό της κάμερας είναι μια συμβολοσειρά σε εισαγωγικά κελύφους· οι ένθετες αγκύλες δεν είναι σύνταξη κελύφους.

Οι προεπιλογές παρακάτω προέρχονται από src/lerobot/configs/dataset.py στο main, όχι από ένα σεμινάριο. Αρκετές δεν είναι αυτές που υποθέτουν οι άνθρωποι.

ΣημαίαΠροεπιλογήΤι κάνει
--dataset.repo_idκενόόνομα· χρονοσφραγίδα προστίθεται από προεπιλογή
--dataset.single_taskκενόσυμβολοσειρά εργασίας αποθηκευμένη με κάθε επεισόδιο
--dataset.root$HF_LEROBOT_HOME/repo_idδιαδρομή εγγραφής, προεπιλογή ~/.cache/huggingface/lerobot/
--dataset.fps30ρυθμός βρόχου ελέγχου και ρυθμός καρέ συνόλου δεδομένων
--dataset.episode_time_s60δευτερόλεπτα πριν ένα επεισόδιο προχωρήσει αυτόματα
--dataset.reset_time_s60επαναφορά σκηνής· το ρομποτικό χέρι κινείται, τίποτα δεν αποθηκεύεται
--dataset.num_episodes50επεισόδια που καταγράφηκαν σε αυτήν τη συνεδρία
--dataset.push_to_hubtrueμεταφόρτωση στο τέλος της συνεδρίας· false παραμένει τοπικό
--dataset.streaming_encodingfalse in the dataclass, true in the docs tableκωδικοποίηση κατά τη λήψη· ορίστε το ρητά
--dataset.encoder_queue_maxsize30καρέ σε buffer ανά κάμερα, ~1 δευτ. στα 30 fps
--dataset.encoder_threadsnull (codec decides)νήματα ανά κωδικοποιητή· χαμηλότερα αν η λήψη κολλάει
--dataset.no_stampfalseδιατηρήστε το repo_id ακριβώς όπως πληκτρολογήθηκε
--resumefalseπροσθήκη σε ένα υπάρχον σύνολο δεδομένων· απαιτεί --dataset.root
Δύο σημαίες που κόστισαν μια ώρα απροσδόκητα

Το σύνολο δεδομένων σας δεν ονομάζεται όπως πληκτρολογήσατε. Το lerobot προσθέτει μια ετικέτα ημερομηνίας-ώρας, οπότε το so100_pick_cube γίνεται so100_pick_cube_20260823_141530. Χρησιμοποιήστε το --dataset.no_stamp=true για ένα σταθερό όνομα. Η συνέχιση μετράει προσθήκες, όχι σύνολα. Με το --resume=true, το --dataset.num_episodes μετράει επιπλέον επεισόδια και το --dataset.root γίνεται υποχρεωτικό. Ζητήστε 50 σε ένα σύνολο δεδομένων 30 επεισοδίων και θα λάβετε 80.

Έλεγχος πληκτρολογίου κατά τη διάρκεια μιας συνεδρίας

  • Δεξί βέλος ή n: τερματίστε το επεισόδιο ή επαναφέρετε τη φάση νωρίτερα. Το πλήκτρο που χρησιμοποιείτε περισσότερο, επειδή μια καθαρή σύλληψη σπάνια χρειάζεται 25 δευτερόλεπτα.
  • Αριστερό βέλος ή r: απορρίψτε το επεισόδιο και επαναλάβετε το. Μια κακή λήψη δεν κοστίζει τίποτα τώρα και πολλά αργότερα.
  • Escape ή q: σταματήστε τη συνεδρία, ολοκληρώστε την κωδικοποίηση, ανεβάστε.
  • Αυτά λειτουργούν σε X11, Wayland και headless SSH: χωρίς καθολικό backend πλήκτρων, το lerobot-record διαβάζει τα ίδια πλήκτρα από το τερματικό ελέγχου. Τα γράμματα επιβιώνουν σε αργές συνδέσεις SSH, όπου οι ακολουθίες βελών διαχωρίζονται.
  • Η τηλελειτουργία πληκτρολογίου είναι διαφορετική και χρειάζεται ένα καθολικό backend: X11, Windows, ή macOS με Προσβασιμότητα.

Πόσα επεισόδια, και πώς μοιάζει ένα καλό

Ο οδηγός καταγραφής προτείνει τουλάχιστον 50 επεισόδια για μια πρώτη εργασία, περίπου 10 ανά θέση αντικειμένου. Οι σελίδες πολιτικής αναφέρουν ένα ελάχιστο ανά μοντέλο, κάτω από το οποίο μια εκτέλεση δεν αξίζει τον χρόνο της GPU.

ΠολιτικήΕλάχιστα επεισόδιαΜορφή συνόλου δεδομένωνΚατηγορία GPUΚόστος ανά εκτέλεση
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

Η καλύτερη ερώτηση είναι πόσα από τι. Νόμοι Κλιμάκωσης Δεδομένων στην Εκμάθηση Μίμησης για Ρομποτική Χειραγώγηση (Lin et al., 2024) συνέλεξε πάνω από 40.000 επιδείξεις και πραγματοποίησε περισσότερες από 15.000 πραγματικές εκτελέσεις. Η γενίκευση ακολούθησε μια σχέση περίπου νόμου δύναμης με τον αριθμό των περιβαλλόντων και αντικειμένων, και πέρα από ένα όριο ανά περιβάλλον ή αντικείμενο, οι επιπλέον επιδείξεις είχαν ελάχιστη επίδραση. Σε ένα πάγκο: μετακινήστε το αντικείμενο, αλλάξτε τον φωτισμό, ανταλλάξτε τον κύβο, αντί να επαναλάβετε μία λήψη.

Τηλεχειρισμός Leader-follower ως πηγή δεδομένων
Πλεονεκτήματα
  • Συνεχείς τροχιές αρθρώσεων που μπορεί να αναπαράγει ένας σερβοκινητήρας, σε αντίθεση με πληκτρολόγιο ή gamepad
  • Η ενέργεια και η κατάσταση μοιράζονται μια σύμβαση συντεταγμένων, οπότε η πολιτική μαθαίνει έναν στόχο που μπορεί να διατάξει απευθείας
  • Ένα επεισόδιο 25 δευτερολέπτων συν μια επαναφορά 10 δευτερολέπτων είναι περίπου 100 επεισόδια την ώρα
  • Ο χειριστής αισθάνεται τον follower να κολλάει ή να μπλοκάρει, οπότε οι βλάβες εμφανίζονται πριν δεσμευτούν τα δεδομένα
Αντισταθμίσεις
  • Ένας δεύτερος βραχίονας διπλασιάζει περίπου το κόστος των εξαρτημάτων
  • Οι επιδείξεις κληρονομούν τις συνήθειες του χειριστή· οι Mandlekar et al. διαπίστωσαν ότι η ποιότητα της πολιτικής εξαρτάται σε μεγάλο βαθμό από την ποιότητα της επίδειξης
  • Ο leader λαμβάνεται δείγμα με τον ρυθμό του βρόχου, οπότε οι παύσεις γίνονται σχεδόν πανομοιότυπες γραμμές που διδάσκουν την πολιτική να περιμένει
  • Τίποτα δεν επιβάλλει συνέπεια μεταξύ των συνεδριών: μια κάμερα που μετακινήθηκε 5 cm είναι μια κρυφή μετατόπιση κατανομής

Ένα καλό επεισόδιο είναι βαρετό: επαναλαμβανόμενη αρχική πόζα, ένα πράγμα γίνεται, τελειώνει μόλις το αντικείμενο μπει στον κάδο, συμβολοσειρά εργασίας στους 25 έως 50 χαρακτήρες που συνιστά η λίστα ελέγχου. Pick the red cube and drop it in the box είναι μια συμβολοσειρά εργασίας· task1 είναι το αντι-μοτίβο που αναφέρει ρητά η λίστα ελέγχου. Οι ασαφείς σημειώσεις βρίσκονται στην κορυφή της λίστας προβλημάτων της, και έχουν τη μεγαλύτερη σημασία για μοντέλα όρασης-γλώσσας-δράσης, όπου η συμβολοσειρά είναι είσοδος μοντέλου, όχι όνομα αρχείου.

Ελαττώματα που καταστρέφουν αθόρυβα ένα σύνολο δεδομένων

Κανένα δεν προκαλεί εξαίρεση. Όλα επιβιώνουν στην εκπαίδευση, εμφανιζόμενα ως μια καμπύλη απώλειας που φαίνεται εντάξει και ένα ρομπότ που δεν κάνει τίποτα. Ελέγξτε ενώ η σκηνή είναι στημένη.

ΕλάττωμαΠώς φαίνεταιΑπό πού προέρχεταιΠώς να το εντοπίσετε
Ανταλλαγμένες προβολές κάμεραςεικόνα καρπού κάτω από το επάνω κλειδίεπαναπροσδιορισμός δείκτη μετά από επανασύνδεσηlerobot-find-cameras each session; by-id paths
Παγωμένα καρέη ίδια εικόνα για δεκάδες γραμμέςη κάμερα σταματά να παραδίδει· ο βρόχος επαναλαμβάνει το τελευταίο καρέscrub it in lerobot-dataset-viz
Πεσμένα καρέαριθμός γραμμών κάτω από fps επί δευτερόλεπταη ουρά υπερχειλίζει, απορρίπτει αντί να μπλοκάρει'Encoder queue full' in the log; rows vs fps times duration
Άρθρωση στο όριό τηςμία άρθρωση επίπεδη στο ελάχιστο ή μέγιστοτο εύρος του ηγέτη υπερβαίνει αυτό του ακόλουθου, ή μια κακή ενδιάμεση πόζαper-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand
Εικόνα και δράση εκτός συγχρονισμούη πολιτική προλαμβάνει ή καθυστερείκάμερες σε διαφορετικό fps από τον βρόχοkeep every camera at --dataset.fps
Νεκρός χρόνοςμεγάλες ακολουθίες πανομοιότυπων γραμμών δράσηςο χειριστής έκανε παύση με την εγγραφή σε λειτουργίαshare of consecutive identical action rows
Μη χρησιμοποιήσιμη συμβολοσειρά εργασίαςtask1, demo2, testγρήγορη πληκτρολόγησηmeta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks
Τα χαμένα καρέ κρύβονται

Ο κωδικοποιητής διατηρεί μια περιορισμένη ουρά ανά κάμερα, 30 καρέ από προεπιλογή. Όταν δεν μπορεί να ανταποκριθεί, τα καρέ απορρίπτονται αντί να μπλοκάρονται: η λήψη συνεχίζεται και τίποτα δεν κρασάρει. Λαμβάνετε Encoder queue full for {camera}, dropped N frame(s) και ένα σύνολο ανά κάμερα στο τέλος του επεισοδίου. Το όριο του lerobot: περίπου 5 τοις εκατό απώλειας σημαίνει υπερφορτωμένο σύστημα, 2 τοις εκατό είναι αναμενόμενο φορτίο εκκίνησης. Λύσεις κατά σειρά: --display_data=false, χαμηλότερο --dataset.encoder_threads, vcodec=h264, απενεργοποίηση streaming.

Μια προειδοποίηση: ο πίνακας του οδηγού streaming-encoding αναφέρει την προεπιλογή ως True, ενώ η dataclass στο main αναφέρει streaming_encoding: bool = False. Η τεκμηρίωση και ο κώδικας διαφωνούν, οπότε ορίστε το ρητά· το lerobot καταγράφει μια υπόδειξη που το συνιστά κάθε φορά που ξεκινά με την σημαία απενεργοποιημένη.

Ελέγξτε το σύνολο δεδομένων πριν νοικιάσετε μια GPU

Η δοκιμή αποδοχής από την τεκμηρίωση: συγκρίνετε τη διάρκεια του βίντεο με τη διάρκεια του επεισοδίου που ανέφερε το CLI, και επιβεβαιώστε ότι ο αριθμός των γραμμών ισούται με fps επί διάρκεια. Ανά επεισόδιο, όχι στο σύνολο.

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"])
Ένα επεισόδιο που απέχει πολύ από το fps επί τη διάρκεια είναι υποψήφιο για διαγραφή, όχι για εκπαίδευση.

Στη συνέχεια, δείτε το. lerobot-dataset-viz αναπαράγει ένα επεισόδιο καρέ-καρέ με ίχνη αρθρώσεων δίπλα στις προβολές της κάμερας, στο Rerun ή στο Foxglove. Οι εναλλαγμένες κάμερες και τα παγωμένα καρέ εμφανίζονται σε δέκα δευτερόλεπτα. Οι άνθρωποι παραλείπουν αυτό το βήμα.

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 εκτελεί επίσης διαχωρισμό, συγχώνευση, αφαίρεση χαρακτηριστικού, τροποποίηση εργασιών και επανυπολογισμό στατιστικών. Διαγράψτε γενναιόδωρα: ένα κακό επεισόδιο κοστίζει ένα επεισόδιο· η διατήρησή του κοστίζει κάθε εκτέλεση που εκπαιδεύτηκε σε αυτό.
Ο κατάλογος δεδομένων AY-Robots που παραθέτει δημόσια σύνολα δεδομένων LeRobot με αριθμούς επεισοδίων και μορφές
Πώς τα συγκρίσιμα σύνολα δεδομένων διαστασιολογούνται και σχολιάζονται.

v2.1 ή v3.0: αποφασίστε πριν την καταγραφή

Το v2.1 έγραφε ένα parquet και ένα MP4 ανά επεισόδιο. Το v3.0 συνενώνει πολλά επεισόδια σε κοινά shards και αναδομεί τα όρια από τα μεταδεδομένα, οπότε το info.json περιέχει πρότυπα διαδρομών όπως data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet αντί για έναν αριθμό επεισοδίου. Η αιτιολόγηση από την πηγή είναι λιγότερα, μεγαλύτερα αρχεία: ταχύτερη αρχικοποίηση και λιγότερη πίεση στο σύστημα αρχείων σε κλίμακα.

LeRobot v2.1LeRobot v3.0
Διάταξηένα parquet και ένα MP4 ανά επεισόδιοπολλά επεισόδια ανά shard
Μεταδεδομένα επεισοδίουΑρχεία JSONLchunked parquet κάτω από το meta/episodes/, μέσω του stack δεδομένων
Streaming από το Hubόχιναι, μέσω του StreamingLeRobotDataset
Γραμμένο από το lerobot 0.6.1όχιναι, αυτό που λαμβάνετε σήμερα
Αναγνώσιμο από GR00T N1.7 και N1.5ναιόχι, πρέπει να μετατραπεί προς τα κάτω
Καταγραφή σήμερα, εκπαίδευση GR00T αύριο

Το lerobot 0.6.1 γράφει v3.0, αλλά τα GR00T N1.7 και N1.5 διαβάζουν v2.0 ή v2.1 και κρασάρουν σε αυτό. Σημειώστε την κατεύθυνση: το src/lerobot/scripts/ περιέχει το convert_dataset_v21_to_v30.py και τίποτα που να πηγαίνει προς την αντίθετη κατεύθυνση. Τακτοποιήστε αυτό πριν από τη συνεδρία. Επιδιόρθωση: το dataset απορρίφθηκε ως 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
Γρήγορο για 50 επεισόδια. Η κλιμάκωση είναι διαφορετική δουλειά: ο οδηγός μεταφοράς του lerobot, για ακατέργαστο DROID σε v3.0, προβλέπει 7+ ημέρες τοπικής επεξεργασίας και περίπου 400 GB.

Δύο διαδρομές προς το ίδιο σύνολο δεδομένων

Όλα τα παραπάνω, στη δική σας μηχανή: εσείς έχετε την κυριότητα της απαρίθμησης USB, της κατασκευής ffmpeg, της ρύθμισης του κωδικοποιητή και των αρχείων βαθμονόμησης. Η σωστή διαδρομή για να κατανοήσετε την pipeline, να χρησιμοποιήσετε μια ασυνήθιστη διάταξη κάμερας ή να διατηρήσετε τα δεδομένα τοπικά.

Τι κοστίζει αυτή η διαδρομή

Χρόνος: ένα βράδυ ανά βραχίονα για συναρμολόγηση, μια δύσκολη πρώτη βαθμονόμηση και μια πρώτη συνεδρία που θα πετάξετε επειδή μια κάμερα ήταν στη λάθος υποδοχή.

Καταγράψτε σύνολα δεδομένων LeRobot χωρίς να συνδέσετε μόνοι σας την pipeline

Ο επιτραπέζιος πελάτης AY-Robots καταγράφει επεισόδια, ροές κάμερας και καταστάσεις αρθρώσεων σε μορφή LeRobot από μια συνεδρία τηλελειτουργίας, και στη συνέχεια παραδίδει το σύνολο δεδομένων στον εκπαιδευτή.

Αποκτήστε τον επιτραπέζιο πελάτη

Από το σύνολο δεδομένων στην πολιτική

Πενήντα καθαρά επεισόδια τροφοδοτούν κάθε εκτέλεση εδώ. εκπαιδεύεται από την αρχή μόνο στην εργασία σας, περίπου 80 εκατομμύρια παραμέτρους με περίπου 20 ms ανά βήμα ενέργειας, το μόνο από τα πέντε που είναι άνετο με γρήγορη κίνηση. είναι περίπου 450 εκατομμύρια παράμετροι σε μια κάρτα 24 GB. είναι ένα μοντέλο βάσης περίπου 3 δισεκατομμυρίων παραμέτρων όπου αγγίζει περίπου 40 εκατομμύρια παραμέτρους, χρειάζεται μια A100 ή H100 και θέλει αυτό το σύνολο δεδομένων v2.1.

Στη συνέχεια, ο οδηγός για τον συνδυασμό σας: , ή · για μια πρώτη εκτέλεση, είναι συντομότερος. Όταν η πολιτική λειτουργεί στον πάγκο αλλά καταρρέει τη στιγμή που μετακινείτε το τραπέζι, αυτό είναι ένα πρόβλημα δεδομένων: και εμβαθύνουν στην ποικιλομορφία.

Πόσα επεισόδια χρειάζομαι πραγματικά για μια πρώτη λειτουργική πολιτική;

Τριάντα για το SmolVLA, πενήντα για τα ACT, Pi0.5, GR00T N1.5 και N1.7, τα ελάχιστα που επιβάλλουν οι εκπαιδευτές AY-Robots. Ο οδηγός LeRobot συνιστά ανεξάρτητα τουλάχιστον 50 για μια πρώτη εργασία, περίπου 10 ανά θέση αντικειμένου. Η εργασία κλιμάκωσης δεδομένων διαπίστωσε ότι η γενίκευση κλιμακώνεται με περιβάλλοντα και αντικείμενα και όχι με τον αριθμό των επιδείξεων, οπότε εκατό λήψεις μιας σκηνής είναι χειρότερες από πενήντα σε πέντε τοποθετήσεις.

Χρειάζομαι ένα κύριο βραχίονα, ή μπορώ να τηλεχειριστώ με πληκτρολόγιο;

Το lerobot παρέχει τηλεχειριστήρια πληκτρολογίου και gamepad, οπότε ένας κύριος βραχίονας δεν είναι απολύτως απαραίτητος, αλλά είναι πολύ προτιμότερος: ο κύριος-ακόλουθος δίνει συνεχείς τροχιές αρθρώσεων στη συνθήκη συντεταγμένων της καταγεγραμμένης ενέργειας, ενώ η εισαγωγή πληκτρολογίου παράγει διακεκομμένη κίνηση που μια πολιτική μαθαίνει ως απότομη κίνηση. Η τηλελειτουργία πληκτρολογίου χρειάζεται επίσης ένα καθολικό backend πλήκτρων, οπότε αποτυγχάνει σε Wayland και headless.

Μπορώ να καταγράψω σε ένα Raspberry Pi ή σε ένα μικρό mini PC;

Ναι, με ρύθμιση. Ο οδηγός streaming-encoding έχει μια κατηγορία χαμηλών πόρων που καλύπτει σύγχρονους υπολογιστές 4 πυρήνων και το Raspberry Pi 5, και τοποθετεί δύο κάμερες στα 640x480 και 30 fps στη στήλη του που απαιτεί κάποια ρύθμιση. Η συμβουλή του: σταματήστε τον κωδικοποιητή να ανταγωνίζεται τον βρόχο καταγραφής, μέσω --dataset.rgb_encoder.vcodec=h264 και --dataset.streaming_encoding=false. Βαθμολογεί δύο κάμερες στα 640x480 ως περίπου 55 εκατομμύρια pixel ανά δευτερόλεπτο και δύο στα 1920x1080 ως περίπου 373 εκατομμύρια.

Πώς ξέρω ότι το σύνολο δεδομένων που μόλις κατέγραψα είναι πραγματικά υγιές;

Τρεις φθηνοί έλεγχοι. Συγκρίνετε τη διάρκεια βίντεο κάθε επεισοδίου με τη διάρκεια που ανέφερε το CLI και επιβεβαιώστε ότι ο αριθμός γραμμών ισούται με τα fps επί αυτή τη διάρκεια, ανά επεισόδιο και όχι στο σύνολο· αυτή είναι η δοκιμή αποδοχής που δίνει ο οδηγός κωδικοποίησης του lerobot. Διαβάστε το ds.meta.stats, όπου μια άρθρωση της οποίας το ελάχιστο ισούται με το μέγιστο δεν κινήθηκε ποτέ. Στη συνέχεια, αναπαράγετε δύο ή τρία επεισόδια στο lerobot-dataset-viz, ο μόνος τρόπος να εμφανιστούν οι εναλλαγμένες προβολές και τα παγωμένα καρέ. Για τα χαμένα καρέ, ο οδηγός θέτει το όριο στο περίπου 5 τοις εκατό που λείπει· περίπου 2 τοις εκατό είναι φυσιολογικό παροδικό φορτίο, συχνά απλώς κατά την εκκίνηση.

Η εργασία εκπαίδευσής μου απέρριψε το σύνολο δεδομένων ως v3.0. Τι κάνω τώρα;

Τα GR00T N1.7 και N1.5 διαβάζουν LeRobot v2.0 ή v2.1 και καταρρέουν στο v3.0, το οποίο είναι αυτό που καταγράφει το lerobot 0.6.1. Είτε καθορίστε τη μορφή πριν την εκπαίδευση, είτε χρησιμοποιήστε μια πολιτική που διαβάζει το v3.0 εγγενώς: Pi0.5, SmolVLA ή ACT. Το lerobot παρέχει έναν μετατροπέα από v2.1 σε v3.0 και τίποτα αντίστροφα.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started