صفحه آموزشی AY-Robots برای ضبط اولین مجموعه داده LeRobot شما با بازوی SO-100
LeRobotSO-100ضبط مجموعه دادهتله‌اپریشنیادگیری تقلیدی

اولین مجموعه داده LeRobot خود را با یک SO-100 ضبط کنید

AY-Robots ResearchAugust 23, 202616 دقیقه مطالعه

یک مجموعه داده LeRobot قابل استفاده را با SO-100 ضبط کنید: کالیبراسیون، تله‌اپریشن رهبر-پیرو، پرچم‌ها و پیش‌فرض‌های واقعی lerobot-record، تنظیمات دوربین، تعداد اپیزودها، و نقص‌هایی که یک اجرا را خراب می‌کنند.

یک SO-100 فالوور، یک بازوی لیدر با طراحی مشابه و دو دوربین USB می‌توانند یک سیاست (policy) را در یک بعدازظهر تنظیم دقیق کنند. همین میز کار می‌تواند به راحتی شصت اپیزود تولید کند که در یک مرورگر فایل سالم به نظر می‌رسند و یک اجرای شش ساعته GPU را هدر دهد. تفاوت به ندرت مدل است؛ بلکه چیزی است که بین سرووها و فایل parquet اتفاق افتاده است.

در اینجا مسیر دستی، سپس مسیر کوتاه‌تر آمده است. هر دستور از lerobot 0.6.1 است که در 3 آگوست 2026 منتشر شده و در PyPI به‌روز است. این به نقاط ورودی کنسول منتقل شده است، بنابراین آموزش‌هایی که اجرا می‌کنند python lerobot/scripts/control_robot.py فایلی را توصیف می‌کنند که دیگر وجود ندارد.

نسخه کوتاه

  • lerobot 0.6.1 نسخه 3.0 را ضبط می‌کند؛ GR00T N1.7 و N1.5 نسخه 2.1 را می‌خواهند. قبل از فشردن دکمه ضبط، فرمت را مشخص کنید.
  • چهار دستور: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. همان --robot.id و --teleop.id را از کالیبراسیون به جلسه ضبط منتقل کنید.
  • پیش‌فرض‌های واقعی: 30 fps, 60 s per episode, 60 s reset, 50 episodes, about 100 minutes of wall clock.
  • حداقل اپیزودها در اینجا: 30 برای SmolVLA, 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 اپیزود و 19,631 فریم با نرخ 30 فریم بر ثانیه است: حدود 393 فریم، یا 13 ثانیه، برای هر اپیزود. اگر میانگین اپیزودهای شما یک دقیقه است، یا کار سخت‌تری انجام می‌دهید یا زمان مرده را در هر دو انتها ضبط می‌کنید.

مدخل واژه‌نامه AY-Robots برای فرمت مجموعه داده LeRobot، که طرح‌بندی دایرکتوری و فایل‌های فراداده را نشان می‌دهد.
آنچه در data/، videos/ و meta/ قرار دارد و اینکه کدام سیاست‌ها کدام نسخه را می‌خوانند.

آنچه روی میز کار نیاز دارید

موردجزئیاتنکته
بازوی دنبال‌کنندهSO-100، شش سروو Feetech STS3215حدود 110 تا 150 یورو در قطعات
بازوی پیشرویک SO-100 دوم، چرخ‌دنده‌ها برداشته شده‌اندچرخ‌دنده‌ها از هر شش موتور پیشرو جدا شده‌اند: فقط انکودر، اصطکاک کمتر
برقمطابق با نسخه 7.4 ولتی STS3215 در لیست قطعاتبه هشدار زیر مراجعه کنید
دوربین‌هادو دوربین USB، 640x480 با 30 فریم بر ثانیهیکی برای نمای صحنه، یکی روی مچ
میزبانپایتون 3.12 یا جدیدتر، ffmpegrequires-python >= 3.12
حساب Hubتوکن نوشتن Hugging Faceoptional with --dataset.push_to_hub=false
7.4 ولت، نه 12 ولت

