
یک مجموعه داده 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 آن خوانده شده است.
| ویژگی | نوع داده | شکل | توضیح |
|---|---|---|---|
| action | float32 | [6] | اهداف مفصلی از بازوی رهبر |
| observation.state | float32 | [6] | موقعیتهای مفصلی که دنبالکننده به آن رسیده است |
| observation.images.top | video | [480, 640, 3] | دوربین صحنه، MP4 (av1 در اینجا) |
| observation.images.wrist | video | [480, 640, 3] | دوربین مچ، با همان نرخ |
| timestamp | float32 | [1] | ثانیه از شروع اپیزود |
| frame_index, episode_index, index, task_index | int64 | [1] | دفترداری خودکار |
مفاصل عبارتند از main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll و main_gripper: شش درجه آزادی SO-100. عمل و حالت شکل یکسانی دارند زیرا تلهاپریشن رهبر-دنبالکننده یک هدف و موقعیت رسیده در یک گام بعد را ثبت میکند. این شکاف اطلاعاتی است: جایی که بازو با گرانش یا یک شیء گیر کرده مبارزه کرده است. این رشتهها متعلق به آن مجموعه داده هستند. یک جلسه که امروز با 0.6.1 ضبط شده است، shoulder_pan.pos تا gripper.pos را مینویسد، شناسههای 1 تا 6 روی باس: همان شش مفصل، کلیدهای متفاوت، که در لحظهای که یک پیکربندی یک ویژگی را با نام آدرسدهی میکند، اهمیت پیدا میکند.
این مجموعه داده شامل 50 اپیزود و 19,631 فریم با نرخ 30 فریم بر ثانیه است: حدود 393 فریم، یا 13 ثانیه، برای هر اپیزود. اگر میانگین اپیزودهای شما یک دقیقه است، یا کار سختتری انجام میدهید یا زمان مرده را در هر دو انتها ضبط میکنید.

