SO-100 आर्म के साथ अपना पहला LeRobot डेटासेट रिकॉर्ड करने के लिए AY-Robots ट्यूटोरियल पृष्ठ
LeRobotSO-100डेटासेट रिकॉर्डिंगटेलीऑपरेशनइमिटेशन लर्निंग

SO-100 के साथ अपना पहला LeRobot डेटासेट रिकॉर्ड करें

AY-Robots ResearchAugust 23, 202616 मिनट पढ़ने में

SO-100 के साथ एक प्रयोग करने योग्य LeRobot डेटासेट रिकॉर्ड करें: कैलिब्रेशन, लीडर-फॉलोअर टेलीऑपरेशन, वास्तविक lerobot-record फ़्लैग और डिफ़ॉल्ट, कैमरा सेटअप, एपिसोड गणना, और वे दोष जो एक रन को बर्बाद कर देते हैं।

एक SO-100 फॉलोअर, उसी डिज़ाइन का एक लीडर आर्म और दो USB कैमरे एक दोपहर में एक पॉलिसी को ठीक कर सकते हैं। वही बेंच आसानी से साठ एपिसोड बना सकती है जो फ़ाइल ब्राउज़र में स्वस्थ दिखते हैं और छह घंटे के GPU रन को बर्बाद कर सकते हैं। अंतर शायद ही कभी मॉडल होता है; यह वह है जो सर्वो और पारकेट फ़ाइल के बीच हुआ।

यहाँ मैनुअल तरीका है, फिर छोटा वाला। हर कमांड lerobot 0.6.1 से है, जो 3 अगस्त 2026 को जारी किया गया था और PyPI पर वर्तमान है। यह कंसोल एंट्री पॉइंट पर चला गया है, इसलिए जो ट्यूटोरियल चलाते हैं 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 s, 60 s रीसेट, 50 एपिसोड, लगभग 100 मिनट का वॉल क्लॉक।
  • यहां न्यूनतम एपिसोड: SmolVLA के लिए 30, बाकी के लिए 50।
  • विविधता मात्रा से बेहतर है। डेटासेट चार चीजों से खराब होते हैं: बदले हुए कैमरा इंडेक्स, छूटे हुए या जमे हुए फ़्रेम, अपनी सीमा पर रुका हुआ एक जॉइंट, एक अपठनीय कार्य स्ट्रिंग।

एक रिकॉर्डिंग सेशन क्या कैप्चर करता है

एक LeRobot डेटासेट वीडियो का एक फ़ोल्डर नहीं है, बल्कि वीडियो के साथ एक समय-अनुक्रमित तालिका है: प्रत्येक कंट्रोल-लूप टिक एक पंक्ति लिखता है जिसमें कमांड की गई कार्रवाई, अनुयायी द्वारा प्राप्त स्थिति, प्रति कैमरा एक फ्रेम, एक टाइमस्टैम्प और इंडेक्स होते हैं। नीति केवल उन कॉलमों को देखती है। का स्कीमा lerobot/svla_so100_pickplace, जो इसकी meta/info.json से पढ़ा गया है।

फ़ीचरडेटाटाइपआकारयह क्या है
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 आईडी लिखता है: वही छह जॉइंट्स, अलग-अलग कुंजियाँ, जो उस क्षण मायने रखती हैं जब एक कॉन्फ़िग किसी फ़ीचर को नाम से संबोधित करता है।

एक वास्तविक डेटासेट से एक पैमाना

उस डेटासेट में 30 एफपीएस पर 50 एपिसोड और 19,631 फ्रेम हैं: प्रति एपिसोड लगभग 393 फ्रेम, या 13 सेकंड। यदि आपके औसत एक मिनट हैं, तो आप कुछ कठिन कर रहे हैं या दोनों सिरों पर निष्क्रिय समय रिकॉर्ड कर रहे हैं।

LeRobot डेटासेट प्रारूप के लिए AY-Robots शब्दावली प्रविष्टि, जिसमें निर्देशिका लेआउट और मेटाडेटा फ़ाइलें दिखाई गई हैं
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
हब खाताHugging Face राइट टोकनoptional with --dataset.push_to_hub=false
7.4 V, 12 V नहीं

