तुमचा पहिला 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 डेटासेट हा व्हिडिओंचा फोल्डर नसून व्हिडिओ संलग्न असलेली वेळ-अनुक्रमित सारणी आहे: प्रत्येक कंट्रोल-लूप टिक आज्ञा दिलेली क्रिया, फॉलोअरने गाठलेली स्थिती, प्रति कॅमेरा एक फ्रेम, एक टाइमस्टॅम्प आणि निर्देशांक असलेली एक पंक्ती लिहितो. धोरण फक्त तेच स्तंभ पाहते. lerobot/svla_so100_pickplace ची योजना, त्याच्या meta/info.json मधून वाचली आहे.

वैशिष्ट्यडेटा प्रकारआकारते काय आहे
actionfloat32[6]लीडर आर्ममधून संयुक्त लक्ष्य
observation.statefloat32[6]फॉलोअरने गाठलेली संयुक्त स्थिती
observation.images.topvideo[480, 640, 3]दृश्य कॅमेरा, MP4 (येथे av1)
observation.images.wristvideo[480, 640, 3]मनगट कॅमेरा, समान दर
timestampfloat32[1]एपिसोड सुरू झाल्यापासून सेकंद
frame_index, episode_index, index, task_indexint64[1]स्वयंचलितपणे भरलेली नोंदणी

जोडणी आहेत main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll आणि main_gripper: SO-100 चे सहा स्वातंत्र्याच्या अंशा. क्रिया आणि स्थिती समान आकार सामायिक करतात कारण लीडर-फॉलोअर टेलिऑपरेशन एक लक्ष्य आणि एका स्टेप नंतर गाठलेली स्थिती रेकॉर्ड करते. ती दरी माहिती आहे: जिथे आर्मने गुरुत्वाकर्षणाशी किंवा अडकलेल्या वस्तूंशी संघर्ष केला. त्या स्ट्रिंग्ज त्या डेटासेटच्या आहेत. आज 0.6.1 सह रेकॉर्ड केलेले सत्र shoulder_pan.pos ते gripper.pos, बसवर 1 ते 6 आयडी लिहितो: तेच सहा जोडणी, भिन्न की, जे कॉन्फिग वैशिष्ट्याला नावाने संबोधित करते तेव्हा महत्त्वाचे ठरते.

वास्तविक डेटासेटमधील एक मापदंड

त्या डेटासेटमध्ये 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 write token--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 बद्दल ऐकले नसेल, तर हे त्याचे कारण आहे.

पोर्ट्स, मोटर आयडी आणि कॅलिब्रेशन

भाग आणि कार्यरत टेलिओप लूप यांच्यामध्ये तीन एक-वेळच्या पायऱ्या आहेत. तुमच्या आर्मवर प्रशिक्षित केलेली पॉलिसी दुसऱ्याच्या आर्मवर चालवण्यासाठी, रॉ एन्कोडर काउंट्सना सामायिक जॉइंट कन्व्हेन्शनवर मॅप करते.

  1. 1
    प्रत्येक आर्मचा USB पोर्ट शोधा

    दोन्ही आर्म्स प्लग इन असताना ते चालवा, विचारल्यावर तुम्ही ओळखत असलेला आर्म अनप्लग करा आणि कोणता पोर्ट गायब होतो ते लक्षात घ्या. Linux वर तुम्हाला sudo chmod 666 /dev/ttyACM0 ची आवश्यकता असू शकते.

    bash
    lerobot-find-port
    # Finding all available ports for the MotorsBus.
    # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is '/dev/ttyACM1'
    # Reconnect the USB cable.
  2. 2
    मोटर आयडी आणि बॉडरेट्स लिहा

    आयडी एका वेळी एका मोटरसाठी लिहिले जातात आणि डॉक्समध्ये याबद्दल कठोर नियम आहेत: कंट्रोलर बोर्डला फक्त एक मोटर जोडा, ती अजून दुसऱ्या कोणत्याही मोटरला डेझी-चेन केलेली नसावी. स्क्रिप्ट साखळी उलटी चालवते, प्रथम ग्रिपरसाठी प्रॉम्प्ट करते आणि त्याला आयडी 6 देते, नंतर रिस्ट-रोलला 5, आणि शोल्डर-पॅनला 1 पर्यंत खाली येते. हे असेंब्ली करण्यापूर्वी करा.

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    दोन्ही आर्म्स कॅलिब्रेट करा

    प्रत्येक जॉइंट त्याच्या रेंजच्या मध्यभागी हलवा, एंटर दाबा, नंतर प्रत्येक जॉइंट त्याच्या पूर्ण रेंजमधून फिरवा. id हे प्रोफाइलचे फाइलनाव बनते.

    bash
    lerobot-calibrate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower
    
    lerobot-calibrate \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader
  4. 4
    काहीही रेकॉर्ड करण्यापूर्वी टेलिओपरेट करा

    वरील सर्व गोष्टींसाठी ही स्वीकृती चाचणी आहे. जर टेलिओपरेशन अडखळत असेल, मिरर केलेले असेल किंवा एखादा जॉइंट फॉलो करत नसेल, तर रेकॉर्डिंग ते 50 एपिसोड्समध्ये जतन करते.

    bash
    lerobot-teleoperate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader \
        --display_data=true
