आफ्नो पहिलो LeRobot डेटासेट SO-100 आर्मको साथ रेकर्ड गर्नका लागि AY-Robots ट्यूटोरियल पृष्ठ
LeRobotSO-100डेटासेट रेकर्डिङटेलिओपरेसननक्कल सिकाइ

आफ्नो पहिलो LeRobot डेटासेट SO-100 सँग रेकर्ड गर्नुहोस्

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 dataset भिडियोहरूको फोल्डर होइन तर भिडियो संलग्न भएको समय-अनुक्रमित तालिका हो: प्रत्येक नियन्त्रण-लूप टिकले आदेशित कार्य, अनुयायीले पुगेको अवस्था, प्रति क्यामेरा एक फ्रेम, एक टाइमस्ट्याम्प र सूचकांकहरू समावेश गरी एक पङ्क्ति लेख्छ। नीतिले ती स्तम्भहरू मात्र देख्छ। lerobot/svla_so100_pickplace को स्कीमा, यसको meta/info.json बाट पढिएको।

FeaturedtypeShapeWhat it is
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 का छवटा degrees of freedom। कार्य र अवस्थाले एउटै आकार साझा गर्छन् किनभने leader-follower teleoperation ले एक लक्ष्य र एक चरण पछि पुगेको स्थिति रेकर्ड गर्छ। त्यो अन्तर जानकारी हो: जहाँ पाखुराले गुरुत्वाकर्षण वा अड्किएको वस्तुसँग संघर्ष गर्यो। ती स्ट्रिङहरू त्यो डेटासेटका हुन्। आज 0.6.1 सँग रेकर्ड गरिएको सत्रले shoulder_pan.pos देखि gripper.pos सम्म, बसमा 1 देखि 6 सम्मका आईडीहरू लेख्छ: उही छवटा जोइन्टहरू, फरक कुञ्जीहरू, जुन कन्फिगले नामद्वारा सुविधालाई सम्बोधन गर्ने क्षणमा महत्त्वपूर्ण हुन्छ।

एक वास्तविक डेटासेटबाट मापदण्ड

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

AY-Robots को LeRobot डेटासेट ढाँचाको लागि शब्दावली प्रविष्टि, डाइरेक्टरी लेआउट र मेटाडेटा फाइलहरू देखाउँदै।
data/, videos/ र meta/ मा के रहन्छ, र कुन नीतिहरूले कुन संस्करण पढ्छन्।

बेन्चमा तपाईंलाई के चाहिन्छ

वस्तुविवरणनोट
अनुयायी पाखुराSO-100, छ Feetech STS3215 सर्भोलगभग 110 देखि 150 EUR पार्ट्समा
नेता पाखुरादोस्रो SO-100, गियरहरू हटाइयोसबै छ नेता मोटरहरूबाट गियरहरू हटाइयो: इन्कोडर मात्र, कम घर्षण
शक्तिसामग्रीको बिलमा 7.4 V STS3215 भेरियन्टसँग मेल खानेतलको चेतावनी हेर्नुहोस्
क्यामेरादुई USB क्यामेरा, 640x480 30 fps माएउटा दृश्य दृश्य, एउटा नाडीमा
होस्टPython 3.12 वा नयाँ, ffmpegrequires-python >= 3.12
हब खाता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-100 सुरु गर्दैSO-100 सेटअपको पूर्ण गाइड। यदि तपाईंले केही किन्नुभएको छैन भने, पहिले SO-100 र SO-101 को तुलना पढ्नुहोस्: SO-101 सुधारिएको तार र गियर हटाउने चरण बिनाको नयाँ संशोधन हो, र रेकर्डिङ कार्यप्रवाह समान छ।

lerobot 0.6.1 स्थापना गर्नुहोस्

bash
conda create -y -n lerobot python=3.12
conda activate lerobot

# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge

# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech     = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'

lerobot-info
lerobot-info ले PATH मा फेला पार्न सक्ने ffmpeg संस्करण सहित प्रणाली सारांश प्रिन्ट गर्छ।

अतिरिक्त कुराहरूले मानिसहरूलाई प्रायः अलमल्याउँछ। pip install lerobot ले मुख्य ML निर्भरताहरू मात्र स्थापना गर्छ, रोबोटसँग कुरा गर्ने केही पनि होइन। Koch आर्महरूलाई dynamixel को सट्टा feetech चाहिन्छ। यदि तपाईंको शेलले कहिल्यै lerobot-record को बारेमा सुनेको छैन भने, यसको कारण यही हो।

पोर्टहरू, मोटर ID हरू र क्यालिब्रेसन