STS3215 दो संस्करणों में आता है: SO-ARM100 README 7.4 V संस्करण को 6 V पर मापे गए 16.5 kg.cm स्टॉल टॉर्क और 12 V संस्करण को 30 kg.cm पर रेट करता है, और यह भी बताता है कि 12 V मोटर लेने का मतलब 5 V वाले के बजाय 12 V 5 A+ सप्लाई खरीदना भी है। सामग्री के बिल में 7.4 V सर्वो सूचीबद्ध हैं। 7.4 V रेटेड सर्वो को 12 V देना उन्हें नष्ट कर देता है, इसलिए कुछ भी तारने से पहले मोटर लेबल पढ़ें। सर्वो प्रतिक्रिया नहीं दे रहा है

यदि हाथ अभी तक नहीं बना है, तो वह एक अलग शाम का काम है: यहां से शुरू करें और . यदि आपने कुछ भी नहीं खरीदा है, तो पहले पढ़ें: 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 निर्भरताएँ स्थापित करता है, रोबोट से बात करने वाला कुछ भी नहीं। कोच आर्म्स को dynamixel के बजाय feetech की आवश्यकता होती है। यदि आपके शेल ने कभी lerobot-record के बारे में नहीं सुना है, तो यही कारण है।

पोर्ट्स, मोटर आईडी और कैलिब्रेशन

पार्ट्स और एक कार्यशील टेलीऑप लूप के बीच तीन एक-बार के चरण हैं। आपके आर्म पर प्रशिक्षित एक नीति को किसी और के आर्म पर चलाने में मदद करता है, जो रॉ एनकोडर काउंट्स को एक साझा जॉइंट कन्वेंशन पर मैप करता है।

  1. 1
    प्रत्येक आर्म का USB पोर्ट ढूंढें

    इसे दोनों आर्म्स को प्लग इन करके चलाएं, जब संकेत मिले तो जिस आर्म की पहचान कर रहे हैं उसे अनप्लग करें, और ध्यान दें कि कौन सा पोर्ट गायब हो जाता है। लिनक्स पर आपको 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
    मोटर आईडी और बॉडरेट लिखें

    आईडी एक समय में एक मोटर पर लिखे जाते हैं, और दस्तावेज़ इस बारे में सख्त हैं कि कैसे: कंट्रोलर बोर्ड से ठीक एक मोटर कनेक्ट करें, जो अभी तक किसी और से डेज़ी-चेन नहीं है। स्क्रिप्ट चेन को पीछे की ओर चलती है, पहले ग्रिपर के लिए संकेत देती है और उसे आईडी 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
    दोनों आर्म्स को कैलिब्रेट करें

    प्रत्येक जॉइंट को उसकी रेंज के मध्य में ले जाएं, एंटर दबाएं, फिर प्रत्येक को उसकी पूरी रेंज में घुमाएं। 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 को एक कैलिब्रेटेड आईडी दें और यह प्रोफाइल को फिर से उपयोग करने के लिए एंटर या इसे फिर से करने के लिए 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 स्वयं कहता है: इसकी कैमरा क्लास एक डिवाइस पाथ के साथ-साथ एक पूर्णांक भी लेती है, और चेतावनी देती है कि इंडेक्स रीबूट या पोर्ट परिवर्तनों के दौरान अस्थिर होते हैं, खासकर लिनक्स पर। index_or_path को /dev/v4l/by-id/ के तहत udev सिम्लिंक पर इंगित करें, जो गणना क्रम के बजाय डिवाइस का अनुसरण करता है। यह सबसे आम तरीका है जिससे एक डेटासेट आंतरिक रूप से असंगत हो जाता है, और प्रशिक्षण इसे ठीक नहीं कर सकता है। कैमरा डिटेक्ट नहीं हुआ

रिकॉर्ड कमांड और हर फ़्लैग

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 मुख्य से आते हैं, किसी ट्यूटोरियल से नहीं। कई ऐसे नहीं हैं जैसा लोग मानते हैं।

फ़्लैगडिफ़ॉल्टयह क्या करता है
--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_encodingडेटाक्लास में false, डॉक्स टेबल में trueकैप्चर के दौरान एन्कोड करें; इसे स्पष्ट रूप से सेट करें
--dataset.encoder_queue_maxsize30प्रति कैमरा बफ़र किए गए फ़्रेम, 30 fps पर ~1 सेकंड
--dataset.encoder_threadsशून्य (कोडेक तय करता है)प्रति एन्कोडर थ्रेड्स; यदि कैप्चर अटकता है तो कम करें
--dataset.no_stampfalserepo_id को ठीक वैसे ही रखें जैसा टाइप किया गया है
--resumefalseमौजूदा डेटासेट में जोड़ें; --dataset.root की आवश्यकता है
दो फ़्लैग जो अप्रत्याशित रूप से एक घंटा बर्बाद कर देते हैं

