
سجل مجموعة بيانات LeRobot قابلة للاستخدام باستخدام SO-100: المعايرة، التشغيل عن بعد بنمط القائد والتابع، علامات lerobot-record الافتراضية والحقيقية، إعداد الكاميرا، عدد الحلقات، والعيوب التي تفسد التشغيل.
يمكن لـSO-100 تابع، وذراع قائد بنفس التصميم، وكاميرتين USB ضبط سياسة بدقة في فترة ما بعد الظهر. يمكن لنفس المنصة أن تنتج بسهولة ستين حلقة تبدو سليمة في متصفح الملفات وتهدر تشغيل GPU لمدة ست ساعات. نادرًا ما يكون الفرق في النموذج؛ بل هو ما حدث بين المحركات المؤازرة وملف الباركيه.
هنا المسار اليدوي، ثم المسار الأقصر. كل أمر هو من 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 إطارًا في الثانية، 60 ثانية لكل حلقة، 60 ثانية لإعادة الضبط، 50 حلقة، حوالي 100 دقيقة من الوقت الفعلي.
- •الحد الأدنى للحلقات هنا: 30 لـ SmolVLA، و 50 للبقية.
- •التنوع يتفوق على الكمية. تموت مجموعات البيانات لأربعة أسباب: تبديل مؤشرات الكاميرا، أو الإطارات المتساقطة أو المجمدة، أو مفصل متوقف عند حده، أو سلسلة مهام غير قابلة للقراءة.
ما تلتقطه جلسة التسجيل
مجموعة بيانات LeRobot dataset ليست مجلدًا لمقاطع الفيديو، بل هي جدول مفهرس زمنيًا مع فيديو مرفق: كل نبضة حلقة تحكم تكتب صفًا واحدًا يحتوي على الإجراء المطلوب، والحالة التي وصل إليها التابع، وإطار واحد لكل كاميرا، وطابع زمني ومؤشرات. ترى السياسة هذه الأعمدة فقط. مخطط 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 ثانٍ، مع إزالة التروس | تم تجريد التروس من جميع محركات القائد الستة: مشفر فقط، احتكاك أقل |
| الطاقة | متطابقة مع إصدار STS3215 بجهد 7.4 فولت في قائمة المواد | انظر التحذير أدناه |
| الكاميرات | كاميرتان USB، بدقة 640x480 بمعدل 30 إطارًا في الثانية | واحدة لعرض المشهد، وواحدة على المعصم |
| المضيف | Python 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 فولت. تغذية محركات مؤازرة مصنفة بجهد 7.4 فولت بجهد 12 فولت يدمرها، لذا اقرأ ملصق المحرك قبل توصيل أي شيء. المحرك المؤازر لا يستجيب.
إذا لم يتم بناء الذراع بعد، فهذا يتطلب وقتًا منفصلاً: ابدأ من البدء باستخدام SO-100 والدليل الكامل لإعداد SO-100. إذا لم تكن قد اشتريت أي شيء بعد، فاقرأ مقارنة SO-100 بـ SO-101 أولاً: 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 يقوم بتثبيت تبعيات التعلم الآلي الأساسية فقط، ولا شيء يتصل بالروبوت. تحتاج أذرع Koch إلى dynamixel بدلاً من feetech. إذا لم يتعرف shell الخاص بك على lerobot-record من قبل، فهذا هو السبب.
المنافذ، معرفات المحركات والمعايرة
ثلاث خطوات تُنفذ لمرة واحدة تفصل بين الأجزاء وحلقة التشغيل عن بعد الفعالة. تجعل سياسة مدربة على ذراعك تعمل على ذراع شخص آخر، حيث تقوم بربط قراءات المشفر الخام باتفاقية مفصل مشتركة.
- 1ابحث عن منفذ USB لكل ذراع
شغّله مع توصيل كلا الذراعين، افصل الذراع الذي تحدده عند المطالبة، ولاحظ أي منفذ يختفي. على نظام Linux قد تحتاج إلى
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 ذلك بنفسه: تأخذ فئة الكاميرا الخاصة به مسار جهاز بالإضافة إلى عدد صحيح، وتحذر من أن الفهارس غير مستقرة عبر عمليات إعادة التشغيل أو تغييرات المنافذ، خاصة على Linux. وجه index_or_path إلى الرابط الرمزي udev تحت /dev/v4l/by-id/، والذي يتبع الجهاز بدلاً من ترتيب التعداد. هذه هي الطريقة الأكثر شيوعًا التي ينتهي بها الأمر بمجموعة بيانات غير متناسقة داخليًا، ولا يمكن للتدريب إصلاح ذلك. الكاميرا غير مكتشفة.
أمر التسجيل وكل علامة
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 | 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 | الإطارات المخزنة مؤقتًا لكل كاميرا، حوالي 1 ثانية بمعدل 30 إطارًا في الثانية |
| --dataset.encoder_threads | null (codec decides) | الخيوط لكل مُرمّز؛ قللها إذا كان الالتقاط يتقطع |
| --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 إلزاميًا. اطلب 50 حلقة على مجموعة بيانات تحتوي على 30 حلقة وستحصل على 80.
التحكم بلوحة المفاتيح أثناء الجلسة
- السهم الأيمن أو
n: إنهاء الحلقة أو إعادة ضبط المرحلة مبكرًا. هذا هو المفتاح الذي تستخدمه غالبًا، لأن الإمساك النظيف نادرًا ما يحتاج إلى 25 ثانية. - السهم الأيسر أو
r: تجاهل الحلقة وإعادة تنفيذها. اللقطة السيئة لا تكلف شيئًا الآن والكثير لاحقًا. - Escape أو
q: إيقاف الجلسة، إنهاء الترميز، الرفع. - هذه تعمل على X11 و Wayland و SSH بدون واجهة رسومية: بدون واجهة خلفية للمفاتيح العامة، يقرأ lerobot-record نفس المفاتيح من الطرفية المتحكمة. الحروف تبقى صالحة عبر روابط SSH البطيئة، حيث تنقسم تسلسلات الأسهم.
- التحكم عن بعد بلوحة المفاتيح مختلف ويحتاج إلى واجهة خلفية عامة: X11، Windows، أو macOS مع إمكانية الوصول.
كم عدد الحلقات، وكيف تبدو الحلقة الجيدة
يوصي دليل التسجيل بما لا يقل عن 50 حلقة للمهمة الأولى، حوالي 10 لكل موقع كائن. صفحات السياسة تسرد حدًا أدنى لكل نموذج، والذي يقل عنه لا يستحق التشغيل وقت وحدة معالجة الرسوميات.
| السياسة | الحد الأدنى للحلقات | تنسيق مجموعة البيانات | فئة وحدة معالجة الرسوميات | التكلفة لكل تشغيل |
|---|---|---|---|---|
| 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 (Lin et al., 2024) جمعت أكثر من 40,000 عرض توضيحي وأجرت أكثر من 15,000 عملية تنفيذ في العالم الحقيقي. تبع التعميم علاقة تقريبية بقانون القوة مع عدد البيئات والكائنات، وبعد تجاوز عتبة معينة لكل بيئة أو كائن، كان للعروض التوضيحية الإضافية تأثير ضئيل. على مقعد واحد: حرك الكائن، غير الإضاءة، استبدل المكعب، بدلاً من تكرار لقطة واحدة.
- مسارات مفصلية مستمرة يمكن للمحرك المؤازر إعادة إنتاجها، على عكس لوحة المفاتيح أو لوحة الألعاب
- تتشارك الحركة والحالة في اتفاقية إحداثيات، لذا تتعلم السياسة هدفًا يمكنها التحكم فيه مباشرة
- حلقة مدتها 25 ثانية بالإضافة إلى إعادة ضبط لمدة 10 ثوانٍ تعادل تقريبًا 100 حلقة في الساعة
- يشعر المشغل بتوقف أو تعثر التابع، لذا تظهر الأخطاء قبل إدخال البيانات
- ذراع ثانية تضاعف تقريبًا تكلفة الأجزاء
- العروض التوضيحية ترث عادات المشغل؛ وجد ماندليكار وآخرون أن جودة السياسة تعتمد بشكل كبير على جودة العرض التوضيحي
- يتم أخذ عينات من القائد بمعدل الحلقة، لذا تصبح فترات التوقف صفوفًا متطابقة تقريبًا تعلم السياسة الانتظار
- لا شيء يفرض الاتساق بين الجلسات: كاميرا تحركت 5 سم هي تحول خفي في التوزيع
الحلقة الجيدة مملة: وضع البداية قابل للتكرار، شيء واحد تم إنجازه، انتهت بمجرد وضع الكائن في الصندوق، سلسلة المهام ضمن 25 إلى 50 حرفًا التي توصي بها قائمة التحقق. التقط المكعب الأحمر وأسقطه في الصندوق هي سلسلة مهام؛ task1 هو النمط المضاد الذي تسميه قائمة التحقق صراحةً. تتصدر التعليقات التوضيحية الغامضة قائمة المشاكل، وهي الأكثر أهمية لـ ، حيث تكون السلسلة مدخلًا للنموذج، وليست اسم ملف.
عيوب تدمر مجموعة البيانات بصمت
لا شيء يرمي استثناءً. كلها تبقى حتى التدريب، وتظهر كمنحنى خسارة يبدو جيدًا وروبوت لا يفعل شيئًا. تحقق بينما المشهد معد.
| الخلل | كيف يبدو | من أين يأتي | كيفية اكتشافه |
|---|---|---|---|
| تبديل عرض الكاميرا | صورة المعصم تحت المفتاح العلوي | إعادة تعيين الفهرس بعد إعادة التوصيل | lerobot-find-cameras في كل جلسة؛ مسارات by-id |
| إطارات متجمدة | نفس الصورة لعشرات الصفوف | تتوقف الكاميرا عن التسليم؛ تتكرر الحلقة الإطار الأخير | قم بتدقيقها في lerobot-dataset-viz |
| إطارات مفقودة | عدد الصفوف أقل من معدل الإطارات في الثانية مضروبًا في الثواني | تفيض قائمة الانتظار، وتسقط بدلاً من أن تحظر | 'Encoder queue full' في السجل؛ الصفوف مقابل معدل الإطارات في الثانية مضروبًا في المدة |
| مفصل عند حده | مفصل واحد ثابت عند الحد الأدنى أو الأقصى | يتجاوز نطاق القائد نطاق التابع، أو وضع وسطي سيء | الحد الأدنى/الأقصى لكل مفصل في ds.meta.stats؛ lerobot-find-joint-limits مسبقًا |
| الصورة والإجراء غير متزامنين | السياسة تتوقع أو تتأخر | الكاميرات بمعدل إطارات مختلف عن الحلقة | حافظ على كل كاميرا عند --dataset.fps |
| وقت ميت | فترات طويلة من صفوف الإجراءات المتطابقة | المشغل توقف مؤقتًا مع تشغيل المسجل | نسبة صفوف الإجراءات المتطابقة المتتالية |
| سلسلة مهام غير قابلة للاستخدام | task1, demo2, test | الكتابة بسرعة | meta/tasks.parquet في v3.0 (كانت meta/tasks.jsonl في v2.1)؛ إصلاح باستخدام 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 تلميحًا يوصي بذلك كلما بدأ التشغيل مع إيقاف العلامة.
تحقق من مجموعة البيانات قبل استئجار وحدة معالجة رسوميات
اختبار القبول من الوثائق: قارن مدة الفيديو بمدة الحلقة التي أبلغ عنها سطر الأوامر، وتأكد من أن عدد الصفوف يساوي عدد الإطارات في الثانية مضروبًا في المدة. لكل حلقة، وليس على الإجمالي.
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/، عبر مكدس مجموعات البيانات |
| البث من Hub | لا | نعم، عبر 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، وحلقات، وتدفقات الكاميرا، وحالات المفاصل، مباشرة من جلسة التحكم عن بعد. تغذي مجموعة البيانات هذه نموذج التدريب: اختر النموذج، ومجموعة البيانات، والمعاملات الفائقة، ويقوم الواجهة الخلفية بتأجير وحدة معالجة رسومات بحجم VRAM للنموذج، وتشغل المدرب وتكتب نقاط الفحص إلى تخزين الكائنات.
- 1تثبيت العميل
على صفحة التنزيل؛ الإعداد في وثائق العميل.
- 2التسجيل من جلسة تحكم عن بعد
قم بقيادة الذراع؛ يكتب العميل الحلقات بتنسيق LeRobot. دليل تفصيلي: سجل أول مجموعة بيانات لك.
- 3أو أحضر بياناتك الخاصة
يمكن أن تأتي مجموعة البيانات أيضًا من معرف مستودع Hugging Face أو جهازك الخاص: وثائق مجموعة البيانات، الدليل العام.
- 4تدريبها وتشغيلها مرة أخرى
اختر التوليفة على مصفوفة التدريب، ثم قم بتشغيل السياسة مرة أخرى على الذراع. حوالي 1 إلى 3 دولارات أمريكية على الفئة 24 جيجابايت، و 4 إلى 12 دولارًا على فئة A100 أو H100.
لا يقوم بتجميع أو معايرة ذراعك، ولا يقوم بإصلاح حلقة معيبة، لذا لا تزال خطوة الفحص سارية. هناك أيضًا حد صارم في الطرف الآخر: للمهام السريعة، يجب أن يكون الاستدلال بجانب المحركات المؤازرة. تعمل حلقة التحكم من 20 إلى 485 مللي ثانية لكل خطوة عمل، والرحلات ذهابًا وإيابًا عبر الإنترنت العام تحول السياسة العاملة إلى سياسة مترددة.
سجل مجموعات بيانات 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 والأنظمة بدون واجهة رسومية.
هل يمكنني التسجيل على Raspberry Pi أو جهاز كمبيوتر صغير؟▾
نعم، مع الضبط. يحتوي دليل الترميز بالبث المباشر على فئة موارد منخفضة تغطي أجهزة 4 أنوية حديثة و Raspberry Pi 5، ويضع كاميرتين بدقة 640x480 و 30 إطارًا في الثانية في عمود "يتطلب بعض الضبط". نصيحته: أوقف المنافسة بين المرمز وحلقة الالتقاط، عبر --dataset.rgb_encoder.vcodec=h264 و --dataset.streaming_encoding=false. يقدر كاميرتين بدقة 640x480 بحوالي 55 مليون بكسل في الثانية وكاميرتين بدقة 1920x1080 بحوالي 373 مليون.
كيف أعرف أن مجموعة البيانات التي سجلتها للتو سليمة بالفعل؟▾
ثلاثة فحوصات بسيطة. قارن مدة الفيديو لكل حلقة بالمدة التي أبلغ عنها CLI وتأكد من أن عدد الصفوف يساوي عدد الإطارات في الثانية مضروبًا في تلك المدة، لكل حلقة بدلاً من الإجمالي؛ هذا هو اختبار القبول الذي يقدمه دليل ترميز 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