صفحة AY-Robots التعليمية لتسجيل أول مجموعة بيانات LeRobot خاصة بك باستخدام ذراع SO-100
LeRobotSO-100تسجيل مجموعات البياناتالتشغيل عن بعدالتعلم بالمحاكاة

سجل أول مجموعة بيانات LeRobot خاصة بك باستخدام SO-100

AY-Robots ResearchAugust 23, 202616 دقيقة قراءة

سجل مجموعة بيانات 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 الخاص به.

الميزةنوع البياناتالشكلالوصف
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 ثانٍ، مع إزالة التروستم تجريد التروس من جميع محركات القائد الستة: مشفر فقط، احتكاك أقل
الطاقةمتطابقة مع إصدار STS3215 بجهد 7.4 فولت في قائمة الموادانظر التحذير أدناه
الكاميراتكاميرتان USB، بدقة 640x480 بمعدل 30 إطارًا في الثانيةواحدة لعرض المشهد، وواحدة على المعصم
المضيفPython 3.12 أو أحدث، ffmpegrequires-python >= 3.12
حساب HubHugging Face رمز كتابةoptional 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 فولت. تغذية محركات مؤازرة مصنفة بجهد 7.4 فولت بجهد 12 فولت يدمرها، لذا اقرأ ملصق المحرك قبل توصيل أي شيء. المحرك المؤازر لا يستجيب.

إذا لم يتم بناء الذراع بعد، فهذا يتطلب وقتًا منفصلاً: ابدأ من البدء باستخدام 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 يقوم بتثبيت تبعيات التعلم الآلي الأساسية فقط، ولا شيء يتصل بالروبوت. تحتاج أذرع Koch إلى dynamixel بدلاً من feetech. إذا لم يتعرف shell الخاص بك على lerobot-record من قبل، فهذا هو السبب.

المنافذ، معرفات المحركات والمعايرة

ثلاث خطوات تُنفذ لمرة واحدة تفصل بين الأجزاء وحلقة التشغيل عن بعد الفعالة. تجعل سياسة مدربة على ذراعك تعمل على ذراع شخص آخر، حيث تقوم بربط قراءات المشفر الخام باتفاقية مفصل مشتركة.

  1. 1
    ابحث عن منفذ USB لكل ذراع

    شغّله مع توصيل كلا الذراعين، افصل الذراع الذي تحدده عند المطالبة، ولاحظ أي منفذ يختفي. على نظام Linux قد تحتاج إلى sudo chmod 666 /dev/ttyACM0.

    bash
    lerobot-find-port
    # Finding all available ports for the MotorsBus.
    # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is '/dev/ttyACM1'
    # Reconnect the USB cable.
  2. 2
    اكتب معرفات المحركات ومعدلات الباود

    تُكتب المعرفات لمحرك واحد في كل مرة، والوثائق صارمة بشأن الكيفية: قم بتوصيل محرك واحد فقط بلوحة التحكم، وليس متسلسلاً بعد بأي محرك آخر. يتتبع السكريبت السلسلة للخلف، ويطلب القابض أولاً ويعطيه المعرف 6، ثم مفصل الرسغ (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 ذلك بنفسه: تأخذ فئة الكاميرا الخاصة به مسار جهاز بالإضافة إلى عدد صحيح، وتحذر من أن الفهارس غير مستقرة عبر عمليات إعادة التشغيل أو تغييرات المنافذ، خاصة على Linux. وجه index_or_path إلى الرابط الرمزي udev تحت /dev/v4l/by-id/، والذي يتبع الجهاز بدلاً من ترتيب التعداد. هذه هي الطريقة الأكثر شيوعًا التي ينتهي بها الأمر بمجموعة بيانات غير متناسقة داخليًا، ولا يمكن للتدريب إصلاح ذلك. الكاميرا غير مكتشفة.

أمر التسجيل وكل علامة

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الإطارات المخزنة مؤقتًا لكل كاميرا، حوالي 1 ثانية بمعدل 30 إطارًا في الثانية
--dataset.encoder_threadsnull (codec decides)الخيوط لكل مُرمّز؛ قللها إذا كان الالتقاط يتقطع
--dataset.no_stampfalseاحتفظ بـ repo_id تمامًا كما هو مكتوب
--resumefalseالإلحاق بمجموعة بيانات موجودة؛ يتطلب --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 لكل موقع كائن. صفحات السياسة تسرد حدًا أدنى لكل نموذج، والذي يقل عنه لا يستحق التشغيل وقت وحدة معالجة الرسوميات.

السياسةالحد الأدنى للحلقاتتنسيق مجموعة البياناتفئة وحدة معالجة الرسومياتالتكلفة لكل تشغيل
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 (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 تلميحًا يوصي بذلك كلما بدأ التشغيل مع إيقاف العلامة.

تحقق من مجموعة البيانات قبل استئجار وحدة معالجة رسوميات

اختبار القبول من الوثائق: قارن مدة الفيديو بمدة الحلقة التي أبلغ عنها سطر الأوامر، وتأكد من أن عدد الصفوف يساوي عدد الإطارات في الثانية مضروبًا في المدة. لكل حلقة، وليس على الإجمالي.

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 واحد لكل حلقةالعديد من الحلقات لكل جزء
البيانات الوصفية للحلقةملفات JSONLملفات parquet مجزأة تحت meta/episodes/، عبر مكدس مجموعات البيانات
البث من Hubلانعم، عبر 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 جيجابايت.

طريقتان لنفس مجموعة البيانات

كل ما سبق، على جهازك الخاص: أنت تمتلك تعداد 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 والأنظمة بدون واجهة رسومية.

هل يمكنني التسجيل على 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 ولا شيء في الاتجاه المعاكس.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started