आपका डेटासेट वह नहीं है जो आपने टाइप किया था। lerobot एक दिनांक-समय टैग जोड़ता है, इसलिए so100_pick_cube so100_pick_cube_20260823_141530 बन जाता है। स्थिर नाम के लिए --dataset.no_stamp=true का उपयोग करें। रिज्यूम केवल अतिरिक्त गणना करता है, कुल नहीं। --resume=true के साथ, --dataset.num_episodes अतिरिक्त एपिसोड की गणना करता है और --dataset.root अनिवार्य हो जाता है। 30-एपिसोड वाले डेटासेट पर 50 के लिए पूछने पर आपको 80 मिलते हैं।

एक सत्र के दौरान कीबोर्ड नियंत्रण

  • दायाँ तीर या n: एपिसोड समाप्त करें या चरण को जल्दी रीसेट करें। यह वह कुंजी है जिसका आप सबसे अधिक उपयोग करते हैं, क्योंकि एक साफ पकड़ के लिए शायद ही कभी 25 सेकंड की आवश्यकता होती है।
  • बायाँ तीर या r: एपिसोड को छोड़ दें और इसे फिर से करें। एक खराब टेक की अब कोई कीमत नहीं है और बाद में बहुत कुछ।
  • एस्केप या q: सत्र रोकें, एन्कोडिंग समाप्त करें, अपलोड करें।
  • ये X11, Wayland और हेडलेस SSH पर काम करते हैं: बिना किसी वैश्विक कुंजी बैकएंड के, lerobot-record नियंत्रण टर्मिनल से समान कुंजियाँ पढ़ता है। अक्षर धीमे SSH लिंक पर भी काम करते हैं, जहाँ तीर अनुक्रम विभाजित होते हैं।
  • कीबोर्ड टेलीऑपरेशन अलग है और इसे एक वैश्विक बैकएंड की आवश्यकता होती है: X11, Windows, या एक्सेसिबिलिटी के साथ macOS।

कितने एपिसोड, और एक अच्छा एपिसोड कैसा दिखता है

रिकॉर्डिंग गाइड पहले कार्य के लिए कम से कम 50 एपिसोड का सुझाव देती है, प्रति वस्तु स्थान लगभग 10। पॉलिसी पेज प्रत्येक मॉडल के लिए न्यूनतम सूचीबद्ध करते हैं, जिसके नीचे एक रन जीपीयू समय के लायक नहीं होता।

पॉलिसीन्यूनतम एपिसोडडेटासेट प्रारूपजीपीयू टियरप्रति रन लागत
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

बेहतर सवाल यह है कि कितने और क्या। Data Scaling Laws in Imitation Learning for Robotic Manipulation (लिन एट अल., 2024) ने 40,000 से अधिक प्रदर्शन एकत्र किए और 15,000 से अधिक वास्तविक-विश्व रोलआउट चलाए। सामान्यीकरण ने वातावरण और वस्तुओं की संख्या के साथ लगभग एक शक्ति-नियम संबंध का पालन किया, और प्रति वातावरण या वस्तु एक सीमा से आगे, अतिरिक्त प्रदर्शनों का न्यूनतम प्रभाव पड़ा। एक बेंच पर: वस्तु को हिलाएं, प्रकाश बदलें, क्यूब को बदलें, बजाय एक ही टेक को दोहराने के।

डेटा स्रोत के रूप में लीडर-फॉलोअर टेलीऑपरेशन
फायदे
  • निरंतर संयुक्त प्रक्षेपवक्र जिन्हें एक सर्वो पुनरुत्पादित कर सकता है, कीबोर्ड या गेमपैड के विपरीत
  • एक्शन और स्टेट एक समन्वय परंपरा साझा करते हैं, इसलिए पॉलिसी एक लक्ष्य सीखती है जिसे वह सीधे कमांड कर सकती है
  • एक 25 सेकंड का एपिसोड और 10 सेकंड का रीसेट प्रति घंटे लगभग 100 एपिसोड होता है
  • ऑपरेटर को फॉलोअर के रुकने या अटकने का एहसास होता है, इसलिए डेटा प्रतिबद्ध होने से पहले त्रुटियां सामने आ जाती हैं
