AY-Robots ٹیوٹوریل صفحہ اپنا پہلا LeRobot ڈیٹا سیٹ ایک SO-100 بازو کے ساتھ ریکارڈ کرنے کے لیے
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 سیکنڈ فی ایپیسوڈ، 60 سیکنڈ ری سیٹ، 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 تک، بس پر IDs 1 سے 6 لکھتا ہے: وہی چھ جوائنٹس، مختلف کیز، جو اس وقت اہم ہوتا ہے جب کوئی کنفیگریشن کسی فیچر کو نام سے مخاطب کرتی ہے۔

ایک حقیقی ڈیٹا سیٹ سے پیمانہ

اس ڈیٹا سیٹ میں 50 ایپی سوڈز اور 19,631 فریمز 30 fps پر ہیں: تقریباً 393 فریمز، یا 13 سیکنڈز، فی ایپی سوڈ۔ اگر آپ کے اوسطاً ایک منٹ ہیں، تو آپ کچھ زیادہ مشکل کر رہے ہیں یا دونوں سروں پر ڈیڈ ٹائم ریکارڈ کر رہے ہیں۔

LeRobot ڈیٹا سیٹ فارمیٹ کے لیے AY-Robots کی لغت کا اندراج، جو ڈائریکٹری لے آؤٹ اور میٹا ڈیٹا فائلوں کو دکھا رہا ہے۔
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 رائٹ ٹوکناختیاری، --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 سسٹم کا خلاصہ پرنٹ کرتا ہے، بشمول ffmpeg ورژن جو اسے PATH پر مل سکتا ہے۔

ایکسٹراز اکثر لوگوں کو الجھاتے ہیں۔ pip install lerobot صرف بنیادی ML انحصار انسٹال کرتا ہے، روبوٹ سے بات کرنے والی کوئی چیز نہیں۔ کوچ آرمز کو dynamixel کی بجائے feetech کی ضرورت ہوتی ہے۔ اگر آپ کے شیل نے کبھی lerobot-record کے بارے میں نہیں سنا، تو اس کی وجہ یہی ہے۔

پورٹس، موٹر آئی ڈیز اور کیلیبریشن

تین ایک بار کے اقدامات پرزوں اور ایک فعال ٹیلی اوپ لوپ کے درمیان حائل ہیں۔ آپ کے بازو پر تربیت یافتہ پالیسی کو کسی اور کے بازو پر چلاتی ہے، جو خام انکوڈر گنتی کو مشترکہ جوائنٹ کنونشن پر نقش کرتی ہے۔

  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
    موٹر آئی ڈیز اور باڈریٹس لکھیں

    آئی ڈیز ایک وقت میں ایک موٹر پر لکھے جاتے ہیں، اور دستاویزات اس بارے میں سخت ہیں کہ کیسے: کنٹرولر بورڈ سے صرف ایک موٹر کو جوڑیں، جو ابھی تک کسی دوسرے سے ڈیزی چین نہ ہو۔ اسکرپٹ چین کو پیچھے کی طرف چلاتی ہے، پہلے گریپر کے لیے اشارہ کرتی ہے اور اسے آئی ڈی 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
    دونوں بازوؤں کو کیلیبریٹ کریں

    ہر جوائنٹ کو اس کی رینج کے وسط میں لے جائیں، Enter دبائیں، پھر ہر ایک کو اس کی پوری رینج میں گھمائیں۔ 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 کو ایک کیلیبریٹڈ آئی ڈی دیں اور یہ پروفائل کو دوبارہ استعمال کرنے کے لیے Enter یا اسے دوبارہ کرنے کے لیے 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_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فی کیمرہ بفرڈ فریمز، 30 fps پر تقریباً 1 سیکنڈ
--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 لازمی ہو جاتا ہے۔ 30 ایپی سوڈ والے ڈیٹا سیٹ پر 50 کا مطالبہ کریں تو آپ کو 80 ملیں گے۔