कॅलिब्रेशन कुठे होते आणि आयडी का महत्त्वाचा आहे

प्रोफाइल्स $HF_LEROBOT_CALIBRATION मध्ये जातात, डीफॉल्ट ~/.cache/huggingface/lerobot/calibration आहे, आणि आयडी ही लुकअप की आहे. lerobot-record ला कॅलिब्रेटेड आयडी दिल्यास ते प्रोफाइल पुन्हा वापरण्यासाठी एंटर किंवा ते पुन्हा करण्यासाठी c ऑफर करते. त्याला अज्ञात आयडी दिल्यास कोणतीही फाइल नसते, त्यामुळे ते सत्राच्या मध्यभागी कॅलिब्रेशनमध्ये जाते.

कॅमेरे ठरवतात की धोरणाला काय दिसते

bash
lerobot-find-cameras opencv   # or: lerobot-find-cameras realsense

# --- Detected Cameras ---
# Camera #0:
#   Name: OpenCV Camera @ 0
#   Type: OpenCV
#   Id: 0
#   Backend api: AVFOUNDATION
#   Default stream profile:
#     Format: 16.0
#     Width: 1920
#     Height: 1080
#     Fps: 15.0
हे प्रत्येक सत्रात चालवा: डॉक्स चेतावणी देतात की ऑपरेटिंग सिस्टमनुसार रीबूट किंवा रीप्लग केल्यानंतर हे ओळखकर्ते बदलू शकतात.

दोन दृश्ये, आणि ती कुठे आहेत हे महत्त्वाचे आहे: कार्यक्षेत्राला कव्हर करणारा एक निश्चित सीन कॅमेरा, आणि जवळचा मनगट कॅमेरा एंड-इफेक्टर जे ग्रिपर स्पर्श करणार आहे ते दाखवतो. LeRobot समुदाय-डेटासेट चेकलिस्टमध्ये शक्यतो 480x640 / 720p किंवा त्याहून चांगले दोन दृश्ये, स्थिर पार्श्वभूमी, तटस्थ स्थिर प्रकाश आणि लीडर आर्म व मानवी अवयव फ्रेमच्या बाहेर असावेत अशी मागणी केली आहे. रेकॉर्डिंग मार्गदर्शक एक सामान्य नियम जोडतो: तुम्ही फक्त कॅमेऱ्याच्या प्रतिमा पाहून स्वतःच कार्य पूर्ण करू शकले पाहिजे.

कॅमेरा इंडेक्स ही स्थिर ओळख नाही

OpenCV इंडेक्स गणना क्रमाने येतात, त्यामुळे रीबूट किंवा रीप्लग केल्याने इंडेक्स 0 आणि 2 जागा बदलू शकतात आणि मनगटाचे दृश्य संपूर्ण सत्रासाठी वरच्या स्लॉटमध्ये येऊ शकते. lerobot स्वतःच असे म्हणते: त्याचा कॅमेरा क्लास डिव्हाइस पाथ तसेच एक पूर्णांक घेतो आणि चेतावणी देतो की इंडेक्स रीबूट किंवा पोर्ट बदलांवर अस्थिर असतात, विशेषतः लिनक्सवर. index_or_path ला /dev/v4l/by-id/ अंतर्गत udev सिम्लिंककडे निर्देशित करा, जे गणना क्रमाने न जाता डिव्हाइसचे अनुसरण करते. डेटासेट अंतर्गत विसंगत होण्याचा हा सर्वात सामान्य मार्ग आहे आणि प्रशिक्षण ते दुरुस्त करू शकत नाही. कॅमेरा आढळला नाही.

