
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 dataset भिडियोहरूको फोल्डर होइन तर भिडियो संलग्न भएको समय-अनुक्रमित तालिका हो: प्रत्येक नियन्त्रण-लूप टिकले आदेशित कार्य, अनुयायीले पुगेको अवस्था, प्रति क्यामेरा एक फ्रेम, एक टाइमस्ट्याम्प र सूचकांकहरू समावेश गरी एक पङ्क्ति लेख्छ। नीतिले ती स्तम्भहरू मात्र देख्छ। lerobot/svla_so100_pickplace को स्कीमा, यसको meta/info.json बाट पढिएको।
| Feature | dtype | Shape | What it is |
|---|---|---|---|
| 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 का छवटा degrees of freedom। कार्य र अवस्थाले एउटै आकार साझा गर्छन् किनभने leader-follower teleoperation ले एक लक्ष्य र एक चरण पछि पुगेको स्थिति रेकर्ड गर्छ। त्यो अन्तर जानकारी हो: जहाँ पाखुराले गुरुत्वाकर्षण वा अड्किएको वस्तुसँग संघर्ष गर्यो। ती स्ट्रिङहरू त्यो डेटासेटका हुन्। आज 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 लेख्ने टोकन | 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-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 को बारेमा सुनेको छैन भने, यसको कारण यही हो।
पोर्टहरू, मोटर ID हरू र क्यालिब्रेसन
भागहरू र काम गर्ने टेलिओप लूपको बीचमा तीनवटा एक-पटकका चरणहरू छन्। ले तपाईंको पाखुरामा प्रशिक्षित नीतिलाई अरू कसैकोमा चलाउँछ, कच्चा एन्कोडर गणनाहरूलाई साझा जोइन्ट कन्भेन्सनमा म्याप गर्दै।
- 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मोटर ID हरू र बाउडरेटहरू लेख्नुहोस्
ID हरू एक पटकमा एउटा मोटरमा लेखिन्छन्, र कागजातहरू यस बारेमा कडा छन्: नियन्त्रक बोर्डमा ठ्याक्कै एउटा मोटर जडान गर्नुहोस्, जुन अझै अरू कुनैसँग डेजी-चेन गरिएको छैन। स्क्रिप्टले चेनलाई पछाडिबाट हिँडाउँछ, पहिले ग्रिपरको लागि प्रम्प्ट गर्छ र यसलाई ID 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दुवै पाखुरा क्यालिब्रेसन गर्नुहोस्
प्रत्येक जोइन्टलाई यसको दायराको बीचमा सार्नुहोस्, Enter थिच्नुहोस्, त्यसपछि प्रत्येकलाई यसको पूर्ण दायरामा घुमाउनुहोस्। The
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 मा, र ID लुकअप कुञ्जी हो। lerobot-record लाई क्यालिब्रेट गरिएको ID दिनुहोस् र यसले प्रोफाइल पुन: प्रयोग गर्न Enter वा यसलाई पुन: गर्न c प्रस्ताव गर्छ। यसलाई अज्ञात ID दिनुहोस् र त्यहाँ कुनै फाइल हुँदैन, त्यसैले यो सत्रको बीचमा क्यालिब्रेसनमा जान्छ।
क्यामेराले नीतिले के देख्छ भन्ने निर्णय गर्छ
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 symlink मा देखाउनुहोस्, जसले गणना क्रमको सट्टा यन्त्रलाई पछ्याउँछ। यो डेटासेट आन्तरिक रूपमा असंगत हुने सबैभन्दा सामान्य तरिका हो, र प्रशिक्षणले यसलाई मर्मत गर्न सक्दैन। क्यामेरा पत्ता लागेन।
रेकर्ड कमान्ड र प्रत्येक फ्ल्याग
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 | empty | नाम; पूर्वनिर्धारित रूपमा टाइमस्ट्याम्प थपिन्छ |
| --dataset.single_task | empty | प्रत्येक एपिसोडसँग भण्डारण गरिएको कार्य स्ट्रिङ |
| --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 in the dataclass, true in the docs table | क्याप्चर गर्दा इन्कोड गर्नुहोस्; यसलाई स्पष्ट रूपमा सेट गर्नुहोस् |
| --dataset.encoder_queue_maxsize | 30 | प्रति क्यामेरा बफर गरिएका फ्रेमहरू, ~1 सेकेन्ड 30 fps मा |
| --dataset.encoder_threads | null (codec decides) | प्रति इन्कोडर थ्रेडहरू; यदि क्याप्चर अड्किन्छ भने कम गर्नुहोस् |
| --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 अनिवार्य हुन्छ। ३०-एपिसोडको डेटासेटमा ५० वटा माग्नुभयो भने तपाईंले ८० वटा पाउनुहुन्छ।
सत्रको समयमा किबोर्ड नियन्त्रण
- दायाँ एरो वा
n: एपिसोड समाप्त गर्नुहोस् वा चरणलाई चाँडै रिसेट गर्नुहोस्। यो कुञ्जी तपाईंले धेरै प्रयोग गर्नुहुन्छ, किनभने सफा पकडलाई विरलै २५ सेकेन्ड चाहिन्छ। - बायाँ एरो वा
r: एपिसोड खारेज गर्नुहोस् र यसलाई फेरि गर्नुहोस्। खराब टेकले अहिले केही खर्च गर्दैन र पछि धेरै खर्च गर्छ। - एस्केप वा
q: सत्र रोक्नुहोस्, एन्कोडिङ समाप्त गर्नुहोस्, अपलोड गर्नुहोस्। - यी X11, Wayland र हेडलेस SSH मा काम गर्छन्: कुनै ग्लोबल कुञ्जी ब्याकेन्ड नभएकाले, lerobot-record ले नियन्त्रण गर्ने टर्मिनलबाट उही कुञ्जीहरू पढ्छ। अक्षरहरू ढिलो SSH लिङ्कहरूमा पनि काम गर्छन्, जहाँ एरो अनुक्रमहरू विभाजित हुन्छन्।
- किबोर्ड टेलिअपरेसन फरक छ र यसलाई ग्लोबल ब्याकेन्ड चाहिन्छ: X11, Windows, वा Accessibility सहितको macOS।
कति एपिसोडहरू, र राम्रो एपिसोड कस्तो देखिन्छ
रेकर्डिङ गाइडले पहिलो कार्यका लागि कम्तिमा ५० एपिसोडहरू, प्रति वस्तु स्थान लगभग १० वटा सुझाव दिन्छ। नीति पृष्ठहरू ले प्रति मोडेल न्यूनतम संख्या सूचीबद्ध गर्दछ, जसभन्दा कममा रन चलाउनु GPU समयको लायक हुँदैन।
| नीति | न्यूनतम एपिसोडहरू | डेटासेट ढाँचा | GPU टियर | प्रति रन लागत |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 वा कुनै पनि 24 GB कार्ड | लगभग 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 वा कुनै पनि 24 GB कार्ड | लगभग 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 वा v2.1 | A100 80 GB वा H100 80 GB | लगभग 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 वा v2.1 | A100 80 GB वा H100 80 GB | लगभग 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB वा H100 80 GB | लगभग 4 to 12 USD |
राम्रो प्रश्न के हो भने कति र के-के। रोबोटिक म्यानिपुलेसनका लागि इमिटेसन लर्निङमा डेटा स्केलिंग नियमहरू (लिन एट अल., २०२४) ले ४०,००० भन्दा बढी प्रदर्शनहरू सङ्कलन गर्यो र १५,००० भन्दा बढी वास्तविक-विश्व रोलआउटहरू चलायो। सामान्यीकरणले वातावरण र वस्तुहरूको संख्यासँग लगभग पावर-ल सम्बन्ध पछ्यायो, र प्रति वातावरण वा वस्तुको एक निश्चित सीमा पार गरेपछि, थप प्रदर्शनहरूको न्यूनतम प्रभाव थियो। एउटै बेन्चमा: वस्तु सार्नुहोस्, प्रकाश परिवर्तन गर्नुहोस्, क्यूब बदल्नुहोस्, एउटै टेक दोहोर्याउनुको सट्टा।
- किबोर्ड वा गेमप्याडको विपरीत, सर्भोले पुन: उत्पादन गर्न सक्ने निरन्तर जोइन्ट ट्र्याजेक्टोरीहरू
- कार्य र स्थितिले एक समन्वय परम्परा साझा गर्दछ, त्यसैले नीतिले सिधै आदेश दिन सक्ने लक्ष्य सिक्छ।
- २५ सेकेन्डको एपिसोड र १० सेकेन्डको रिसेट लगभग प्रति घण्टा १०० एपिसोडहरू हो।
- अपरेटरले फलोअर अड्किएको वा बाँधिएको महसुस गर्छ, त्यसैले डेटा प्रतिबद्ध हुनु अघि त्रुटिहरू सतहमा आउँछन्।
- दोस्रो पाखुराले पार्टपुर्जाको लागत लगभग दोब्बर बनाउँछ
- प्रदर्शनहरूले अपरेटरको बानीहरू विरासतमा पाउँछन्; मन्डलेकर एट अल.ले नीति गुणस्तर प्रदर्शनको गुणस्तरमा धेरै निर्भर हुने पत्ता लगाए।
- लिडरलाई लूप दरमा नमूना गरिन्छ, त्यसैले पजहरू लगभग समान पङ्क्तिहरू बन्छन् जसले नीतिलाई पर्खन सिकाउँछ।
- सत्रहरू बीचको स्थिरता लागू गर्ने केही छैन: ५ सेन्टिमिटर सारिएको क्यामेरा एक लुकेको वितरण परिवर्तन हो।
एउटा राम्रो एपिसोड बोरिंग हुन्छ: दोहोर्याउन मिल्ने होम पोज, एउटा काम सकिएको, वस्तु बिनमा पुगेपछि समाप्त भएको, चेकलिस्टले सिफारिस गरेको २५ देखि ५० अक्षरको टास्क स्ट्रिङ। Pick the red cube and drop it in the box एउटा टास्क स्ट्रिङ हो; task1 चेकलिस्टले स्पष्ट रूपमा उल्लेख गरेको एन्टि-प्याटर्न हो। अस्पष्ट एनोटेशनहरू यसको समस्याहरूको सूचीमा शीर्ष स्थानमा छन्, र तिनीहरूका लागि सबैभन्दा महत्त्वपूर्ण हुन्छन् vision-language-action models, जहाँ स्ट्रिङ मोडेल इनपुट हो, फाइलनाम होइन।
डेटासेटलाई चुपचाप बर्बाद गर्ने त्रुटिहरू
कसैले पनि अपवाद उत्पन्न गर्दैन। सबै प्रशिक्षणमा जीवित रहन्छन्, राम्रो देखिने हानि वक्र र केही नगर्ने रोबोटको रूपमा देखा पर्छन्। दृश्य सेटअप गर्दा जाँच गर्नुहोस्।
| त्रुटि | कस्तो देखिन्छ | कहाँबाट आउँछ | कसरी पत्ता लगाउने |
|---|---|---|---|
| क्यामेरा दृश्यहरू साटिएको | शीर्ष कुञ्जी अन्तर्गत नाडीको छवि | पुन: प्लग गरेपछि अनुक्रमणिका पुन: असाइनमेन्ट | 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 |
इन्कोडरले प्रति क्यामेरा एक सीमित कतार राख्छ, पूर्वनिर्धारित रूपमा ३० फ्रेम। जब यसले गति कायम राख्न सक्दैन, फ्रेमहरू ब्लक हुनुको सट्टा ड्रप हुन्छन्: क्याप्चर जारी रहन्छ र केही क्र्यास हुँदैन। तपाईंले Encoder queue full for {camera}, dropped N frame(s) र एपिसोडको अन्त्यमा प्रति-क्यामेरा कुल प्राप्त गर्नुहुन्छ। लेरोबोट थ्रेसहोल्ड: लगभग ५ प्रतिशत हराउनुको अर्थ ओभरलोडेड प्रणाली हो, २ प्रतिशत अपेक्षित स्टार्टअप लोड हो। क्रमशः समाधानहरू: --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 ले प्रत्येक एपिसोडको लागि एउटा 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, datasets स्ट्याक मार्फत |
| हबबाट स्ट्रिमिङ | छैन | छ, 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 USD।
यसले तपाईंको पाखुरालाई जम्मा वा क्यालिब्रेट गर्दैन, र यसले दोषपूर्ण एपिसोड मर्मत गर्दैन, त्यसैले निरीक्षण चरण अझै पनि लागू हुन्छ। अर्को छेउमा पनि एउटा कडा सीमा छ: द्रुत कार्यहरूको लागि, अनुमान सर्भोको छेउमा बस्नुपर्छ। नियन्त्रण लूप प्रति कार्य चरण 20 देखि 485 ms सम्म चल्छ, र सार्वजनिक-इन्टरनेट राउन्ड ट्रिपहरूले काम गर्ने नीतिलाई हिचकिचाउने नीतिमा परिणत गर्छ।
पाइपलाइन आफैं तार नगरी LeRobot डेटासेटहरू रेकर्ड गर्नुहोस्
AY-Robots डेस्कटप क्लाइन्टले टेलिओपरेसन सत्रबाट LeRobot ढाँचामा एपिसोडहरू, क्यामेरा स्ट्रिमहरू र जोइन्ट अवस्थाहरू रेकर्ड गर्छ, त्यसपछि डेटासेटलाई ट्रेनरलाई हस्तान्तरण गर्छ।
डेस्कटप क्लाइन्ट प्राप्त गर्नुहोस्डेटासेटबाट नीतिमा
पचास सफा एपिसोडहरूले प्रत्येक अनुकरण सिकाइ यहाँ चलाउँछ। ACT तपाईंको कार्यमा मात्रै सुरुदेखि तालिम दिन्छ, लगभग 80 M प्यारामिटरहरू प्रति कार्य चरण लगभग 20 ms मा, पाँच मध्ये द्रुत गतिमा सहज हुने एक मात्र। SmolVLA 24 GB कार्डमा लगभग 450 M प्यारामिटरहरू छ। GR00T N1.7 लगभग 3 B प्यारामिटरको फाउन्डेसन मोडेल हो जहाँ फाइन-ट्यूनिङ लगभग 40 M प्यारामिटरहरू छुन्छ, A100 वा H100 चाहिन्छ, र त्यो v2.1 डेटासेट चाहन्छ।
अर्को, तपाईंको संयोजनको लागि गाइड: SO-100 मा ACT, SO-100 मा SmolVLA वा SO-100 मा GR00T N1.7; पहिलो रनको लागि, आफ्नो पहिलो नीति तालिम दिनुहोस् छोटो छ। जब नीति बेन्चमा काम गर्छ तर तपाईंले टेबल सार्ने बित्तिकै ढल्छ, त्यो डेटा समस्या हो: नीतिले एउटा सेटअपमा मात्र काम गर्छ र उच्च-गुणस्तरको VLA तालिम डेटा सङ्कलन विविधतामा गहिरो जान्छ।
पहिलो काम गर्ने नीतिको लागि मलाई वास्तवमा कति एपिसोडहरू चाहिन्छ?▾
SmolVLA को लागि तीस, ACT, Pi0.5, GR00T N1.5 र N1.7 को लागि पचास, AY-Robots प्रशिक्षकहरूले लागू गर्ने न्यूनतम। LeRobot गाइडले पहिलो कार्यको लागि कम्तिमा 50, प्रति वस्तु स्थान लगभग 10 सिफारिस गर्दछ। डेटा-स्केलिङ कार्यले सामान्यीकरण प्रदर्शन गणनाको सट्टा वातावरण र वस्तुहरूसँग मापन गर्छ भन्ने पत्ता लगायो, त्यसैले एउटै दृश्यको सय टेक पाँच स्थानहरूमा पचास भन्दा खराब हुन्छ।
के मलाई लिडर आर्म चाहिन्छ, वा म किबोर्डले टेलिओपरेट गर्न सक्छु?▾
lerobot ले किबोर्ड र गेमप्याड टेलिओपरेटरहरू पठाउँछ, त्यसैले लिडर आर्म कडाईका साथ आवश्यक छैन, तर यो अत्यधिक रुचाइएको छ: लिडर-फलोअरले रेकर्ड गरिएको कार्यको समन्वय परम्परामा निरन्तर संयुक्त ट्र्याजेक्टोरीहरू दिन्छ, जबकि किबोर्ड इनपुटले नीतिले झट्काको रूपमा सिक्ने चरणबद्ध गति उत्पादन गर्दछ। किबोर्ड टेलिओपरेशनलाई ग्लोबल कुञ्जी ब्याकएन्ड पनि चाहिन्छ, त्यसैले यो Wayland र हेडलेसमा असफल हुन्छ।
के म Raspberry Pi वा सानो मिनी PC मा रेकर्ड गर्न सक्छु?▾
हो, ट्युनिङको साथ। स्ट्रिमिङ-इन्कोडिङ गाइडमा आधुनिक 4-कोर मेसिनहरू र Raspberry Pi 5 लाई समेट्ने कम-संसाधन कोष्ठक छ, र यसको 'केही ट्युनिङ चाहिन्छ' स्तम्भमा 640x480 र 30 fps मा दुई क्यामेरा राख्छ। यसको सल्लाह: क्याप्चर लूपसँग प्रतिस्पर्धा गर्ने एन्कोडरलाई रोक्नुहोस्, --dataset.rgb_encoder.vcodec=h264 र --dataset.streaming_encoding=false मार्फत। यसले 640x480 मा दुई क्यामेरालाई प्रति सेकेन्ड लगभग 55 मिलियन पिक्सेल र 1920x1080 मा दुईलाई लगभग 373 मिलियन मूल्याङ्कन गर्छ।
मैले भर्खरै रेकर्ड गरेको डेटासेट वास्तवमा स्वस्थ छ भनेर मलाई कसरी थाहा हुन्छ?▾
तीन सस्तो जाँच। प्रत्येक एपिसोडको भिडियो अवधि CLI ले रिपोर्ट गरेको अवधिसँग तुलना गर्नुहोस् र कुलमा भन्दा प्रति एपिसोडमा पङ्क्ति गणना fps गुणा त्यो अवधिसँग बराबर छ भनी पुष्टि गर्नुहोस्; त्यो lerobot को एन्कोडिङ गाइडले दिने स्वीकृति परीक्षण हो। ds.meta.stats पढ्नुहोस्, जहाँ min यसको max बराबर भएको जोइन्ट कहिल्यै चलेन। त्यसपछि 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 फ्रेम
- 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