भागहरू र काम गर्ने टेलिओप लूपको बीचमा तीनवटा एक-पटकका चरणहरू छन्। ले तपाईंको पाखुरामा प्रशिक्षित नीतिलाई अरू कसैकोमा चलाउँछ, कच्चा एन्कोडर गणनाहरूलाई साझा जोइन्ट कन्भेन्सनमा म्याप गर्दै।

  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
    मोटर ID हरू र बाउडरेटहरू लेख्नुहोस्

    ID हरू एक पटकमा एउटा मोटरमा लेखिन्छन्, र कागजातहरू यस बारेमा कडा छन्: नियन्त्रक बोर्डमा ठ्याक्कै एउटा मोटर जडान गर्नुहोस्, जुन अझै अरू कुनैसँग डेजी-चेन गरिएको छैन। स्क्रिप्टले चेनलाई पछाडिबाट हिँडाउँछ, पहिले ग्रिपरको लागि प्रम्प्ट गर्छ र यसलाई ID 6 दिन्छ, त्यसपछि wrist_roll लाई 5, shoulder_pan लाई 1 सम्म। यसलाई एसेम्बली गर्नु अघि गर्नुहोस्।

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    दुवै पाखुरा क्यालिब्रेसन गर्नुहोस्

    प्रत्येक जोइन्टलाई यसको दायराको बीचमा सार्नुहोस्, Enter थिच्नुहोस्, त्यसपछि प्रत्येकलाई यसको पूर्ण दायरामा घुमाउनुहोस्। The 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
क्यालिब्रेसन कहाँ हुन्छ, र ID किन महत्त्वपूर्ण छ

प्रोफाइलहरू $HF_LEROBOT_CALIBRATION मा जान्छन्, पूर्वनिर्धारित ~/.cache/huggingface/lerobot/calibration मा, र ID लुकअप कुञ्जी हो। lerobot-record लाई क्यालिब्रेट गरिएको ID दिनुहोस् र यसले प्रोफाइल पुन: प्रयोग गर्न Enter वा यसलाई पुन: गर्न c प्रस्ताव गर्छ। यसलाई अज्ञात ID दिनुहोस् र त्यहाँ कुनै फाइल हुँदैन, त्यसैले यो सत्रको बीचमा क्यालिब्रेसनमा जान्छ।

क्यामेराले नीतिले के देख्छ भन्ने निर्णय गर्छ

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 symlink मा देखाउनुहोस्, जसले गणना क्रमको सट्टा यन्त्रलाई पछ्याउँछ। यो डेटासेट आन्तरिक रूपमा असंगत हुने सबैभन्दा सामान्य तरिका हो, र प्रशिक्षणले यसलाई मर्मत गर्न सक्दैन। क्यामेरा पत्ता लागेन

रेकर्ड कमान्ड र प्रत्येक फ्ल्याग

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_idemptyनाम; पूर्वनिर्धारित रूपमा टाइमस्ट्याम्प थपिन्छ
--dataset.single_taskemptyप्रत्येक एपिसोडसँग भण्डारण गरिएको कार्य स्ट्रिङ
--dataset.root$HF_LEROBOT_HOME/repo_idलेख्ने मार्ग, पूर्वनिर्धारित ~/.cache/huggingface/lerobot/
--dataset.fps30नियन्त्रण लूप दर र डेटासेट फ्रेम दर
--dataset.episode_time_s60एक एपिसोड स्वतः अगाडि बढ्नु अघिका सेकेन्डहरू
--dataset.reset_time_s60दृश्य रिसेट; पाखुरा चल्छ, केही भण्डारण हुँदैन
--dataset.num_episodes50यस सत्रमा रेकर्ड गरिएका एपिसोडहरू
--dataset.push_to_hubtrueसत्रको अन्त्यमा अपलोड गर्नुहोस्; false भए स्थानीय रहन्छ
--dataset.streaming_encodingfalse in the dataclass, true in the docs tableक्याप्चर गर्दा इन्कोड गर्नुहोस्; यसलाई स्पष्ट रूपमा सेट गर्नुहोस्
--dataset.encoder_queue_maxsize30प्रति क्यामेरा बफर गरिएका फ्रेमहरू, ~1 सेकेन्ड 30 fps मा
--dataset.encoder_threadsnull (codec decides)प्रति इन्कोडर थ्रेडहरू; यदि क्याप्चर अड्किन्छ भने कम गर्नुहोस्
--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 अनिवार्य हुन्छ। ३०-एपिसोडको डेटासेटमा ५० वटा माग्नुभयो भने तपाईंले ८० वटा पाउनुहुन्छ।

सत्रको समयमा किबोर्ड नियन्त्रण

  • दायाँ एरो वा n: एपिसोड समाप्त गर्नुहोस् वा चरणलाई चाँडै रिसेट गर्नुहोस्। यो कुञ्जी तपाईंले धेरै प्रयोग गर्नुहुन्छ, किनभने सफा पकडलाई विरलै २५ सेकेन्ड चाहिन्छ।
  • बायाँ एरो वा r: एपिसोड खारेज गर्नुहोस् र यसलाई फेरि गर्नुहोस्। खराब टेकले अहिले केही खर्च गर्दैन र पछि धेरै खर्च गर्छ।
  • एस्केप वा q: सत्र रोक्नुहोस्, एन्कोडिङ समाप्त गर्नुहोस्, अपलोड गर्नुहोस्।
  • यी X11, Wayland र हेडलेस SSH मा काम गर्छन्: कुनै ग्लोबल कुञ्जी ब्याकेन्ड नभएकाले, lerobot-record ले नियन्त्रण गर्ने टर्मिनलबाट उही कुञ्जीहरू पढ्छ। अक्षरहरू ढिलो SSH लिङ्कहरूमा पनि काम गर्छन्, जहाँ एरो अनुक्रमहरू विभाजित हुन्छन्।
  • किबोर्ड टेलिअपरेसन फरक छ र यसलाई ग्लोबल ब्याकेन्ड चाहिन्छ: X11, Windows, वा Accessibility सहितको macOS।

