
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 आयडी लिहितो: तेच सहा जोडणी, भिन्न की, जे कॉन्फिग वैशिष्ट्याला नावाने संबोधित करते तेव्हा महत्त्वाचे ठरते.
त्या डेटासेटमध्ये 50 एपिसोड आणि 30 fps वर 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 write token | --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-100 सुरुवात करणे आणि संपूर्ण SO-100 सेटअप मार्गदर्शक. जर तुम्ही काहीही विकत घेतले नसेल, तर आधी SO-100 विरुद्ध SO-101 तुलना वाचा: 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 अवलंबित्व स्थापित करते, रोबोटशी संवाद साधणारे काहीही नाही. Koch आर्म्सना dynamixel ऐवजी feetech लागते. जर तुमच्या शेलने कधीही lerobot-record बद्दल ऐकले नसेल, तर हे त्याचे कारण आहे.
पोर्ट्स, मोटर आयडी आणि कॅलिब्रेशन
भाग आणि कार्यरत टेलिओप लूप यांच्यामध्ये तीन एक-वेळच्या पायऱ्या आहेत. तुमच्या आर्मवर प्रशिक्षित केलेली पॉलिसी दुसऱ्याच्या आर्मवर चालवण्यासाठी, रॉ एन्कोडर काउंट्सना सामायिक जॉइंट कन्व्हेन्शनवर मॅप करते.
- 1प्रत्येक आर्मचा USB पोर्ट शोधा
दोन्ही आर्म्स प्लग इन असताना ते चालवा, विचारल्यावर तुम्ही ओळखत असलेला आर्म अनप्लग करा आणि कोणता पोर्ट गायब होतो ते लक्षात घ्या. Linux वर तुम्हाला
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 देते, नंतर रिस्ट-रोलला 5, आणि शोल्डर-पॅनला 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: एपिसोड रद्द करा आणि पुन्हा करा. खराब टेक आता काहीही खर्च करत नाही, पण नंतर खूप खर्चिक ठरू शकते. - Escape किंवा
q: सत्र थांबवा, एन्कोडिंग पूर्ण करा, अपलोड करा. - हे X11, Wayland आणि हेडलेस SSH वर काम करतात: कोणतेही ग्लोबल की बॅकएंड नसताना, lerobot-record कंट्रोलिंग टर्मिनलमधून त्याच कीज वाचते. ही अक्षरे लॅगी SSH लिंक्सवरही काम करतात, जिथे बाणांचे क्रम तुटतात.
- कीबोर्ड टेलिऑपरेशन वेगळे आहे आणि त्याला ग्लोबल बॅकएंडची आवश्यकता आहे: X11, Windows, किंवा Accessibility सह macOS.
किती एपिसोड्स, आणि एक चांगला एपिसोड कसा दिसतो
रेकॉर्डिंग मार्गदर्शक पहिल्या कार्यासाठी किमान 50 एपिसोड्स, प्रत्येक वस्तूच्या स्थानासाठी सुमारे 10, सुचवतो. धोरण पृष्ठे प्रत्येक मॉडेलसाठी किमान संख्या सूचीबद्ध करतात, ज्याखालील रन GPU वेळेसाठी योग्य नाही.
| धोरण | किमान एपिसोड्स | डेटासेट स्वरूप | GPU स्तर | प्रति रन खर्च |
|---|---|---|---|---|
| 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 पेक्षा जास्त वास्तविक-जगातील रोलआउट्स चालवले. सामान्यीकरण हे च्या संख्येनुसार अंदाजे पॉवर-लॉ संबंधाचे अनुसरण करतेenvironments and objects, आणि प्रत्येक वातावरण किंवा वस्तूसाठी एका मर्यादेनंतर, अतिरिक्त प्रात्यक्षिकांचा किमान परिणाम झाला. एका बेंचवर: वस्तू हलवा, प्रकाश बदला, क्यूब अदलाबदल करा, एकाच टेकची पुनरावृत्ती करण्याऐवजी.
- कीबोर्ड किंवा गेमपॅडच्या विपरीत, सर्वो पुनरुत्पादित करू शकणारे सततचे जॉइंट ट्रॅजेक्टरीज
- क्रिया आणि स्थिती एक समन्वय परंपरा सामायिक करतात, त्यामुळे धोरण थेट आज्ञा देऊ शकणारे लक्ष्य शिकते
- 25 सेकंदाचा एपिसोड अधिक 10 सेकंदाचा रीसेट म्हणजे अंदाजे 100 एपिसोड्स प्रति तास
- ऑपरेटरला फॉलोअर थांबलेला किंवा अडकलेला जाणवतो, त्यामुळे डेटा कमिट करण्यापूर्वी दोष समोर येतात
- दुसरा हात अंदाजे भागांची किंमत दुप्पट करतो
- प्रात्यक्षिके ऑपरेटरच्या सवयी वारसाहक्काने घेतात; मंडलेकर एट अल. यांना आढळले की धोरणाची गुणवत्ता प्रात्यक्षिक गुणवत्तेवर मोठ्या प्रमाणात अवलंबून असते
- लीडर लूप दराने सॅम्पल केला जातो, त्यामुळे विराम जवळजवळ एकसारख्या पंक्ती बनतात जे धोरणाला प्रतीक्षा करायला शिकवतात
- सत्रांमध्ये सुसंगतता काहीही लागू करत नाही: 5 सेमी सरकवलेला कॅमेरा हा एक लपलेला वितरण बदल आहे
एक चांगला एपिसोड कंटाळवाणा असतो: पुन्हा पुन्हा करता येणारी होम पोझ, एकच गोष्ट पूर्ण झाली, वस्तू डब्यात टाकल्यावर संपली, चेकलिस्टने शिफारस केलेल्या २५ ते ५० अक्षरांमध्ये टास्क स्ट्रिंग. लाल क्यूब उचला आणि बॉक्समध्ये टाका ही एक टास्क स्ट्रिंग आहे; task1 हे चेकलिस्टने स्पष्टपणे नमूद केलेले अँटी-पॅटर्न आहे. अस्पष्ट ॲनोटेशन्स त्याच्या समस्यांच्या यादीत सर्वात वर आहेत आणि त्या सर्वात महत्त्वाच्या आहेत , जिथे स्ट्रिंग हे मॉडेलचे इनपुट असते, फाइलनाव नाही.
डेटासेटला हळूवारपणे खराब करणारे दोष
यापैकी कोणीही अपवाद (exception) देत नाही. सर्व प्रशिक्षणामध्ये टिकून राहतात, ज्यामुळे लॉस कर्व्ह ठीक दिसतो आणि रोबोट काहीही करत नाही. सीन सेट करतानाच तपासा.
| दोष | कसे दिसते | कुठून येतो | कसे पकडावे |
|---|---|---|---|
| कॅमेरा व्ह्यूजची अदलाबदल | टॉप कीखाली मनगटाची प्रतिमा | पुन्हा जोडल्यानंतर इंडेक्सचे पुनर्नियोजन | 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 |
| प्रतिमा आणि कृती विसंगत | धोरण (policy) आधीच अंदाज लावते किंवा मागे पडते | लूपपेक्षा वेगळ्या 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. डॉक्स आणि कोडमध्ये विसंगती आहे, म्हणून ते स्पष्टपणे सेट करा; जेव्हा ध्वज बंद असतो तेव्हा लेरोबोट ते शिफारस करणारा एक संकेत लॉग करतो.
जीपीयू भाड्याने घेण्यापूर्वी डेटासेट तपासा
डॉक्समधील स्वीकृती चाचणी: व्हिडिओचा कालावधी सीएलआयने नोंदवलेल्या एपिसोडच्या कालावधीशी तुलना करा आणि पंक्तींची संख्या एफपीएस गुणिले कालावधी इतकी असल्याची खात्री करा. प्रत्येक एपिसोडनुसार, एकूण संख्येनुसार नाही.
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 ने प्रत्येक एपिसोडसाठी एक parquet आणि एक MP4 लिहिला. v3.0 अनेक एपिसोड्सना सामायिक शार्ड्समध्ये एकत्र करतो आणि मेटाडेटावरून सीमा पुन्हा तयार करतो, त्यामुळे info.json मध्ये पाथ टेम्पलेट्स असतात जसे की data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet एपिसोड नंबरऐवजी. वरून आलेले समर्थन म्हणजे कमी, मोठ्या फाइल्स: जलद इनिशियलायझेशन आणि मोठ्या प्रमाणावर कमी फाइल-सिस्टम दबाव.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| मांडणी | प्रत्येक एपिसोडसाठी एक parquet आणि एक MP4 | प्रत्येक शार्डमध्ये अनेक एपिसोड्स |
| एपिसोड मेटाडेटा | JSONL फाइल्स | meta/episodes/ अंतर्गत chunked parquet, डेटासेट स्टॅकद्वारे |
| हबमधून स्ट्रीमिंग | नाही | होय, 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 repo id किंवा तुमच्या स्वतःच्या मशीनमधून देखील येऊ शकतो: डेटासेट डॉक्स, सार्वजनिक डिरेक्टरी.
- 4प्रशिक्षित करा आणि परत चालवा
प्रशिक्षण मॅट्रिक्सवर संयोजन निवडा, नंतर आर्मवर पॉलिसी परत चालवा. 24 GB टियरवर अंदाजे 1 ते 3 USD, A100 किंवा H100 टियरवर 4 ते 12.
हे तुमच्या आर्मला एकत्र करत नाही किंवा कॅलिब्रेट करत नाही, आणि ते सदोष एपिसोड दुरुस्त करत नाही, त्यामुळे तपासणीची पायरी अजूनही लागू होते. दुसऱ्या टोकाला एक कठोर मर्यादा देखील आहे: जलद कार्यांसाठी, अनुमान सर्व्होच्या शेजारी असणे आवश्यक आहे. नियंत्रण लूप प्रति क्रिया पायरी 20 ते 485 ms चालतो, आणि सार्वजनिक-इंटरनेटवरील राऊंड ट्रिप्समुळे कार्यरत पॉलिसी संकोचशील बनते.
पाइपलाइन स्वतः जोडल्याशिवाय LeRobot डेटासेट रेकॉर्ड करा
AY-Robots डेस्कटॉप क्लायंट टेलिऑपरेशन सत्रातून LeRobot फॉरमॅटमध्ये एपिसोड्स, कॅमेरा स्ट्रीम्स आणि जॉइंट स्टेट्स रेकॉर्ड करतो, त्यानंतर डेटासेट ट्रेनरला देतो.
डेस्कटॉप क्लायंट मिळवाडेटासेटपासून पॉलिसीपर्यंत
पन्नास स्वच्छ एपिसोड प्रत्येक इमिटेशन लर्निंग येथे चालवले जातात. ACT तुमच्या कार्यासाठी सुरुवातीपासून प्रशिक्षण देते, सुमारे 80 दशलक्ष पॅरामीटर्स प्रति क्रिया स्टेप सुमारे 20 ms मध्ये, पाचपैकी जलद गतीसाठी आरामदायक असलेले हे एकमेव आहे. SmolVLA 24 GB कार्डवर सुमारे 450 दशलक्ष पॅरामीटर्स आहे. GR00T N1.7 हे अंदाजे 3 अब्ज पॅरामीटरचे फाउंडेशन मॉडेल आहे जिथे फाइन-ट्यूनिंग सुमारे 40 दशलक्ष पॅरामीटर्सना स्पर्श करते, त्याला A100 किंवा H100 ची आवश्यकता आहे आणि त्याला तो v2.1 डेटासेट हवा आहे.
पुढे, तुमच्या संयोजनासाठी मार्गदर्शक: ACT on SO-100, SmolVLA on SO-100 किंवा GR00T N1.7 on SO-100; पहिल्या रनसाठी, तुमची पहिली पॉलिसी प्रशिक्षित करा लहान आहे. जेव्हा पॉलिसी बेंचवर काम करते पण तुम्ही टेबल हलवताच ती कोसळते, तेव्हा ती डेटाची समस्या आहे: पॉलिसी फक्त एका सेटअपमध्ये काम करते आणि उच्च-गुणवत्तेचा VLA प्रशिक्षण डेटा गोळा करणे विविधतेवर अधिक सखोल माहिती देतात.
पहिल्या कार्यरत पॉलिसीसाठी मला खरोखर किती एपिसोड्सची आवश्यकता आहे?▾
SmolVLA साठी तीस, ACT, Pi0.5, GR00T N1.5 आणि N1.7 साठी पन्नास, हे AY-Robots ट्रेनर्सनी लागू केलेले किमान आकडे आहेत. LeRobot मार्गदर्शक स्वतंत्रपणे पहिल्या कार्यासाठी किमान 50 एपिसोड्सची शिफारस करते, प्रति ऑब्जेक्ट स्थान सुमारे 10. डेटा-स्केलिंगच्या कामातून असे दिसून आले आहे की सामान्यीकरण हे प्रात्यक्षिक संख्येऐवजी वातावरण आणि वस्तूंनुसार वाढते, त्यामुळे एका दृश्याचे शंभर टेक्स पाच वेगवेगळ्या स्थानांवरील पन्नास टेक्सपेक्षा वाईट आहेत.
मला लीडर आर्मची गरज आहे की मी कीबोर्डने टेलिऑपरेट करू शकतो?▾
lerobot कीबोर्ड आणि गेमपॅड टेलिऑपरेटर्ससह येते, त्यामुळे लीडर आर्मची सक्तीची आवश्यकता नाही, परंतु तो अत्यंत श्रेयस्कर आहे: लीडर-फॉलोअर रेकॉर्ड केलेल्या क्रियेच्या समन्वय पद्धतीमध्ये सतत जॉइंट ट्रॅजेक्टरीज देतो, तर कीबोर्ड इनपुटमुळे पॉलिसी जर्क म्हणून शिकते अशी स्टेप मोशन तयार होते. कीबोर्ड टेलिऑपरेशनला ग्लोबल की बॅकएंडची देखील आवश्यकता असते, त्यामुळे ते वेयलँड आणि हेडलेसवर अयशस्वी होते.
मी रास्पबेरी पाई किंवा लहान मिनी पीसीवर रेकॉर्ड करू शकतो का?▾
होय, ट्यूनिंगसह. स्ट्रीमिंग-एन्कोडिंग मार्गदर्शकामध्ये आधुनिक 4-कोर मशीन आणि रास्पबेरी पाई 5 ला कव्हर करणारा कमी-संसाधनांचा ब्रॅकेट आहे आणि ते दोन कॅमेरे 640x480 आणि 30 fps वर 'काही ट्यूनिंग आवश्यक' या स्तंभात ठेवते. त्याचा सल्ला: --dataset.rgb_encoder.vcodec=h264 आणि --dataset.streaming_encoding=false द्वारे एन्कोडरला कॅप्चर लूपशी स्पर्धा करण्यापासून थांबवा. ते 640x480 वरील दोन कॅमेऱ्यांना सुमारे 55 दशलक्ष पिक्सेल प्रति सेकंद आणि 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 कनवर्टर पाठवते आणि उलट काहीही नाही.
Sources
- LeRobot: वास्तविक-जगातील रोबोट्सवर अनुकरण शिक्षण
- LeRobot: SO-100 असेंब्ली, मोटर सेटअप आणि कॅलिब्रेशन
- LeRobot: कॅमेरे आणि lerobot-find-cameras
- LeRobot: इन्स्टॉलेशन आणि एक्स्ट्रा मॅट्रिक्स
- LeRobotDataset v3.0: लेआउट आणि v2.1 स्थलांतर
- LeRobot: स्ट्रीमिंग व्हिडिओ एन्कोडिंग आणि ड्रॉप झालेले फ्रेम्स
- LeRobot: मोठ्या डेटासेट्सना v3.0 (DROID) मध्ये पोर्ट करणे
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: वास्तविक रेकॉर्डिंग डिफॉल्ट्स
- lerobot_record.py: रेकॉर्ड लूप आणि रेझ्युमे हाताळणी
- TheRobotStudio/SO-ARM100: बिल्ड रेपो आणि सामग्रीचे बिल
- Hugging Face: LeRobot समुदाय डेटासेट्स चेकलिस्ट
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), अनुकरण शिक्षणातील डेटा स्केलिंग नियम
- Mandlekar et al. (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