ایک سیشن کے دوران کی بورڈ کنٹرول

  • دائیں تیر یا n: ایپی سوڈ کو ختم کریں یا ری سیٹ فیز کو جلد ختم کریں۔ یہ وہ کلید ہے جو آپ سب سے زیادہ استعمال کرتے ہیں، کیونکہ ایک صاف گرفت کو شاذ و نادر ہی 25 سیکنڈ کی ضرورت ہوتی ہے۔
  • بائیں تیر یا r: ایپی سوڈ کو مسترد کریں اور اسے دوبارہ کریں۔ ایک خراب ٹیک اب کچھ بھی خرچ نہیں کرتا اور بعد میں بہت کچھ۔
  • Escape یا q: سیشن کو روکیں، انکوڈنگ مکمل کریں، اپ لوڈ کریں۔
  • یہ X11، Wayland اور ہیڈ لیس SSH پر کام کرتے ہیں: بغیر کسی گلوبل کی بیک اینڈ کے، lerobot-record کنٹرولنگ ٹرمینل سے وہی کیز پڑھتا ہے۔ یہ حروف سست SSH لنکس پر بھی کام کرتے ہیں، جہاں تیر کے سلسلے ٹوٹ جاتے ہیں۔
  • کی بورڈ ٹیلی آپریشن مختلف ہے اور اسے ایک گلوبل بیک اینڈ کی ضرورت ہوتی ہے: X11، Windows، یا macOS Accessibility کے ساتھ۔

کتنے ایپی سوڈز، اور ایک اچھا کیسا لگتا ہے

ریکارڈنگ گائیڈ پہلی ٹاسک کے لیے کم از کم 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 سے زیادہ حقیقی دنیا کے رول آؤٹس چلائے۔ عمومی کاری کا تعلق تقریباً پاور-لا کے مطابق تھا، جس میں ماحول اور اشیاء کی تعداد شامل تھی، اور فی ماحول یا آبجیکٹ ایک حد سے تجاوز کرنے کے بعد، اضافی مظاہروں کا کم سے کم اثر ہوا۔ ایک بینچ پر: آبجیکٹ کو حرکت دیں، روشنی تبدیل کریں، کیوب کو تبدیل کریں، بجائے اس کے کہ ایک ہی ٹیک کو دہرایا جائے۔

ڈیٹا سورس کے طور پر لیڈر-فالور ٹیلی آپریشن
فوائد
  • مسلسل جوائنٹ ٹریجیکٹریز جو ایک سروو دوبارہ پیدا کر سکتا ہے، کی بورڈ یا گیم پیڈ کے برعکس
  • ایکشن اور اسٹیٹ ایک کوآرڈینیٹ کنونشن کا اشتراک کرتے ہیں، لہذا پالیسی ایک ایسا ہدف سیکھتی ہے جسے وہ براہ راست کمانڈ کر سکتی ہے
  • ایک 25 سیکنڈ کا ایپی سوڈ اور 10 سیکنڈ کا ری سیٹ تقریباً 100 ایپی سوڈز فی گھنٹہ بنتے ہیں
  • آپریٹر فالور کو رکتے یا پھنستے ہوئے محسوس کرتا ہے، لہذا ڈیٹا کے کمٹ ہونے سے پہلے خرابیاں سامنے آ جاتی ہیں
نقصانات
  • دوسرا بازو تقریباً پرزوں کی لاگت کو دوگنا کر دیتا ہے
  • مظاہرے آپریٹر کی عادات کو وراثت میں لیتے ہیں؛ منڈلیکر ایٹ ال نے پایا کہ پالیسی کا معیار مظاہرے کے معیار پر بہت زیادہ منحصر ہوتا ہے
  • لیڈر کو لوپ ریٹ پر نمونہ کیا جاتا ہے، لہذا وقفے تقریباً یکساں قطاریں بن جاتے ہیں جو پالیسی کو انتظار کرنا سکھاتے ہیں
  • سیشنز کے درمیان کوئی چیز مستقل مزاجی کو نافذ نہیں کرتی: 5 سینٹی میٹر ہٹایا گیا کیمرہ ایک پوشیدہ ڈسٹری بیوشن شفٹ ہے