STS3215 در دو نسخه عرضه می‌شود: README مربوط به SO-ARM100 نسخه 7.4 ولتی را با گشتاور توقف 16.5 کیلوگرم.سانتی‌متر اندازه‌گیری شده در 6 ولت و نسخه 12 ولتی را با 30 کیلوگرم.سانتی‌متر ارزیابی می‌کند و اشاره می‌کند که انتخاب موتورهای 12 ولتی به معنای خرید یک منبع تغذیه 12 ولت 5 آمپر+ به جای منبع 5 ولتی است. لیست قطعات، سرووهای 7.4 ولتی را فهرست می‌کند. تغذیه 12 ولت به سرووهایی که برای 7.4 ولت درجه‌بندی شده‌اند، آنها را از بین می‌برد، بنابراین قبل از سیم‌کشی هر چیزی، برچسب موتور را بخوانید. سروو پاسخ نمی‌دهد.

اگر بازو هنوز ساخته نشده است، این یک کار جداگانه است: از و شروع کنید. اگر هنوز چیزی نخریده‌اید، ابتدا را بخوانید: 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 را نصب می‌کند، نه چیزی که با ربات ارتباط برقرار کند. بازوهای Koch به dynamixel به جای feetech نیاز دارند. اگر پوسته شما هرگز نام lerobot-record را نشنیده است، دلیلش همین است.

پورت‌ها، شناسه‌های موتور و کالیبراسیون

سه مرحله یک‌باره بین قطعات و یک حلقه تله‌اپراتوری فعال قرار دارند. باعث می‌شود یک سیاست (policy) آموزش‌دیده روی بازوی شما، روی بازوی شخص دیگری اجرا شود و شمارش‌های خام انکودر را به یک قرارداد مشترک مفصلی نگاشت کند.

  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 را به آن می‌دهد، سپس 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 را فشار دهید، سپس هر کدام را در کل دامنه حرکتی خود حرکت دهید. 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 را به symlink udev در زیر /dev/v4l/by-id/ اشاره دهید، که به جای ترتیب شمارش، دستگاه را دنبال می‌کند. این رایج‌ترین راهی است که یک مجموعه داده به صورت داخلی ناسازگار می‌شود و آموزش نمی‌تواند آن را ترمیم کند. دوربین شناسایی نشد.

دستور record و هر پرچم

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 در شاخه اصلی (main) می‌آیند، نه از یک آموزش. برخی از آن‌ها آن چیزی نیستند که مردم تصور می‌کنند.

