
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 से पढ़ा गया है।
| फ़ीचर | डेटाटाइप | आकार | यह क्या है |
|---|---|---|---|
| action | float32 | [6] | लीडर आर्म से जॉइंट लक्ष्य |
| observation.state | float32 | [6] | अनुयायी द्वारा प्राप्त जॉइंट स्थितियाँ |
| observation.images.top | video | [480, 640, 3] | दृश्य कैमरा, MP4 (यहाँ av1) |
| observation.images.wrist | video | [480, 640, 3] | कलाई कैमरा, समान दर |
| timestamp | float32 | [1] | एपिसोड शुरू होने के बाद से सेकंड |
| frame_index, episode_index, index, task_index | int64 | [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 सेकंड। यदि आपके औसत एक मिनट हैं, तो आप कुछ कठिन कर रहे हैं या दोनों सिरों पर निष्क्रिय समय रिकॉर्ड कर रहे हैं।

आपको बेंच पर क्या चाहिए
| वस्तु | विवरण | टिप्पणी |
|---|---|---|
| अनुगामी भुजा | SO-100, छह Feetech STS3215 सर्वो | पुर्जों में लगभग 110 से 150 EUR |
| अग्रणी भुजा | एक दूसरा SO-100, गियर हटा दिए गए | सभी छह अग्रणी मोटरों से गियर हटा दिए गए: केवल एन्कोडर, कम घर्षण |
| शक्ति | सामग्री के बिल में 7.4 V STS3215 संस्करण से मेल खाता हुआ | नीचे दी गई चेतावनी देखें |
| कैमरे | दो USB कैमरे, 640x480 30 fps पर | एक दृश्य अवलोकन, एक कलाई पर |
| होस्ट | Python 3.12 या नया, ffmpeg | requires-python >= 3.12 |
| हब खाता | Hugging Face राइट टोकन | optional with --dataset.push_to_hub=false |
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 स्थापित करें
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एक्स्ट्राज़ (अतिरिक्त) लोगों को सबसे ज़्यादा भ्रमित करते हैं। pip install lerobot केवल मुख्य ML निर्भरताएँ स्थापित करता है, रोबोट से बात करने वाला कुछ भी नहीं। कोच आर्म्स को dynamixel के बजाय feetech की आवश्यकता होती है। यदि आपके शेल ने कभी lerobot-record के बारे में नहीं सुना है, तो यही कारण है।
पोर्ट्स, मोटर आईडी और कैलिब्रेशन
पार्ट्स और एक कार्यशील टेलीऑप लूप के बीच तीन एक-बार के चरण हैं। आपके आर्म पर प्रशिक्षित एक नीति को किसी और के आर्म पर चलाने में मदद करता है, जो रॉ एनकोडर काउंट्स को एक साझा जॉइंट कन्वेंशन पर मैप करता है।
- 1प्रत्येक आर्म का USB पोर्ट ढूंढें
इसे दोनों आर्म्स को प्लग इन करके चलाएं, जब संकेत मिले तो जिस आर्म की पहचान कर रहे हैं उसे अनप्लग करें, और ध्यान दें कि कौन सा पोर्ट गायब हो जाता है। लिनक्स पर आपको
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. - 2मोटर आईडी और बॉडरेट लिखें
आईडी एक समय में एक मोटर पर लिखे जाते हैं, और दस्तावेज़ इस बारे में सख्त हैं कि कैसे: कंट्रोलर बोर्ड से ठीक एक मोटर कनेक्ट करें, जो अभी तक किसी और से डेज़ी-चेन नहीं है। स्क्रिप्ट चेन को पीछे की ओर चलती है, पहले ग्रिपर के लिए संकेत देती है और उसे आईडी 6 देती है, फिर wrist_roll को 5, और shoulder_pan को 1 तक। इसे असेंबली से पहले करें।
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3दोनों आर्म्स को कैलिब्रेट करें
प्रत्येक जॉइंट को उसकी रेंज के मध्य में ले जाएं, एंटर दबाएं, फिर प्रत्येक को उसकी पूरी रेंज में घुमाएं।
idप्रोफाइल फ़ाइलनाम बन जाता है।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 - 4कुछ भी रिकॉर्ड करने से पहले टेलीऑपरेट करें
उपरोक्त सभी के लिए स्वीकृति परीक्षण। यदि टेलीऑपरेशन झटकेदार है, प्रतिबिंबित है, या एक जॉइंट अनुसरण नहीं करेगा, तो रिकॉर्डिंग उसे 50 एपिसोड में संरक्षित करती है।
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
प्रोफाइल $HF_LEROBOT_CALIBRATION पर जाते हैं, डिफ़ॉल्ट ~/.cache/huggingface/lerobot/calibration है, और आईडी लुकअप कुंजी है। lerobot-record को एक कैलिब्रेटेड आईडी दें और यह प्रोफाइल को फिर से उपयोग करने के लिए एंटर या इसे फिर से करने के लिए c प्रदान करता है। इसे एक अज्ञात आईडी दें और कोई फ़ाइल नहीं होगी, इसलिए यह सत्र के बीच में कैलिब्रेशन में चला जाता है।
कैमरे तय करते हैं कि नीति क्या देखती है
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 सिम्लिंक पर इंगित करें, जो गणना क्रम के बजाय डिवाइस का अनुसरण करता है। यह सबसे आम तरीका है जिससे एक डेटासेट आंतरिक रूप से असंगत हो जाता है, और प्रशिक्षण इसे ठीक नहीं कर सकता है। कैमरा डिटेक्ट नहीं हुआ।
रिकॉर्ड कमांड और हर फ़्लैग
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.fps | 30 | कंट्रोल लूप दर और डेटासेट फ़्रेम दर |
| --dataset.episode_time_s | 60 | एक एपिसोड के स्वतः आगे बढ़ने से पहले के सेकंड |
| --dataset.reset_time_s | 60 | दृश्य रीसेट; आर्म चलता है, कुछ भी संग्रहीत नहीं होता |
| --dataset.num_episodes | 50 | इस सत्र में रिकॉर्ड किए गए एपिसोड |
| --dataset.push_to_hub | true | सत्र के अंत में अपलोड करें; false स्थानीय रहता है |
| --dataset.streaming_encoding | डेटाक्लास में false, डॉक्स टेबल में true | कैप्चर के दौरान एन्कोड करें; इसे स्पष्ट रूप से सेट करें |
| --dataset.encoder_queue_maxsize | 30 | प्रति कैमरा बफ़र किए गए फ़्रेम, 30 fps पर ~1 सेकंड |
| --dataset.encoder_threads | शून्य (कोडेक तय करता है) | प्रति एन्कोडर थ्रेड्स; यदि कैप्चर अटकता है तो कम करें |
| --dataset.no_stamp | false | repo_id को ठीक वैसे ही रखें जैसा टाइप किया गया है |
| --resume | false | मौजूदा डेटासेट में जोड़ें; --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। पॉलिसी पेज प्रत्येक मॉडल के लिए न्यूनतम सूचीबद्ध करते हैं, जिसके नीचे एक रन जीपीयू समय के लायक नहीं होता।
| पॉलिसी | न्यूनतम एपिसोड | डेटासेट प्रारूप | जीपीयू टियर | प्रति रन लागत |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
बेहतर सवाल यह है कि कितने और क्या। 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 गुणा अवधि के बराबर है। प्रति एपिसोड, कुल पर नहीं।
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"])फिर इसे देखें। lerobot-dataset-viz Rerun या Foxglove में, कैमरा दृश्यों के बगल में संयुक्त निशान के साथ एक एपिसोड को फ्रेम दर फ्रेम फिर से चलाता है। बदले हुए कैमरे और जमे हुए फ्रेम दस सेकंड में दिखाई देते हैं। लोग इस कदम को छोड़ देते हैं।
# 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 या v3.0: रिकॉर्ड करने से पहले तय करें
v2.1 ने प्रति एपिसोड एक पारकेट और एक MP4 लिखा। v3.0 कई एपिसोड को साझा शार्ड में जोड़ता है और मेटाडेटा से सीमाओं का पुनर्निर्माण करता है, इसलिए info.json पाथ टेम्प्लेट को इस तरह वहन करता है data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet एक एपिसोड संख्या के बजाय। अपस्ट्रीम औचित्य कम, बड़ी फाइलें हैं: तेजी से आरंभीकरण और बड़े पैमाने पर कम फाइल-सिस्टम दबाव।
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| लेआउट | प्रति एपिसोड एक पारकेट और एक MP4 | प्रति शार्ड कई एपिसोड |
| एपिसोड मेटाडेटा | JSONL फाइलें | meta/episodes/ के तहत चंक्ड पारकेट, डेटासेट स्टैक के माध्यम से |
| हब से स्ट्रीमिंग | नहीं | हाँ, StreamingLeRobotDataset के माध्यम से |
| lerobot 0.6.1 द्वारा लिखा गया | नहीं | हाँ, जो आपको आज मिलता है |
| GR00T N1.7 और N1.5 द्वारा पढ़ा गया | हाँ | नहीं, इसे नीचे परिवर्तित किया जाना चाहिए |
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 के रूप में अस्वीकृत डेटासेट.
# 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एक ही डेटासेट तक पहुँचने के दो तरीके
ऊपर दिया गया सब कुछ, आपकी अपनी मशीन पर: USB एन्यूमरेशन, ffmpeg बिल्ड, एन्कोडर ट्यूनिंग और कैलिब्रेशन फ़ाइलें आपकी अपनी हैं। पाइपलाइन को समझने, एक असामान्य कैमरा रिग चलाने, या डेटा को स्थानीय रखने का यह सही तरीका है।
समय: प्रत्येक आर्म को असेंबल करने के लिए एक शाम, एक मुश्किल पहला कैलिब्रेशन, और एक पहला सत्र जिसे आप फेंक देते हैं क्योंकि कैमरा गलत स्लॉट में था।
डेस्कटॉप क्लाइंट एक टेलीऑपरेशन सत्र से सीधे LeRobot-फॉर्मेट डेटासेट, एपिसोड, कैमरा स्ट्रीम और जॉइंट स्टेट्स रिकॉर्ड करता है। वह डेटासेट प्रशिक्षण फॉर्म को फीड करता है: मॉडल, डेटासेट और हाइपरपैरामीटर चुनें, और बैकएंड मॉडल के VRAM के आकार का एक GPU किराए पर लेता है, ट्रेनर चलाता है और चेकपॉइंट्स को ऑब्जेक्ट स्टोरेज में लिखता है।
- 1क्लाइंट इंस्टॉल करें
डाउनलोड पेज पर; क्लाइंट डॉक्स में सेटअप करें।
- 2टेलीऑप सत्र से रिकॉर्ड करें
आर्म चलाएं; क्लाइंट LeRobot फॉर्मेट में एपिसोड लिखता है। वॉकथ्रू: अपना पहला डेटासेट रिकॉर्ड करें।
- 3या अपना डेटा लाएं
एक डेटासेट Hugging Face रेपो आईडी या आपकी अपनी मशीन से भी आ सकता है: डेटासेट डॉक्स, सार्वजनिक निर्देशिका।
- 4प्रशिक्षित करें और इसे वापस चलाएं
प्रशिक्षण मैट्रिक्स पर संयोजन चुनें, फिर नीति को आर्म पर वापस चलाएं। 24 GB टियर पर लगभग 1 से 3 USD, A100 या H100 टियर पर 4 से 12 USD।
यह आपके आर्म को असेंबल या कैलिब्रेट नहीं करता है, और यह एक दोषपूर्ण एपिसोड की मरम्मत नहीं करता है, इसलिए निरीक्षण चरण अभी भी लागू होता है। दूसरे छोर पर एक कठोर सीमा भी है: तेज़ कार्यों के लिए, अनुमान को सर्वो के बगल में बैठना पड़ता है। नियंत्रण लूप प्रति एक्शन स्टेप 20 से 485 ms तक चलता है, और सार्वजनिक-इंटरनेट राउंड ट्रिप एक काम करने वाली नीति को एक झिझकने वाली नीति में बदल देती है।
पाइपलाइन को स्वयं वायर्ड किए बिना 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
- LeRobot: वास्तविक दुनिया के रोबोट पर अनुकरण सीखना
- LeRobot: SO-100 असेंबली, मोटर सेटअप और कैलिब्रेशन
- LeRobot: कैमरे और lerobot-find-cameras
- LeRobot: इंस्टॉलेशन और एक्स्ट्रा मैट्रिक्स
- LeRobotDataset v3.0: लेआउट और v2.1 माइग्रेशन
- LeRobot: स्ट्रीमिंग वीडियो एन्कोडिंग और छूटे हुए फ़्रेम
- LeRobot: बड़े डेटासेट को v3.0 (DROID) में पोर्ट करना
- lerobot v0.6.1 रिलीज़, 3 अगस्त 2026
- DatasetRecordConfig: वास्तविक रिकॉर्डिंग डिफ़ॉल्ट
- lerobot_record.py: रिकॉर्ड लूप और रेज़्यूमे हैंडलिंग
- TheRobotStudio/SO-ARM100: बिल्ड रेपो और सामग्री का बिल
- Hugging Face: LeRobot कम्युनिटी डेटासेट चेकलिस्ट
- lerobot/svla_so100_pickplace: 50 एपिसोड, 19,631 फ़्रेम
- लिन एट अल. (2024), अनुकरण सीखने में डेटा स्केलिंग नियम
- मंडलेकर एट अल. (2021), ऑफ़लाइन मानव प्रदर्शनों से सीखने में क्या मायने रखता है
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started