ایک اچھا واقعہ بورنگ ہوتا ہے: دہرائی جانے والی ہوم پوز، ایک کام مکمل، جب آبجیکٹ بن میں ہو تو ختم، ٹاسک سٹرنگ 25 سے 50 حروف میں جو چیک لسٹ تجویز کرتی ہے۔ Pick the red cube and drop it in the box ایک ٹاسک سٹرنگ ہے؛ task1 وہ اینٹی پیٹرن ہے جسے چیک لسٹ واضح طور پر نامزد کرتی ہے۔ مبہم تشریحات اس کے مسائل کی فہرست میں سرفہرست ہیں، اور وہ سب سے زیادہ اہم ہیں ویژن-لینگویج-ایکشن ماڈلز، جہاں سٹرنگ ایک ماڈل ان پٹ ہے، نہ کہ فائل کا نام۔

وہ نقائص جو خاموشی سے ڈیٹا سیٹ کو تباہ کر دیتے ہیں

کوئی بھی استثنا نہیں پھینکتا۔ سب تربیت میں زندہ رہتے ہیں، ایک ایسی لاس کرو کے طور پر سامنے آتے ہیں جو ٹھیک لگتی ہے اور ایک روبوٹ جو کچھ نہیں کرتا۔ منظر ترتیب دیتے وقت چیک کریں۔

نقصیہ کیسا لگتا ہےیہ کہاں سے آتا ہےاسے کیسے پکڑیں
کیمرہ ویوز کا تبادلہٹاپ کی کے نیچے کلائی کی تصویردوبارہ پلگ کرنے کے بعد انڈیکس کی دوبارہ تفویضlerobot-find-cameras each session; by-id paths
منجمد فریمزدرجنوں قطاروں کے لیے ایک ہی تصویرکیمرہ ڈیلیور کرنا بند کر دیتا ہے؛ لوپ آخری فریم کو دہراتا ہےscrub it in lerobot-dataset-viz
چھوڑے گئے فریمزقطاروں کی گنتی fps ضرب سیکنڈ سے کمکیو اوور فلو ہو جاتی ہے، بلاک کرنے کے بجائے چھوڑ دیتی ہے'Encoder queue full' in the log; rows vs fps times duration
جوائنٹ اپنی حد پرایک جوائنٹ کم از کم یا زیادہ سے زیادہ پر فلیٹلیڈر کی رینج فالوور کی رینج سے زیادہ ہے، یا ایک خراب درمیانی پوزper-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand
تصویر اور ایکشن بے ترتیبپالیسی پیش گوئی کرتی ہے یا پیچھے رہ جاتی ہےکیمرے لوپ سے مختلف fps پرkeep every camera at --dataset.fps
مردہ وقتایک جیسی ایکشن قطاروں کی لمبی دوڑیںآپریٹر نے ریکارڈر چلتے ہوئے روکاshare of consecutive identical action rows
ناقابل استعمال ٹاسک سٹرنگtask1, demo2, testتیزی سے ٹائپ کرناmeta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks
ڈراپ شدہ فریم خود کو چھپا لیتے ہیں

انکوڈر ہر کیمرے کے لیے ایک محدود قطار رکھتا ہے، جو بطور ڈیفالٹ 30 فریمز پر مشتمل ہوتی ہے۔ جب یہ رفتار برقرار نہیں رکھ پاتا، تو فریمز بلاک ہونے کے بجائے ڈراپ ہو جاتے ہیں: کیپچر جاری رہتا ہے اور کچھ بھی کریش نہیں ہوتا۔ آپ کو Encoder queue full for {camera}, dropped N frame(s) اور ایپی سوڈ کے اختتام پر فی کیمرہ کل تعداد ملتی ہے۔ lerobot کی حد: تقریباً 5 فیصد فریمز کا غائب ہونا ایک اوورلوڈڈ سسٹم کی نشاندہی کرتا ہے، جبکہ 2 فیصد متوقع اسٹارٹ اپ لوڈ ہے۔ ترتیب وار حل: --display_data=false، --dataset.encoder_threads کو کم کریں، vcodec=h264، اسٹریمنگ بند کریں۔