समझौते
  • एक दूसरी भुजा पुर्जों की लागत को लगभग दोगुना कर देती है
  • प्रदर्शन ऑपरेटर की आदतों को विरासत में लेते हैं; मंडलेकर एट अल. ने पाया कि पॉलिसी की गुणवत्ता प्रदर्शन की गुणवत्ता पर बहुत अधिक निर्भर करती है
  • लीडर को लूप दर पर सैंपल किया जाता है, इसलिए ठहराव लगभग समान पंक्तियाँ बन जाते हैं जो पॉलिसी को प्रतीक्षा करना सिखाते हैं
  • सत्रों के बीच कोई भी चीज़ निरंतरता लागू नहीं करती है: 5 सेमी हिलाया गया कैमरा एक छिपा हुआ वितरण बदलाव है

एक अच्छा एपिसोड उबाऊ होता है: दोहराने योग्य होम पोज़, एक काम पूरा हुआ, वस्तु के डिब्बे में होने के बाद समाप्त हुआ, टास्क स्ट्रिंग 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) और एपिसोड के अंत में प्रति-कैमरा कुल संख्या मिलती है। लेरोबोट थ्रेशोल्ड: लगभग 5 प्रतिशत फ़्रेम गायब होने का मतलब है एक ओवरलोडेड सिस्टम, 2 प्रतिशत अपेक्षित स्टार्टअप लोड है। समाधान क्रम में: --display_data=false, --dataset.encoder_threads कम करें, vcodec=h264, स्ट्रीमिंग बंद करें।

एक चेतावनी: स्ट्रीमिंग-एनकोडिंग गाइड की तालिका में डिफ़ॉल्ट के रूप में True, जबकि मुख्य पर डेटाक्लास पढ़ता है streaming_encoding: bool = False. दस्तावेज़ और कोड असहमत हैं, इसलिए इसे स्पष्ट रूप से सेट करें; लेरोबोट एक संकेत लॉग करता है जो इसकी सिफारिश करता है जब भी यह फ़्लैग बंद करके शुरू होता है।

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 स्प्लिट, मर्ज, remove_feature, modify_tasks और आँकड़ों की पुनर्गणना भी करता है। उदारता से हटाएँ: एक खराब एपिसोड की कीमत एक एपिसोड है; इसे रखने से उस पर प्रशिक्षित हर रन की कीमत चुकानी पड़ती है।
AY-Robots डेटासेट निर्देशिका सार्वजनिक LeRobot डेटासेट को एपिसोड गणना और प्रारूपों के साथ सूचीबद्ध करती है।
तुलनीय डेटासेट का आकार और एनोटेशन कैसे किया जाता है।

v2.1 या v3.0: रिकॉर्ड करने से पहले तय करें

v2.1 ने प्रति एपिसोड एक पारकेट और एक MP4 लिखा। v3.0 कई एपिसोड को साझा शार्ड में जोड़ता है और मेटाडेटा से सीमाओं का पुनर्निर्माण करता है, इसलिए info.json पाथ टेम्प्लेट को इस तरह वहन करता है data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet एक एपिसोड संख्या के बजाय। अपस्ट्रीम औचित्य कम, बड़ी फाइलें हैं: तेजी से आरंभीकरण और बड़े पैमाने पर कम फाइल-सिस्टम दबाव।

LeRobot v2.1LeRobot v3.0
लेआउटप्रति एपिसोड एक पारकेट और एक MP4प्रति शार्ड कई एपिसोड
एपिसोड मेटाडेटाJSONL फाइलेंmeta/episodes/ के तहत चंक्ड पारकेट, डेटासेट स्टैक के माध्यम से
हब से स्ट्रीमिंगनहींहाँ, 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 और कुछ भी दूसरी तरफ नहीं जा रहा है। सत्र से पहले इसे सुलझा लें। समाधान: 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 बिल्ड, एन्कोडर ट्यूनिंग और कैलिब्रेशन फ़ाइलें आपकी अपनी हैं। पाइपलाइन को समझने, एक असामान्य कैमरा रिग चलाने, या डेटा को स्थानीय रखने का यह सही तरीका है।

इस तरीके की लागत

समय: प्रत्येक आर्म को असेंबल करने के लिए एक शाम, एक मुश्किल पहला कैलिब्रेशन, और एक पहला सत्र जिसे आप फेंक देते हैं क्योंकि कैमरा गलत स्लॉट में था।

पाइपलाइन को स्वयं वायर्ड किए बिना LeRobot डेटासेट रिकॉर्ड करें

AY-Robots डेस्कटॉप क्लाइंट एक टेलीऑपरेशन सत्र से LeRobot फॉर्मेट में एपिसोड, कैमरा स्ट्रीम और जॉइंट स्टेट्स रिकॉर्ड करता है, फिर डेटासेट को ट्रेनर को सौंपता है।