रेकॉर्ड कमांड आणि प्रत्येक फ्लॅग

bash
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')

lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_so100_follower \
    --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_so100_leader \
    --display_data=true \
    --dataset.repo_id=${HF_USER}/so100_pick_cube \
    --dataset.single_task="Pick the red cube and drop it in the box" \
    --dataset.num_episodes=50 \
    --dataset.fps=30 \
    --dataset.episode_time_s=25 \
    --dataset.reset_time_s=10 \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2
कॅमेरा डिक्ट ही एक शेल-कोटेड स्ट्रिंग आहे; नेस्टेड ब्रेसेस शेल सिंटॅक्स नाहीत.

खालील डीफॉल्ट येथून येतात src/lerobot/configs/dataset.py, मुख्यवर, ट्यूटोरियल नाही. काही गोष्टी लोक गृहीत धरतात तशा नाहीत.

फ्लॅगडीफॉल्टते काय करते
--dataset.repo_idरिकामेनाव; डीफॉल्टनुसार टाइमस्टॅम्प जोडला जातो
--dataset.single_taskरिकामेप्रत्येक एपिसोडसोबत साठवलेली टास्क स्ट्रिंग
--dataset.root$HF_LEROBOT_HOME/repo_idलिहिण्याचा मार्ग, डीफॉल्ट ~/.cache/huggingface/lerobot/
--dataset.fps30कंट्रोल लूप दर आणि डेटासेट फ्रेम दर
--dataset.episode_time_s60एपिसोड आपोआप पुढे जाण्यापूर्वीची सेकंद
--dataset.reset_time_s60सीन रीसेट; आर्म हलतो, काहीही साठवले जात नाही
--dataset.num_episodes50या सत्रात रेकॉर्ड केलेले एपिसोड
--dataset.push_to_hubtrueसत्र संपल्यावर अपलोड करा; false असल्यास स्थानिक राहते
--dataset.streaming_encodingडेटाक्लासमध्ये false, डॉक्स टेबलमध्ये trueकॅप्चर करताना एन्कोड करा; ते स्पष्टपणे सेट करा
--dataset.encoder_queue_maxsize30प्रत्येक कॅमेऱ्यासाठी बफर केलेले फ्रेम्स, 30 fps वर ~1 सेकंद
--dataset.encoder_threadsशून्य (कोडेक ठरवतो)प्रत्येक एन्कोडरसाठी थ्रेड्स; कॅप्चर अडखळत असल्यास कमी करा
--dataset.no_stampfalserepo_id जसे टाइप केले आहे तसे ठेवा
--resumefalseविद्यमान डेटासेटमध्ये जोडा; --dataset.root आवश्यक आहे
दोन फ्लॅग्स जे अनपेक्षितपणे एक तास वाया घालवतात

तुमच्या डेटासेटचे नाव तुम्ही टाइप केल्याप्रमाणे नाही. lerobot एक तारीख-वेळ टॅग जोडतो, त्यामुळे so100_pick_cube हे so100_pick_cube_20260823_141530 असे होते. स्थिर नावासाठी --dataset.no_stamp=true वापरा. पुन्हा सुरू केल्यास एकूण संख्या नव्हे, तर वाढीव संख्या मोजली जाते. --resume=true सह, --dataset.num_episodes अतिरिक्त एपिसोड्सची गणना करते आणि --dataset.root अनिवार्य होते. 30-एपिसोडच्या डेटासेटवर 50 मागितल्यास तुम्हाला 80 मिळतात.

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

  • उजवा बाण किंवा n: एपिसोड किंवा रीसेट टप्पा लवकर संपवा. तुम्ही ही की सर्वात जास्त वापरता, कारण स्वच्छ पकडीसाठी क्वचितच 25 सेकंद लागतात.
  • डावा बाण किंवा r: एपिसोड रद्द करा आणि पुन्हा करा. खराब टेक आता काहीही खर्च करत नाही, पण नंतर खूप खर्चिक ठरू शकते.
  • Escape किंवा q: सत्र थांबवा, एन्कोडिंग पूर्ण करा, अपलोड करा.
  • हे X11, Wayland आणि हेडलेस SSH वर काम करतात: कोणतेही ग्लोबल की बॅकएंड नसताना, lerobot-record कंट्रोलिंग टर्मिनलमधून त्याच कीज वाचते. ही अक्षरे लॅगी SSH लिंक्सवरही काम करतात, जिथे बाणांचे क्रम तुटतात.
  • कीबोर्ड टेलिऑपरेशन वेगळे आहे आणि त्याला ग्लोबल बॅकएंडची आवश्यकता आहे: X11, Windows, किंवा Accessibility सह macOS.