ایک انتباہ: اسٹریمنگ-انکوڈنگ گائیڈ کی جدول میں ڈیفالٹ کے طور پر True درج ہے، جبکہ مین پر موجود ڈیٹا کلاس میں streaming_encoding: bool = False لکھا ہے۔ دستاویزات اور کوڈ میں اختلاف ہے، لہذا اسے واضح طور پر سیٹ کریں؛ lerobot جب بھی فلیگ آف کے ساتھ شروع ہوتا ہے تو اس کی سفارش کرنے والا ایک اشارہ لاگ کرتا ہے۔

جی پی یو کرائے پر لینے سے پہلے ڈیٹا سیٹ چیک کریں

دستاویزات سے قبولیت کا ٹیسٹ: ویڈیو کی مدت کا موازنہ اس ایپی سوڈ کی مدت سے کریں جو 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 ایک ایپی سوڈ کو کیمرے کے مناظر کے ساتھ جوائنٹ ٹریسز کے ساتھ فریم بہ فریم دوبارہ چلاتا ہے، ریرن یا فاکسگلو میں۔ تبدیل شدہ کیمرے اور منجمد فریم دس سیکنڈ میں ظاہر ہو جاتے ہیں۔ لوگ اس قدم کو چھوڑ دیتے ہیں۔

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 نے ہر ایپی سوڈ کے لیے ایک پارکیٹ اور ایک MP4 لکھا۔ v3.0 بہت سے ایپی سوڈز کو مشترکہ شارڈز میں جوڑتا ہے اور میٹا ڈیٹا سے حدود کو دوبارہ بناتا ہے، لہذا info.json پاتھ ٹیمپلیٹس کو اس طرح رکھتا ہے data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet ایک ایپی سوڈ نمبر کے بجائے۔ اوپر کی توجیہ کم، بڑی فائلیں ہیں: تیز تر آغاز اور بڑے پیمانے پر کم فائل سسٹم کا دباؤ۔

LeRobot v2.1LeRobot v3.0
لے آؤٹہر ایپی سوڈ کے لیے ایک پارکیٹ اور ایک MP4ہر شارڈ کے لیے کئی ایپی سوڈز
ایپی سوڈ میٹا ڈیٹاJSONL فائلیںmeta/episodes/ کے تحت چنکڈ پارکیٹ، ڈیٹا سیٹس اسٹیک کے ذریعے
ہب سے سٹریمنگنہیںہاں، 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 ملی سیکنڈ فی ایکشن سٹیپ پر، پانچ میں سے واحد جو تیز حرکت کے ساتھ آرام دہ ہے۔ SmolVLA تقریباً 450 ملین پیرامیٹرز کا ہے جو 24 جی بی کارڈ پر چلتا ہے۔ 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 کی بورڈ اور گیم پیڈ ٹیلی آپریٹرز فراہم کرتا ہے، لہذا لیڈر آرم کی سختی سے ضرورت نہیں ہے، لیکن یہ بہت زیادہ بہتر ہے: لیڈر-فالور ریکارڈ شدہ ایکشن کے کوآرڈینیٹ کنونشن میں مسلسل جوائنٹ ٹریجیکٹریز دیتا ہے، جبکہ کی بورڈ ان پٹ قدم بہ قدم حرکت پیدا کرتا ہے جسے پالیسی جھٹکے کے طور پر سیکھتی ہے۔ کی بورڈ ٹیلی آپریشن کو گلوبل کی بیک اینڈ کی بھی ضرورت ہوتی ہے، لہذا یہ Wayland اور ہیڈ لیس پر ناکام ہو جاتا ہے۔

کیا میں Raspberry Pi یا ایک چھوٹے منی پی سی پر ریکارڈ کر سکتا ہوں؟

ہاں، ٹیوننگ کے ساتھ۔ سٹریمنگ-انکوڈنگ گائیڈ میں ایک کم وسائل والا بریکٹ ہے جو جدید 4-کور مشینوں اور Raspberry Pi 5 کا احاطہ کرتا ہے، اور دو کیمروں کو 640x480 اور 30 fps پر اپنی 'کچھ ٹیوننگ کی ضرورت ہے' والے کالم میں رکھتا ہے۔ اس کا مشورہ: انکوڈر کو کیپچر لوپ سے مقابلہ کرنے سے روکیں، via --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 کنورٹر فراہم کرتا ہے اور اس کے برعکس کچھ نہیں۔

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started