پرچمپیش‌فرضکاربرد
--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فریم‌های بافر شده برای هر دوربین، حدود ۱ ثانیه با ۳۰ فریم بر ثانیه
--dataset.encoder_threadsnull (codec decides)رشته‌ها (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 اجباری می‌شود. اگر در یک مجموعه داده ۳۰ اپیزودی، ۵۰ اپیزود درخواست کنید، ۸۰ اپیزود خواهید داشت.

کنترل با صفحه کلید در طول یک جلسه

  • فلش راست یا n: پایان دادن به اپیزود یا بازنشانی فاز زودتر. این کلیدی است که بیشتر از آن استفاده می‌کنید، زیرا یک گرفتن تمیز به ندرت به ۲۵ ثانیه نیاز دارد.
  • فلش چپ یا r: اپیزود را دور بیندازید و دوباره انجام دهید. یک برداشت بد اکنون هیچ هزینه‌ای ندارد و بعداً هزینه زیادی خواهد داشت.
  • Escape یا q: جلسه را متوقف کنید، رمزگذاری را به پایان برسانید، آپلود کنید.
  • اینها روی X11، Wayland و SSH بدون رابط گرافیکی کار می‌کنند: بدون بک‌اند کلید سراسری، lerobot-record همان کلیدها را از ترمینال کنترل‌کننده می‌خواند. حروف در لینک‌های SSH کند، که در آن توالی‌های فلش تقسیم می‌شوند، دوام می‌آورند.
  • تله‌اپریشن با صفحه کلید متفاوت است و به یک بک‌اند سراسری نیاز دارد: X11، Windows، یا macOS با Accessibility.

چند اپیزود، و یک اپیزود خوب چگونه به نظر می‌رسد

راهنمای ضبط حداقل ۵۰ اپیزود را برای اولین کار پیشنهاد می‌کند، حدود ۱۰ اپیزود برای هر مکان شیء. صفحات سیاست‌گذاری حداقل تعداد را برای هر مدل فهرست می‌کنند، که کمتر از آن اجرای مدل ارزش زمان GPU را ندارد.

Policyحداقل اپیزودفرمت مجموعه دادهرده 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 (لین و همکاران، ۲۰۲۴) بیش از ۴۰,۰۰۰ نمایش جمع‌آوری کرده و بیش از ۱۵,۰۰۰ اجرای واقعی را انجام دادند. تعمیم‌پذیری تقریباً از یک رابطه قانون توانی با تعداد محیط‌ها و اشیاء پیروی می‌کرد، و پس از عبور از یک آستانه برای هر محیط یا شیء، نمایش‌های اضافی تأثیر ناچیزی داشتند. در یک سناریو: شیء را حرکت دهید، نور را تغییر دهید، مکعب را جابجا کنید، به جای تکرار یک برداشت.

تله‌اپریشن رهبر-پیرو به عنوان منبع داده
مزایا
  • مسیرهای پیوسته مفصلی که یک سروو می‌تواند بازتولید کند، برخلاف کیبورد یا گیم‌پد
  • عمل و حالت یک قرارداد مختصاتی مشترک دارند، بنابراین سیاست هدفی را یاد می‌گیرد که می‌تواند مستقیماً فرمان دهد
  • یک اپیزود ۲۵ ثانیه‌ای به اضافه یک بازنشانی ۱۰ ثانیه‌ای تقریباً ۱۰۰ اپیزود در ساعت است
  • اپراتور احساس می‌کند که پیرو متوقف یا گیر می‌کند، بنابراین خطاها قبل از ثبت داده‌ها آشکار می‌شوند
معاوضه‌ها
  • بازوی دوم تقریباً هزینه قطعات را دو برابر می‌کند
  • نمایش‌ها عادات اپراتور را به ارث می‌برند؛ ماندلکار و همکاران دریافتند که کیفیت سیاست به شدت به کیفیت نمایش بستگی دارد
  • رهبر با نرخ حلقه نمونه‌برداری می‌شود، بنابراین مکث‌ها به ردیف‌های تقریباً یکسانی تبدیل می‌شوند که به سیاست یاد می‌دهند منتظر بماند
  • هیچ چیز سازگاری بین جلسات را تضمین نمی‌کند: یک دوربین که ۵ سانتی‌متر جابجا شده، یک تغییر توزیع پنهان است

یک اپیزود خوب خسته‌کننده است: وضعیت اولیه قابل تکرار، یک کار انجام شده، پایان یافته به محض اینکه شیء در سطل قرار گرفت، رشته وظیفه در محدوده ۲۵ تا ۵۰ کاراکتری که چک‌لیست توصیه می‌کند. مکعب قرمز را بردارید و در جعبه بیندازید یک رشته وظیفه است؛ 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، در حالی که کلاس داده در main می‌خواند streaming_encoding: bool = False. مستندات و کد با هم اختلاف دارند، بنابراین آن را به صراحت تنظیم کنید؛ lerobot هر زمان که با پرچم خاموش شروع به کار کند، یک راهنمایی برای توصیه آن ثبت می‌کند.

قبل از اجاره 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 برای هر اپیزودچندین اپیزود در هر شارد
فراداده اپیزودفایل‌های JSONLparquet تکه‌تکه شده در meta/episodes/، از طریق پشته 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
سریع برای ۵۰ اپیزود. مقیاس‌بندی کاری متفاوت است: راهنمای پورتینگ lerobot، برای DROID خام به v3.0، بیش از ۷ روز پردازش محلی و حدود ۴۰۰ گیگابایت بودجه در نظر می‌گیرد.

دو مسیر برای رسیدن به یک مجموعه داده

همه موارد بالا، روی دستگاه خودتان: شما مالک شمارش USB، ساخت ffmpeg، تنظیم رمزگذار و فایل‌های کالیبراسیون هستید. مسیر درست برای درک پایپ‌لاین، اجرای یک تنظیمات دوربین غیرمعمول، یا نگه داشتن داده‌ها به صورت محلی.

هزینه این مسیر

زمان: یک عصر برای هر بازو برای مونتاژ، یک کالیبراسیون اولیه دشوار، و یک جلسه اول که آن را دور می‌اندازید زیرا دوربین در شکاف اشتباهی قرار داشت.

مجموعه داده‌های LeRobot را بدون سیم‌کشی پایپ‌لاین خودتان ضبط کنید

کلاینت دسکتاپ AY-Robots اپیزودها، جریان‌های دوربین و وضعیت‌های مفصل را با فرمت LeRobot از یک جلسه عملیات از راه دور ضبط می‌کند، سپس مجموعه داده را به ترینر تحویل می‌دهد.

کلاینت دسکتاپ را دریافت کنید

از مجموعه داده تا مدل رفتاری

پنجاه اپیزود تمیز، هر اجرا شده در اینجا را تغذیه می‌کند. به تنهایی و از ابتدا روی وظیفه شما آموزش می‌بیند، حدود 80 میلیون پارامتر با تقریباً 20 میلی‌ثانیه در هر گام عملیاتی، تنها مدل از پنج مدل که با حرکت سریع راحت است. حدود 450 میلیون پارامتر روی یک کارت 24 گیگابایتی دارد. یک مدل بنیادی تقریباً 3 میلیارد پارامتری است که در آن حدود 40 میلیون پارامتر را درگیر می‌کند، به A100 یا H100 نیاز دارد و آن مجموعه داده v2.1 را می‌خواهد.

در ادامه، راهنمای ترکیب شما: ، یا ؛ برای اولین اجرا، کوتاه‌تر است. وقتی مدل رفتاری روی میز کار می‌کند اما به محض حرکت دادن میز از کار می‌افتد، این یک مشکل داده است: و به عمق تنوع می‌پردازند.

واقعاً برای اولین مدل رفتاری کارآمد به چند اپیزود نیاز دارم؟

سی برای SmolVLA، پنجاه برای ACT، Pi0.5، GR00T N1.5 و N1.7، حداقل‌هایی که مربیان AY-Robots اعمال می‌کنند. راهنمای LeRobot به طور مستقل حداقل 50 اپیزود را برای اولین وظیفه، حدود 10 اپیزود برای هر مکان شیء، توصیه می‌کند. مطالعات مقیاس‌بندی داده نشان داده است که تعمیم‌پذیری با محیط‌ها و اشیاء مقیاس‌پذیر است تا با تعداد نمایش‌ها، بنابراین صد برداشت از یک صحنه بدتر از پنجاه برداشت در پنج مکان مختلف است.

آیا به بازوی رهبر نیاز دارم، یا می‌توانم با صفحه کلید تله‌اپراتوری کنم؟

lerobot تله‌اپراتورهای صفحه کلید و گیم‌پد را ارائه می‌دهد، بنابراین بازوی رهبر به طور قطعی لازم نیست، اما به شدت ترجیح داده می‌شود: رهبر-پیرو مسیرهای پیوسته مفصلی را در قرارداد مختصات عمل ضبط شده ارائه می‌دهد، در حالی که ورودی صفحه کلید حرکت پله‌ای تولید می‌کند که مدل رفتاری آن را به عنوان تکان یاد می‌گیرد. تله‌اپراتوری با صفحه کلید همچنین به یک بک‌اند کلید سراسری نیاز دارد، بنابراین در Wayland و حالت بدون نمایشگر (headless) کار نمی‌کند.

آیا می‌توانم روی رزبری پای یا یک مینی پی‌سی کوچک ضبط کنم؟

بله، با تنظیم. راهنمای رمزگذاری جریانی (streaming-encoding) یک بخش منابع کم دارد که ماشین‌های مدرن 4 هسته‌ای و رزبری پای 5 را پوشش می‌دهد و دو دوربین با رزولوشن 640x480 و 30 فریم بر ثانیه را در ستون 'نیاز به تنظیم' خود قرار می‌دهد. توصیه آن: رقابت رمزگذار با حلقه ضبط را متوقف کنید، از طریق --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 ارائه می‌دهد و هیچ چیز برعکس آن.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started