किती एपिसोड्स, आणि एक चांगला एपिसोड कसा दिसतो

रेकॉर्डिंग मार्गदर्शक पहिल्या कार्यासाठी किमान 50 एपिसोड्स, प्रत्येक वस्तूच्या स्थानासाठी सुमारे 10, सुचवतो. धोरण पृष्ठे प्रत्येक मॉडेलसाठी किमान संख्या सूचीबद्ध करतात, ज्याखालील रन GPU वेळेसाठी योग्य नाही.

धोरणकिमान एपिसोड्सडेटासेट स्वरूपGPU स्तरप्रति रन खर्च
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 4 to 12 USD

खरा प्रश्न हा आहे की किती आणि कशाचे. Data Scaling Laws in Imitation Learning for Robotic Manipulation (लिन एट अल., 2024) यांनी 40,000 पेक्षा जास्त प्रात्यक्षिके गोळा केली आणि 15,000 पेक्षा जास्त वास्तविक-जगातील रोलआउट्स चालवले. सामान्यीकरण हे च्या संख्येनुसार अंदाजे पॉवर-लॉ संबंधाचे अनुसरण करते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. डॉक्स आणि कोडमध्ये विसंगती आहे, म्हणून ते स्पष्टपणे सेट करा; जेव्हा ध्वज बंद असतो तेव्हा लेरोबोट ते शिफारस करणारा एक संकेत लॉग करतो.

जीपीयू भाड्याने घेण्यापूर्वी डेटासेट तपासा

डॉक्समधील स्वीकृती चाचणी: व्हिडिओचा कालावधी सीएलआयने नोंदवलेल्या एपिसोडच्या कालावधीशी तुलना करा आणि पंक्तींची संख्या एफपीएस गुणिले कालावधी इतकी असल्याची खात्री करा. प्रत्येक एपिसोडनुसार, एकूण संख्येनुसार नाही.

python
from lerobot.datasets import LeRobotDataset

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

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

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

मग ते पहा. lerobot-dataset-viz Rerun किंवा Foxglove मध्ये कॅमेरा दृश्यांच्या शेजारी जॉइंट ट्रेससह एपिसोड फ्रेम बाय फ्रेम पुन्हा प्ले करते. अदलाबदल केलेले कॅमेरे आणि गोठवलेल्या फ्रेम्स दहा सेकंदात दिसतात. लोक ही पायरी वगळतात.

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

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

# Drop the episodes that did not survive review
lerobot-edit-dataset \
    --repo_id your-user/so100_pick_cube_20260823_141530 \
    --new_repo_id your-user/so100_pick_cube_clean \
    --operation.type delete_episodes \
    --operation.episode_indices "[3, 17, 41]"
lerobot-edit-dataset स्प्लिट, मर्ज, remove_feature, modify_tasks आणि आकडेवारीची पुनर्गणना देखील करते. उदारपणे हटवा: एक खराब एपिसोड एका एपिसोडची किंमत आहे; तो ठेवल्यास त्यावर प्रशिक्षित केलेल्या प्रत्येक रनची किंमत मोजावी लागते.
AY-Robots डेटासेट डिरेक्टरी सार्वजनिक LeRobot डेटासेटची एपिसोड संख्या आणि फॉरमॅटसह सूची दर्शवते
तुलनात्मक डेटासेटचे आकार आणि भाष्य कसे केले जाते.

v2.1 किंवा v3.0: रेकॉर्ड करण्यापूर्वी ठरवा

v2.1 ने प्रत्येक एपिसोडसाठी एक 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, डेटासेट स्टॅकद्वारे
हबमधून स्ट्रीमिंगनाहीहोय, 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 दशलक्ष पॅरामीटर्स प्रति क्रिया स्टेप सुमारे 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

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started