آنچه روی میز کار نیاز دارید
| مورد | جزئیات | نکته |
|---|---|---|
| بازوی دنبالکننده | SO-100، شش سروو Feetech STS3215 | حدود 110 تا 150 یورو در قطعات |
| بازوی پیشرو | یک SO-100 دوم، چرخدندهها برداشته شدهاند | چرخدندهها از هر شش موتور پیشرو جدا شدهاند: فقط انکودر، اصطکاک کمتر |
| برق | مطابق با نسخه 7.4 ولتی STS3215 در لیست قطعات | به هشدار زیر مراجعه کنید |
| دوربینها | دو دوربین USB، 640x480 با 30 فریم بر ثانیه | یکی برای نمای صحنه، یکی روی مچ |
| میزبان | پایتون 3.12 یا جدیدتر، ffmpeg | requires-python >= 3.12 |
| حساب Hub | توکن نوشتن Hugging Face | optional with --dataset.push_to_hub=false |
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
conda create -y -n lerobot python=3.12
conda activate lerobot
# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge
# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'
lerobot-infoبیشتر اوقات، افزونهها باعث سردرگمی میشوند. pip install lerobot فقط وابستگیهای اصلی ML را نصب میکند، نه چیزی که با ربات ارتباط برقرار کند. بازوهای Koch به dynamixel به جای feetech نیاز دارند. اگر پوسته شما هرگز نام lerobot-record را نشنیده است، دلیلش همین است.
پورتها، شناسههای موتور و کالیبراسیون
سه مرحله یکباره بین قطعات و یک حلقه تلهاپراتوری فعال قرار دارند. باعث میشود یک سیاست (policy) آموزشدیده روی بازوی شما، روی بازوی شخص دیگری اجرا شود و شمارشهای خام انکودر را به یک قرارداد مشترک مفصلی نگاشت کند.
- 1پورت USB هر بازو را پیدا کنید
آن را با هر دو بازو متصل اجرا کنید، بازویی را که در حال شناسایی آن هستید هنگام درخواست جدا کنید و توجه کنید کدام پورت ناپدید میشود. در لینوکس ممکن است به
sudo chmod 666 /dev/ttyACM0نیاز داشته باشید.bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2شناسههای موتور و نرخهای باود را بنویسید
شناسهها یک موتور در هر زمان نوشته میشوند و مستندات در مورد نحوه انجام آن سختگیرانه هستند: دقیقاً یک موتور را به برد کنترلر وصل کنید، نه به صورت زنجیرهای به موتور دیگری. اسکریپت زنجیره را به عقب طی میکند، ابتدا برای گریپر درخواست میکند و شناسه 6 را به آن میدهد، سپس wrist_roll را 5 و تا shoulder_pan را 1. این کار را قبل از مونتاژ انجام دهید.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3هر دو بازو را کالیبره کنید
هر مفصل را به وسط دامنه حرکتی خود ببرید، Enter را فشار دهید، سپس هر کدام را در کل دامنه حرکتی خود حرکت دهید.
idبه نام فایل پروفایل تبدیل میشود.bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader - 4قبل از ضبط هر چیزی، تلهاپراتوری کنید
آزمون پذیرش برای تمام موارد بالا. اگر تلهاپراتوری ناپایدار، آینهای یا یک مفصل از دستور پیروی نمیکند، ضبط آن را در 50 اپیزود حفظ میکند.
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader \ --display_data=true
پروفایلها به $HF_LEROBOT_CALIBRATION میروند، پیشفرض ~/.cache/huggingface/lerobot/calibration است، و شناسه کلید جستجو است. به lerobot-record یک شناسه کالیبرهشده بدهید و آن Enter را برای استفاده مجدد از پروفایل یا c را برای انجام مجدد آن پیشنهاد میدهد. اگر یک شناسه ناشناخته به آن بدهید، فایلی وجود ندارد، بنابراین در میانه جلسه وارد کالیبراسیون میشود.
دوربینها تعیین میکنند که سیاست چه چیزی را میبیند
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 و هر پرچم
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_id | empty | نام؛ مهر زمانی به صورت پیشفرض اضافه میشود |
| --dataset.single_task | empty | رشته وظیفه که با هر اپیزود ذخیره میشود |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | مسیر نوشتن، پیشفرض ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | نرخ حلقه کنترل و نرخ فریم مجموعه داده |
| --dataset.episode_time_s | 60 | ثانیه قبل از اینکه یک اپیزود به صورت خودکار پیش برود |
| --dataset.reset_time_s | 60 | بازنشانی صحنه؛ بازو حرکت میکند، چیزی ذخیره نمیشود |
| --dataset.num_episodes | 50 | اپیزودهای ضبط شده در این جلسه |
| --dataset.push_to_hub | true | بارگذاری در پایان جلسه؛ false به صورت محلی باقی میماند |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | رمزگذاری در حین ضبط؛ آن را به صراحت تنظیم کنید |
| --dataset.encoder_queue_maxsize | 30 | فریمهای بافر شده برای هر دوربین، حدود ۱ ثانیه با ۳۰ فریم بر ثانیه |
| --dataset.encoder_threads | null (codec decides) | رشتهها (threads) برای هر رمزگذار؛ در صورت لکنت ضبط، آن را کاهش دهید |
| --dataset.no_stamp | false | repo_id را دقیقاً همانطور که تایپ شده نگه دارید |
| --resume | false | به یک مجموعه داده موجود اضافه کنید؛ نیاز به --dataset.root دارد |
مجموعه داده شما آن چیزی که تایپ کردید نامیده نمیشود. lerobot یک برچسب تاریخ و زمان اضافه میکند، بنابراین so100_pick_cube به so100_pick_cube_20260823_141530 تبدیل میشود. برای یک نام پایدار از --dataset.no_stamp=true استفاده کنید. ادامه، اضافات را میشمارد، نه مجموع را. با --resume=true، --dataset.num_episodes اپیزودهای اضافی را میشمارد و --dataset.root اجباری میشود. اگر در یک مجموعه داده ۳۰ اپیزودی، ۵۰ اپیزود درخواست کنید، ۸۰ اپیزود خواهید داشت.
کنترل با صفحه کلید در طول یک جلسه
- فلش راست یا
n: پایان دادن به اپیزود یا بازنشانی فاز زودتر. این کلیدی است که بیشتر از آن استفاده میکنید، زیرا یک گرفتن تمیز به ندرت به ۲۵ ثانیه نیاز دارد. - فلش چپ یا
r: اپیزود را دور بیندازید و دوباره انجام دهید. یک برداشت بد اکنون هیچ هزینهای ندارد و بعداً هزینه زیادی خواهد داشت. - Escape یا
q: جلسه را متوقف کنید، رمزگذاری را به پایان برسانید، آپلود کنید. - اینها روی X11، Wayland و SSH بدون رابط گرافیکی کار میکنند: بدون بکاند کلید سراسری، lerobot-record همان کلیدها را از ترمینال کنترلکننده میخواند. حروف در لینکهای SSH کند، که در آن توالیهای فلش تقسیم میشوند، دوام میآورند.
- تلهاپریشن با صفحه کلید متفاوت است و به یک بکاند سراسری نیاز دارد: X11، Windows، یا macOS با Accessibility.
چند اپیزود، و یک اپیزود خوب چگونه به نظر میرسد
راهنمای ضبط حداقل ۵۰ اپیزود را برای اولین کار پیشنهاد میکند، حدود ۱۰ اپیزود برای هر مکان شیء. صفحات سیاستگذاری حداقل تعداد را برای هر مدل فهرست میکنند، که کمتر از آن اجرای مدل ارزش زمان GPU را ندارد.
| Policy | حداقل اپیزود | فرمت مجموعه داده | رده GPU | هزینه هر اجرا |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 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 ضربدر مدت زمان است. برای هر اپیزود، نه در مجموع.
from lerobot.datasets import LeRobotDataset
ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)
# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])
# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])سپس به آن نگاه کنید. lerobot-dataset-viz یک اپیزود را فریم به فریم با ردیابی مفاصل در کنار نماهای دوربین، در Rerun یا Foxglove پخش میکند. دوربینهای جابجا شده و فریمهای ثابت در ده ثانیه ظاهر میشوند. افراد این مرحله را نادیده میگیرند.
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0
# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0 \
--display-mode foxglove
# Drop the episodes that did not survive review
lerobot-edit-dataset \
--repo_id your-user/so100_pick_cube_20260823_141530 \
--new_repo_id your-user/so100_pick_cube_clean \
--operation.type delete_episodes \
--operation.episode_indices "[3, 17, 41]"
v2.1 یا v3.0: قبل از ضبط تصمیم بگیرید
v2.1 برای هر اپیزود یک فایل parquet و یک MP4 مینوشت. v3.0 چندین اپیزود را در شاردهای مشترک به هم متصل میکند و مرزها را از فراداده بازسازی میکند، بنابراین info.json الگوهای مسیر را به این شکل حمل میکند: data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet به جای شماره اپیزود. توجیه اصلی این است که فایلهای کمتر و بزرگتر: راهاندازی سریعتر و فشار کمتر بر سیستم فایل در مقیاس بزرگ.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| طرحبندی | یک فایل parquet و یک MP4 برای هر اپیزود | چندین اپیزود در هر شارد |
| فراداده اپیزود | فایلهای JSONL | parquet تکهتکه شده در meta/episodes/، از طریق پشته datasets |
| استریم از هاب | خیر | بله، از طریق StreamingLeRobotDataset |
| نوشته شده توسط lerobot 0.6.1 | خیر | بله، آنچه امروز دریافت میکنید |
| خوانده شده توسط GR00T N1.7 و N1.5 | بله | خیر، باید به نسخه پایینتر تبدیل شود |
lerobot 0.6.1 نسخه v3.0 را مینویسد، اما GR00T N1.7 و N1.5 نسخههای v2.0 یا v2.1 را میخوانند و روی آن کرش میکنند. به جهت حرکت توجه کنید: src/lerobot/scripts/ شامل convert_dataset_v21_to_v30.py است و هیچ چیزی در جهت مخالف وجود ندارد. این موضوع را قبل از جلسه حل کنید. راه حل: مجموعه داده به عنوان v3 رد شد.
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube
# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube \
--root=/path/to/dataset/directory \
--push-to-hub=falseدو مسیر برای رسیدن به یک مجموعه داده
همه موارد بالا، روی دستگاه خودتان: شما مالک شمارش USB، ساخت ffmpeg، تنظیم رمزگذار و فایلهای کالیبراسیون هستید. مسیر درست برای درک پایپلاین، اجرای یک تنظیمات دوربین غیرمعمول، یا نگه داشتن دادهها به صورت محلی.
زمان: یک عصر برای هر بازو برای مونتاژ، یک کالیبراسیون اولیه دشوار، و یک جلسه اول که آن را دور میاندازید زیرا دوربین در شکاف اشتباهی قرار داشت.
کلاینت دسکتاپ مجموعه دادهها، اپیزودها، جریانهای دوربین و وضعیتهای مفصل را با فرمت LeRobot، مستقیماً از یک جلسه عملیات از راه دور ضبط میکند. این مجموعه داده فرم آموزش را تغذیه میکند: مدل، مجموعه داده و هایپرپارامترها را انتخاب کنید، و بکاند یک GPU با اندازه VRAM مدل اجاره میکند، ترینر را اجرا میکند و نقاط بازرسی را در فضای ذخیرهسازی اشیاء مینویسد.
- 1کلاینت را نصب کنید
در صفحه دانلود؛ راهاندازی در مستندات کلاینت.
- 2ضبط از یک جلسه عملیات از راه دور
بازو را هدایت کنید؛ کلاینت اپیزودها را با فرمت LeRobot مینویسد. راهنما: اولین مجموعه داده خود را ضبط کنید.
- 3یا دادههای خود را بیاورید
یک مجموعه داده همچنین میتواند از یک شناسه مخزن Hugging Face یا دستگاه خودتان باشد: مستندات مجموعه داده، دایرکتوری عمومی.
- 4آموزش و اجرای مجدد
ترکیب را در ماتریس آموزش انتخاب کنید، سپس سیاست را دوباره روی بازو اجرا کنید. تقریباً ۱ تا ۳ دلار در رده ۲۴ گیگابایتی، ۴ تا ۱۲ دلار در رده A100 یا H100.
این ابزار بازوی شما را مونتاژ یا کالیبره نمیکند، و یک اپیزود معیوب را تعمیر نمیکند، بنابراین مرحله بازرسی همچنان اعمال میشود. همچنین یک محدودیت سخت در انتهای دیگر وجود دارد: برای کارهای سریع، استنتاج باید در کنار سرووها قرار گیرد. حلقه کنترل ۲۰ تا ۴۸۵ میلیثانیه در هر مرحله عملیاتی اجرا میشود، و رفت و برگشتهای اینترنتی عمومی روی آن، یک سیاست کاری را به یک سیاست مردد تبدیل میکند.
مجموعه دادههای 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 ارائه میدهد و هیچ چیز برعکس آن.
Sources
- LeRobot: یادگیری تقلیدی روی رباتهای دنیای واقعی
- LeRobot: مونتاژ SO-100، راهاندازی موتور و کالیبراسیون
- LeRobot: دوربینها و lerobot-find-cameras
- LeRobot: نصب و ماتریس افزونهها
- LeRobotDataset v3.0: طرحبندی و مهاجرت v2.1
- LeRobot: رمزگذاری ویدیوی جریانی و فریمهای از دست رفته
- LeRobot: انتقال مجموعه دادههای بزرگ به v3.0 (DROID)
- انتشار lerobot v0.6.1، 3 اوت 2026
- DatasetRecordConfig: پیشفرضهای واقعی ضبط
- lerobot_record.py: حلقه ضبط و مدیریت از سرگیری
- TheRobotStudio/SO-ARM100: مخزن ساخت و لیست قطعات
- Hugging Face: چکلیست مجموعه دادههای جامعه LeRobot
- lerobot/svla_so100_pickplace: 50 اپیزود، 19,631 فریم
- Lin et al. (2024), قوانین مقیاسبندی داده در یادگیری تقلیدی
- Mandlekar et al. (2021), آنچه در یادگیری از نمایشهای آفلاین انسانی اهمیت دارد
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started