डेस्कटॉप क्लाइंट प्राप्त करें

डेटासेट से पॉलिसी तक

पचास स्वच्छ एपिसोड हर रन को फीड करते हैं। आपके कार्य पर अकेले ही खरोंच से प्रशिक्षित होता है, लगभग 80 मिलियन पैरामीटर प्रति एक्शन स्टेप लगभग 20 मिलीसेकंड पर, पांच में से एकमात्र जो तेज़ गति के साथ सहज है। 24 GB कार्ड पर लगभग 450 मिलियन पैरामीटर है। एक लगभग 3 बिलियन पैरामीटर का फाउंडेशन मॉडल है जहाँ लगभग 40 मिलियन पैरामीटर को छूता है, इसे A100 या H100 की आवश्यकता होती है, और वह v2.1 डेटासेट चाहता है।

अगला, आपके संयोजन के लिए मार्गदर्शिका: , या ; पहली बार चलाने के लिए, छोटा है। जब पॉलिसी बेंच पर काम करती है लेकिन जैसे ही आप टेबल हिलाते हैं, वह ढह जाती है, तो यह एक डेटा समस्या है: और विविधता पर गहराई से जाते हैं।

पहली कार्यशील पॉलिसी के लिए मुझे वास्तव में कितने एपिसोड की आवश्यकता है?

SmolVLA के लिए तीस, ACT, Pi0.5, GR00T N1.5 और N1.7 के लिए पचास, AY-Robots ट्रेनर द्वारा लागू किए गए न्यूनतम। LeRobot गाइड स्वतंत्र रूप से पहले कार्य के लिए कम से कम 50 की सिफारिश करता है, प्रति वस्तु स्थान लगभग 10। डेटा-स्केलिंग कार्य ने पाया कि सामान्यीकरण प्रदर्शन गणना के बजाय वातावरण और वस्तुओं के साथ बढ़ता है, इसलिए एक दृश्य के सौ टेक पांच प्लेसमेंट में पचास से भी बदतर हैं।

क्या मुझे एक लीडर आर्म की आवश्यकता है, या मैं कीबोर्ड से टेलीऑपरेट कर सकता हूँ?

lerobot कीबोर्ड और गेमपैड टेलीऑपरेटर प्रदान करता है, इसलिए एक लीडर आर्म की सख्त आवश्यकता नहीं है, लेकिन यह अत्यधिक बेहतर है: लीडर-फॉलोअर रिकॉर्ड की गई कार्रवाई के समन्वय सम्मेलन में निरंतर संयुक्त प्रक्षेपवक्र देता है, जबकि कीबोर्ड इनपुट एक स्टेपड मोशन उत्पन्न करता है जिसे पॉलिसी झटके के रूप में सीखती है। कीबोर्ड टेलीऑपरेशन को एक ग्लोबल की बैकएंड की भी आवश्यकता होती है, इसलिए यह वेनलैंड और हेडलेस पर विफल रहता है।

क्या मैं रास्पबेरी पाई या एक छोटे मिनी पीसी पर रिकॉर्ड कर सकता हूँ?

हाँ, ट्यूनिंग के साथ। स्ट्रीमिंग-एन्कोडिंग गाइड में एक कम-संसाधन ब्रैकेट है जो आधुनिक 4-कोर मशीनों और रास्पबेरी पाई 5 को कवर करता है, और अपनी 'कुछ ट्यूनिंग की आवश्यकता है' कॉलम में 640x480 और 30 एफपीएस पर दो कैमरे रखता है। इसकी सलाह: --dataset.rgb_encoder.vcodec=h264 और --dataset.streaming_encoding=false के माध्यम से एन्कोडर को कैप्चर लूप के साथ प्रतिस्पर्धा करने से रोकें। यह 640x480 पर दो कैमरों को लगभग 55 मिलियन पिक्सेल प्रति सेकंड और 1920x1080 पर दो को लगभग 373 मिलियन मानता है।

मुझे कैसे पता चलेगा कि मैंने अभी जो डेटासेट रिकॉर्ड किया है वह वास्तव में स्वस्थ है?

तीन सस्ते चेक। प्रत्येक एपिसोड की वीडियो अवधि की तुलना CLI द्वारा रिपोर्ट की गई अवधि से करें और पुष्टि करें कि पंक्ति गणना उस अवधि के एफपीएस गुना के बराबर है, प्रति एपिसोड कुल पर नहीं; यह 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 कनवर्टर प्रदान करता है और विपरीत में कुछ भी नहीं।

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started