कति एपिसोडहरू, र राम्रो एपिसोड कस्तो देखिन्छ

रेकर्डिङ गाइडले पहिलो कार्यका लागि कम्तिमा ५० एपिसोडहरू, प्रति वस्तु स्थान लगभग १० वटा सुझाव दिन्छ। नीति पृष्ठहरू ले प्रति मोडेल न्यूनतम संख्या सूचीबद्ध गर्दछ, जसभन्दा कममा रन चलाउनु GPU समयको लायक हुँदैन।

नीतिन्यूनतम एपिसोडहरूडेटासेट ढाँचाGPU टियरप्रति रन लागत
SmolVLA30LeRobot v3.0RTX 4090 वा कुनै पनि 24 GB कार्डलगभग 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 वा कुनै पनि 24 GB कार्डलगभग 1 to 3 USD
GR00T N1.750LeRobot v2.0 वा v2.1A100 80 GB वा H100 80 GBलगभग 4 to 12 USD
GR00T N1.550LeRobot v2.0 वा v2.1A100 80 GB वा H100 80 GBलगभग 4 to 12 USD
Pi0.550LeRobot v3.0A100 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 गुणा अवधिसँग बराबर छ भनी पुष्टि गर्नुहोस्। कुलमा होइन, प्रति एपिसोड।

python
from lerobot.datasets import LeRobotDataset

ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)

# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])

# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])
fps र अवधिको गुणनफलभन्दा धेरै फरक पर्ने एपिसोड मेटाउनका लागि उपयुक्त हुन्छ, तालिमका लागि होइन।

त्यसपछि यसलाई हेर्नुहोस्। lerobot-dataset-viz ले क्यामेरा दृश्यहरूको छेउमा जोइन्ट ट्रेसहरू सहित एउटा एपिसोडलाई फ्रेम-बाइ-फ्रेम Rerun वा Foxglove मा पुन: प्ले गर्छ। साटिएका क्यामेराहरू र जमेका फ्रेमहरू दस सेकेन्डमा देखिन्छन्। मानिसहरू यो चरण छोड्छन्।

bash
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0

# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0 \
    --display-mode foxglove

# Drop the episodes that did not survive review
lerobot-edit-dataset \
    --repo_id your-user/so100_pick_cube_20260823_141530 \
    --new_repo_id your-user/so100_pick_cube_clean \
    --operation.type delete_episodes \
    --operation.episode_indices "[3, 17, 41]"
lerobot-edit-dataset ले विभाजन, मर्ज, सुविधा हटाउने, कार्यहरू परिमार्जन गर्ने र तथ्याङ्क पुन: गणना गर्ने काम पनि गर्छ। उदारतापूर्वक मेटाउनुहोस्: एउटा खराब एपिसोडले एउटा एपिसोडको लागत लिन्छ; यसलाई राख्दा यसमा तालिम प्राप्त हरेक रनको लागत लाग्छ।
AY-Robots डेटासेट डाइरेक्टरीले एपिसोड गणना र ढाँचा सहित सार्वजनिक LeRobot डेटासेटहरू सूचीबद्ध गर्दछ।
तुलनात्मक डेटासेटहरू कसरी आकार र एनोटेट गरिएका छन्।

v2.1 वा v3.0: रेकर्ड गर्नु अघि निर्णय गर्नुहोस्

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

LeRobot v2.1LeRobot v3.0
लेआउटप्रत्येक एपिसोडको लागि एउटा parquet र एउटा MP4प्रत्येक शार्डमा धेरै एपिसोडहरू
एपिसोड मेटाडेटाJSONL फाइलहरूmeta/episodes/ अन्तर्गत chunked parquet, datasets स्ट्याक मार्फत
हबबाट स्ट्रिमिङछैनछ, 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 ढाँचामा एपिसोडहरू, क्यामेरा स्ट्रिमहरू र जोइन्ट अवस्थाहरू रेकर्ड गर्छ, त्यसपछि डेटासेटलाई ट्रेनरलाई हस्तान्तरण गर्छ।

डेस्कटप क्लाइन्ट प्राप्त गर्नुहोस्

डेटासेटबाट नीतिमा

पचास सफा एपिसोडहरूले प्रत्येक अनुकरण सिकाइ यहाँ चलाउँछ। 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

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started