LeRobot documentation

الاستدلال عن بُعد

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

الاستدلال عن بُعد

تتطلب السياسات الكبيرة وحدة معالجة رسومية (GPU)، ومع النشر المتزامن يتوقف الروبوت عن الحركة في كل مرة تحسب فيها السياسة شريحة أفعالها التالية. يقسم الاستدلال عن بُعد المهمة إلى جزأين: يعمل خادم السياسة على نقطة التفتيش (checkpoint) على وحدة معالجة رسومية، بينما يحتفظ حاسوب الروبوت بالتحكم في الكاميرات والمحركات والتشغيل عن بُعد والتسجيل. يستمر الروبوت في تنفيذ الأفعال التي لديه بالفعل بينما يحسب الخادم الأفعال التالية، فلا تتوقف الحركة بعد الآن من أجل الاستدلال.

استخدمه عندما:

  • الحاسوب المتصل بالروبوت لا يحتوي على وحدة معالجة رسومية، أو تحتوي على وحدة معالجة رسومية صغيرة جدًا لتنفيذ السياسة: حاسوب محمول أو حاسوب لوحية واحدة بجانب الذراع، ومحطة عمل مجهزة بوحدة معالجة رسومية في الجهة المقابلة من المختبر؛
  • يستغرق الاستدلال جزءًا ملحوظًا من كل مجموعة إجراءات، وتريد حركة مستمرة؛
  • تريد أن تقرر مدى تكرار إعادة تخطيط الروبوت دون لمس نقطة الحفظ.

المفاضلة الوحيدة التي تضبطها هي الطراوة مقابل الاستمرارية. طلب خطة جديدة في وقت أبكر يتيح للروبوت الاستجابة لما يراه، بينما الالتزام بمزيد من الخطة الحالية يحافظ على تقدم المهمة.

كيف يعمل

يحافظ حاسوب الروبوت على مخزن مؤقت للإجراءات القادمة. عندما ينخفض مستوى المخزن، يرسل ملاحظة جديدة، ويستمر في الحركة من المخزن المؤقت بينما يقوم الخادم بالحساب، ثم يدمج الجزء الجديد في الجزء من الخطة الذي لم يُنفَّذ بعد.

تحدد ثلاثة إعدادات للعميل هذا السلوك. يحدد refill_seconds مدى استباقية طلب الخطة التالية، ويحدد chunk_merge كيفية دمج الخطة الجديدة في الخطة القديمة، بينما يعمل المزج على تنعيم الحد الفاصل بينهما. لا يحتاج الخادم سوى إلى نقطة التفتيش ووصف للروبوت الذي تم تدريبه عليه. تبدأ الأقسام أدناه من إعداد عامل، ثم تبني الفهم الحدسي لكل إعداد.

RTC المحلي (--inference.type=rtc) هو الخيار غير المتزامن الآخر: يتم تنفيذ الاستدلال في خيط خلفية من عملية التمرير، على نفس الجهاز، دون خادم. أما الاستدلال عن بُعد على نفس المضيف فيستخدم ما يزال عمليتين و--inference.type=remote، ويقدم المحاذاة والدمج للسياسات التي لا تدعم RTC. راجع كيف يرتبط RTC بالاستدلال عن بُعد.

السياسات والروبوتات المدعومة

يمكن تقديم نقطة تفتيش عندما تتنبأ المعالجات المحفوظة بها بقطعة إجراء من ملاحظة حالية واحدة؛ ويتطلب ACT تعطيل الدمج الزمني. وقد شغّلت نقاط التفتيش الخاصة بـ ACT وSmolVLA وXVLA وEVO1 وLaWAM روبوتات حقيقية عبر هذا المسار. كما تُدعم عدة سياسات أخرى على مستوى العقد، لكنها لم تُتحقق من صحتها على الأجهزة، وتحتاج السياسات المعتمدة على التاريخ إلى تكامل إضافي. ويحدد جدول دعم السياسات حالة كل سياسة وقيودها.

يجب على سائق الروبوت أن يُعلن عن دعمه لخاصية تثبيت الموضع، لأن العميل يُحدّث الهدف المطبَّق الأخير أثناء انتظاره للأفعال. لذلك، تُعلن متابعات SO وOMX وKoch وHopeJr وRebot وYAM عن ذلك؛ وتعتمد أغلفة OpenArm وReachy2 والأغلفة ثنائية الذراع على إعداداتها؛ بينما يُعلن Unitree G1 عن ذلك فقط مع متحكم SONIC، حيث يكون الهدف المحفوظ هو رمز الحركة الأخير؛ ولا تفعل ذلك القواعد المتنقلة. راجع جدول الأجهزة. تُرفض عقود الروبوت أو السياسات غير المدعومة عند القبول، قبل أي حركة.

ابدأ من عملية نشر (rollout) تعمل

احتفظ بأمر lerobot-rollout متزامن ناجح كمرجع، وأبقِ على إعدادات الروبوت والكاميرات والمهمة ومعدل الإطارات (FPS) ومشغّل البث عن بُعد (teleoperator) والاستيفاء (interpolation). تنتقل نقطة التفتيش (checkpoint) وجهاز النموذج إلى الخادم؛ ولا يقوم العميل عن بُعد بتحميل الأوزان.

تصف الأمثلة أدناه SO-101 عامًا بستة محركات مع كاميرا أمامية واحدة. عدّل نقطة التفتيش، وعروض الكاميرا، وترتيب المكونات، والوحدات معًا.

1. ثبّت على كلا الحاسوبين

تحتاج كلتا الجهتين إلى الإضافة remote. احتفظ بإضافات الأجهزة على العميل وإضافة السياسة المختارة على الخادم:

uv sync --locked --extra remote --extra core_scripts --extra feetech
# Add the policy extra on the server when required, for example --extra pi.

النطاق المدعوم من Zenoh هو >=1.9.0,<1.11.0؛ حيث يقوم uv sync --locked بتثبيت الإصدار المحدد في ملف القفل، وهو حالياً 1.10.1.

2. تكوين الخادم وبدئه

انسخ التكوين العام، ثم عدّله:

cp examples/remote_inference/server.yaml server.yaml

اضبط model.repo_or_path وmodel.device. بالنسبة إلى نقطة تحقق من Hub، ثبّت model.revision على الالتزام الذي تنوي التحقق منه. طابق features وaction_feature وsemantics وrobot_type وexecution.action_fps مع إعدادك التشغيلي؛ راجع أمثلة المخطط وإعادة تسمية الكاميرات أدناه.

uv run --no-sync lerobot-policy-server --config_path=server.yaml

تحمّل الخادم نقطة التفتيش، وتحقّق من إعلاناتها، ثم يشغّل عملية الإحماء، وبعد ذلك يسجّل Policy server ready: deployment=<name> instance=<id>; awaiting one client. تقبل كل حقل في ملف YAML تجاوزًا مضمّنًا عبر سطر الأوامر:

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --model.device=cuda \
  --execution.idle_timeout_s=10

3. ابدأ عميل الروبوت

في طرفية أخرى، اضبط معاملات العتاد على نفس التهيئة:

uv run --no-sync lerobot-rollout \
  --inference.type=remote \
  --inference.endpoint=tcp/127.0.0.1:7447 \
  --inference.deployment=manipulation \
  --inference.mode=chunk \
  --inference.chunk_merge=aligned \
  --inference.semantics=so101-degrees-gripper-percent-v1 \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.use_degrees=true \
  --robot.cameras='{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}' \
  --fps=30 \
  --task="pick up the cube" \
  --interactive=true

بعد القبول، اكتب /start. يُنهي الأمر /stop التشغيل؛ راجع ما يفعله الروبوت أثناء الانتظار أو التوقف. احتفظ بخيارات التشغيل عن بُعد والتسجيل من عملية النشر التي تعمل بها. لا تمرّر --policy.path أو تجاوزات الجهاز المحلي للنموذج أو أعلام التجميع إلى العميل البعيد.

deployment يختار الخادم، وsemantics يحدد وحدات الإجراء المعتمدة وترتيبها؛ ويجب أن يتطابق كلاهما مع إعدادات الخادم. يستخدم المثال درجات مفصل الجسم ونطاقًا مُعايرًا للقبضة يتراوح بين 0 و100.

Use a trusted LAN instead of localhost

اربط الخادم بواجهة الشبكة المحلية (LAN) الخاصة به، مع استبدال العنوان الموضح في المثال بعنوان IP الفعلي:

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --zenoh.listen_endpoints='[tcp/172.18.133.214:7447]'

على العميل، استخدم العنوان نفسه: --inference.endpoint=tcp/172.18.133.214:7447. يجب أن تكون كلتا العُقدتين قادرتين على الوصول إلى تلك النقطة النهائية.

يحدّ ربط واجهة محددة من نطاق التعرّض، لكنه لا يوثّق الأطراف المتصلة. استخدم اتصالات الموجّه الموثّقة خارج شبكة المختبر الموثوقة.

اختر كيفية مواصلة الحركة

بحلول الوقت الذي يصل فيه مقطع جديد، تكون الملاحظة التي حُسب منها قديمة بعض الشيء، وقد تحرّك الروبوت بالفعل. يحدد وضع الدمج ما يجب فعله حيال ذلك: تشغيل المقطع الجديد بعد القديم، أو حذف الخطوات التي تجاوزها الروبوت بالفعل، أو تنعيم نقطة الالتقاء.

الاختيارإعدادات العميلنقطة بداية مفيدة
إضافةmode=chunk, chunk_merge=appendالحفاظ على الشريحة الكاملة للتنفيذ المقبول؛ مفيد كخط أساس، لكن يمكن أن تبدأ الشريحة التالية من ملاحظة أقدم.
المواءمةmode=chunk، chunk_merge=aligned (الافتراضي auto)إزالة الخطوات الواردة التي تم تجاوزها مسبقًا واستبدال المستقبل فقط، مما يقلل من الارتدادات الخلفية بين المقاطع المستقلة.
المواءمة + الدمجالمواءمة بالإضافة إلى blend_steps > 0 ومكونات صريحةتداخل سلس بين الأهداف القديمة والجديدة بعد أن تعمل وتيرة التنفيذ وتقدم المهام بشكل صحيح.
RTCmode=rtc_guided أو rtc_trainedاستخدمه عندما يدعم نقطة الحفظ (checkpoint) تقنية RTC: حيث تعتمد عملية الاستدلال (inference) نفسها على المسار المتبقي.

تستخدم الإعدادات في هذه الجدول بادئة --inference.. تُضبط المقاطع العادية افتراضيًا على المحاذاة مع تعطيل الدمج. الهدف الذي يخضع بالفعل للاستيفاء يُثبَّت ولا يمكن استبداله.

تتجاهل المحاذاة الخطوات الواردة التي تم التأكيد عليها مسبقًا. يقوم المزج بمتوسط الأهداف المستقبلية المتداخلة. تضيف الاستيفاء أوامر حركة وسيطة بين النقاط النهائية. يغيّر RTC طريقة توليد التنبؤ. لا يضمن أيٌّ منها حركة سلسة أو قبضة ناجحة.

Add a short blend to the example

يتم تكوين الدمج بالكامل على جانب العميل؛ فلا يحتاج الخادم إلى أي إعدادات للدمج أو إعادة تشغيل. اختر إحداثيات الذراع المستمرة من أسماء الإجراءات الخاصة بالنشر:

--inference.chunk_merge=aligned \
--inference.blend_steps=5 \
--inference.blend_weight=0.5 \
--inference.blend_components='[shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos]'

هذه إعدادات للمقارنة، وليست توصية مُعدّلة. استبعد الماسك وغيرها من عناصر التحكم المنفصلة أو الحساسة للتلامس ما لم يتم التحقق منها. تستخدم المكونات غير المحددة الهدف الوارد.

تُحسب عملية الدمج كالتالي: q_t + b_w * (i_t - q_t): حيث يمثل q_t الهدف المُدرج في قائمة الانتظار، وi_t الهدف الوارد لنفس الخانة المستقبلية، وb_w النسبة الواردة (blend_weight). تمنح القيمة 1 استبدالًا كاملًا. يحدد التداخل الفعلي نافذة الدمج؛ فلا يمكن لخطوات مهيأة بعدد عشرة أن تُنشئ عشر خطوات متداخلة. قد يؤدي الاستبدال المتكرر إلى دمج هدف غير مُثبَّت أكثر من مرة، مما يحافظ على التأثير الأقدم وعمره الأصلي. لا تُحدِّث عملية الدمج أبدًا البيانات المنتهية الصلاحية.

Serve guided RTC on a compatible checkpoint

احتفظ بالمخطط المُتحقَّق منه وقم بإعداد الخادم:

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --execution.supported_modes='[rtc_guided]' \
  --execution.rtc.enabled=true \
  --execution.rtc.mode=guided \
  --execution.rtc.execution_horizon=15

على العميل، اضبط --inference.mode=rtc_guided. يستخدم RTC آلية خاصة به للتعامل مع الاستمرارية، وليس محاذاة أو مزج المقاطع العادية. أعد قياس زمن الاستجابة، لأن التوجيه يضيف عملاً إضافياً. أفق الخطوات الخمس عشرة مثال توضيحي وليس قيمة مُعدّلة.

يتطلب تدريب RTC نقطة تفتيش مُدرَّبة لتكييف بادئة الإجراء وإعدادات تأخير/أفق متوافقة؛ راجع إعداد RTC. يؤدي طلب وضع غير مدعوم إلى فشل العملية قبل الحركة.

المعاملات ذات الأهمية

تستخدم خيارات العميل أدناه البادئة --inference. ما لم يُذكر خلاف ذلك. القيم الافتراضية هي قيم بداية وليست ضمانات لروبوت معين.

معاملافتراضي / وحدةالتأثير والتنازل
refill_seconds0.5 ثانية من وقت التشغيل المتبقيتطلب القيم الأعلى عادةً طلباتٍ مبكرةً؛ بينما تسمح القيم الأدنى بتنفيذ المزيد من الخطة. يمكن لحدٍّ أدنى مُقاسٍ للزمن المستغرق أن يتجاوز ذلك.
blend_steps0 خطوات السياسةتُعطّل القيمة صفر عملية الدمج. كلما كانت النوافذ أكبر، زاد مزج الأهداف المستقبلية المتداخلة.
blend_weight0.5 نسبة الدخليحافظ الإعداد المنخفض على المزيد من الهدف القديم: تغييرات قد تكون ألطف، لكن تصحيحًا أبطأ.
blend_components[]مجموعة فرعية صريحة من الإحداثيات المسموح بها على الخادم؛ مطلوبة عند تمكين الدمج.
max_observation_age_s5.0 ثانيةأقصى عمر للمصدر الأصلي عبر التنفيذ، بما في ذلك المساهمون الأقدمون في الدمج. يجب أن يغطي الاستدلال والتشغيل.
action_starvation_grace_s1.0 ثانيةانتظار محدود بعد نفاد التشغيل؛ 0 يُسبب عطلاً فورياً. لا يتجاوز المواعيد النهائية الأخرى.
--fpsمطابقة action_fps لخادمتكرار إجراء السياسة. بالنسبة إلى N إجراءات، يكون التشغيل الاسمي N / fps ثانية.
--interpolation_multiplier1أوامر حركية وسيطة أكثر؛ لا يمدد التشغيل ولا يضيف قرارات سياسة.

التعبئة الفعالة هي max(refill_seconds, recent maximum turnaround + 1 / fps). يشمل زمن الدورة الترميز والشبكة والتصفية والاستدلال وفك الترميز. يوفر الطلب المقبول الأول تقديرًا مبدئيًا؛ بينما تستخدم التقديرات اللاحقة ما يصل إلى 100 عينة من حالة الاستقرار.

لذلك، لا يُمثّل Refill فترة طلب ثابتة ولا عددًا مضمونًا من الإجراءات المنفذة. افحص قيمة Refill المُعدّة والفعّالة في السجلات. يؤدي تحديد حدّ يغطي أفق التنفيذ بأكمله إلى استبدال متكرر للغاية.

Operation deadlines and server ownership

جميع القيم بالثواني.

معامل العميلافتراضيالحدود
handshake_timeout_s10الاكتشاف/القبول؛ الميزانية الأساسية لتبادلات التحكم
startup_timeout_s10إجراء جديد يبدأ بعد الإقرار بإعادة الضبط/الإبطال
action_timeout_s5طلب إجراء واحد معلق
language_timeout_s60طلب نص واحد

يحتوي الخادم أيضًا على execution.action_deadline_s=5 وlanguage.deadline_s=60. تُطبَّق حدود العميل والخادم معًا؛ فالتغيير في أحدهما لا يُرخي الحد الآخر. كما تتيح عمليات تبادل التحكم في إعادة الضبط/الإبطال ميزانية عمل الخادم المُعلَن، لأنها يجب أن تنتظر خلف استدعاء نموذج قيد التشغيل.

يتحكم خادم execution.idle_timeout_s=10 في التنظيف بعد غياب العميل المُلاحظ، وليس في مهلة انعدام الإجراءات. ينتظر التنظيف خلف عمل النموذج الجاري؛ ولا يمكن الاستيلاء على مكالمة متعثرة. يحتفظ العميل المتصل والموقوف بجلسته.

ما يفعله الروبوت أثناء الانتظار أو التوقف

أثناء انتظار مدعوم، يقوم العميل بتحديث آخر هدف تم تطبيقه فعليًا بواسطة المُشغِّل، بما في ذلك الاستيفاء والقص والمقبض. قبل الأمر الأول، تُهيّئ وضعية مقاسة هذا الهدف. يؤدي ذلك إلى إيقاف تقدّم المسار؛ وقد يستمر الروبوت في الاستقرار نحو ذلك الهدف. لا يُطفئ هذا الوضع عزم الدوران ولا يضمن عدم الحركة. يستخدم RTC المحلي نفس الانتظار المحدود على الروبوتات المدعومة، ويُسجِّل عطلًا فوريًا عند استنفاد المهلة على غيرها.

الوضعالسلوك المتوقع
الاستدلال الأوليانتظر محليًا حتى تصل الإجراءات القابلة للاستخدام، ضمن المهلة الزمنية للإقلاع.
تنتهي إجراءات التشغيلأنهِ الاستيفاء المُلتزَم به، ثم احتفظ بالهدف حتى انتهاء مهلة السماح للجوع. استأنف فقط من ملاحظة وتنبؤ جديدين.
/vqa أو استعلام التوجيه التلقائيإيقاف مؤقت قبل توليد النص؛ استئناف من إجراءات جديدة بعد ذلك إذا بقي التشغيل نشطًا. تنطبق حدود اللغة.
تغيير التعليمات أثناء الاستدلالتخلَّ عن التنبؤ القديم، وأوقف العملية، واحصل على إجراءات جديدة للتعليمات الجديدة. قد تحافظ التغييرات بين الطلبات على الحركة المقبولة.
تسجيل حفظ أو إيقاف المشغلاحتفظ بالهدف، أو سلّم التحكم إلى التشغيل عن بُعد. تستأنف أعمال التسجيل المحجوز مع استدلال جديد عند الحاجة.
المهلة النهائية، إجراء قديم، رد غير صحيح الصيغة أو انتهاء مهلة السماح للجوععطل في الطرفية: إلغاء حركة السياسة والالتزام بإيقاف التشغيل المُعدّ.
/stop أو Ctrl+C العاديإنهاء حركة السياسة والالتزام بسلوك الإرجاع/القطع المُهيّأ.

تُفرّغ استعادة الجوع تنبؤًا قديمًا قيد التنفيذ وتُحصّل تنبؤًا جديدًا من لقطة أُخذت بعد بدء الانتظار. لا يمكن للنتائج القديمة إعادة بدء الحركة. لا تُجدِّد الحزم والنتائج غير القابلة للاستخدام فترة السماح. تشير الانتظارات المتكررة إلى عدم كفاية تغطية التشغيل أو الكمون.

لا يتم استعادة فقدان الخادم أو الاتصال تلقائيًا. قد تُستنفد الإجراءات المخزّنة مؤقتًا الصالحة، يليها الانتظار حتى انتهاء مهلة السماح أو مهلة أخرى. بمجرد ملاحظة فقدان حضور الخادم، لا يمكن استئناف تلك الجلسة عند عودة الاتصال؛ أعد تشغيل التمرير لجلسة جديدة. أثناء العمل على النصوص، يؤدي فقدان الخادم المرصود إلى تعطل الاستعلام.

مع جمع الملاحظات السليم وتحكم المُشغِّلات، يحترم إيقاف التشغيل النهائي الخيار --return_to_initial_position=true (الافتراضي)، ثم يفصل الاتصال. تتضمن عملية العودة قراءة ملاحظة كاملة، لذا قد تمنع الكاميرا المعطلة بشكل دائم هذه العملية. كما أن فشل الإجراء أو تطبيق الإمساك يوقف أي حركة إضافية. ضبط الخيار على false يتخطى عملية العودة، وليس فصل الاتصال. قد يؤدي فصل الاتصال إلى تحرير العزم وفقًا لتكوين الروبوت. تنتهي أخطاء التشغيل النهائي بحالة غير صفرية بعد التنظيف؛ ولا يمكن ضمان التنظيف في العملية التي تم إنهاءها قسريًا.

ضبط مهمة واحدة تعمل

ابدأ بالقرب من المرجع المتزامن: نفّذ جزءًا كبيرًا من كل تنبؤ، لكن اطلب ذلك مبكرًا بما يكفي لإخفاء زمن استجابة الاستدلال. ثم قيّم ما إذا كان إعادة التخطيط بشكل أكثر تكرارًا يساعد.

  1. استخدم المحاذاة دون المزج أولاً. حافظ على معدل الإطارات والتدبير والإعداد ثابتة. افحص أفق التنفيذ والوقت الكلي للدورة والطلبات البطيئة.
  2. اختر تغطية إعادة التعبئة بهامش أمان. اترك وقت تشغيل كافٍ لطلب آخر وتباين زمن الاستجابة، دون استبدال الخطة بشكل مستمر.
  3. أضف مزيجًا قصيرًا عند ذلك الإيقاع. قارن بين إكمال المهمة، والإمساك/الإفلات، والارتطامات بشكل منفصل. قد يؤدي متوسط سلس لخطط غير متوافقة إلى تفويت الهدف.
  4. اطلب في وقت مبكر فقط من أجل منفعة. زيادة معدل إعادة التعبئة يمكن أن يحسّن الاستجابة، لكنه قد يقاطع تقدّمًا مفيدًا. عُد إلى الإيقاع المستقر إذا تدهورت أداء المهمة.
  5. غيّر إعدادًا واحدًا في كل مرة. زيادة مهل الانتهاء أو فترة السماح لا توفر الإجراءات الناقصة. تقليل إعادة التعبئة ليس علاجًا شاملًا لاستنفاد الموارد.

لأفق تنفيذ مدته 0.8 s ومحاذاة ناجحة مستقرة، يكون التباعد بين الطلبات تقريباً 0.8 - effective_refill:

إعادة تعبئة فعّالةالتباعد التقريبيما يجب مراقبته
0.2 s0.6 sمتابعة أكثر، وحماية أقل من الطلبات البطيئة
0.4 s0.4 sكلما كان الاستبدال مبكرًا، زادت فرص التصحيح
0.6 s0.2 sتغييرات متكررة؛ تحقق من تقدم المهمة

يستثني هذا تأثيرات الإقلاع، والاحتفاظ، والتشبع، ودقات التحكم. طلب يبدأ مع 0.2 s متبقية ويستغرق 0.1 s لا يترك سوى 0.1 s للدمج، أي ثلاث خطوات عند 30 هرتز. لذلك قد يحتاج الإيقاع شبه المتزامن إلى دمج قصير فقط.

لمواءمة RTC، تحقق من مدة التشغيل المتاحة بعد القص، وليس طول المقطع الاسمي. إذا استغرق الاستدلال ثانية واحدة من توقع مدته 1.67 ثانية، فإن ما يتبقى هو حوالي 0.67 ثانية فقط. لا يمكن استيعاب طلب آخر مدته ثانية واحدة؛ ولا قيمة إعادة تعبئة تُصلح ذلك. قلّل زمن الدوران، أو استخدم أفقًا مدعومًا أطول، أو تحقق من تردد إجراء مختلف.

يشمل عمر المصدر التنفيذ. فيما يتعلق بالإضافة، يُسمح تقريبًا بـ execution horizon + effective refill بالإضافة إلى هامش الالتقاط/الاستدلال. مقطع من 100 خطوة عند 30 هرتز يمتد بالفعل إلى 3.33 ثانية. عادةً ما يقلل المحاذاة من العمر، لكن الدمج المتكرر قد يحافظ على مساهمين أقدم.

اقرأ السجلات وشخّص التشغيل

تُظهر سجلات INFO إعدادات القبول والإعدادات الفعلية، ونتائج طلبات النص، وانتقالات الانتظار/الإيقاف، وملخص نشاط كل خمس ثوانٍ تقريبًا. اقرأ زمن الاستجابة وتشغيل الطابور معًا. للتفاصيل، استخدم --log_level=DEBUG على الخادم و--inference.log_level=DEBUG على العميل. تُخفت جلسات التفاعلية سجلات العميل دون مستوى ERROR؛ استخدم تشغيلًا غير تفاعلي عند جمع سجلات التوقيت الحية.

عند حفظ السجلات، استخدم 2>&1 | tee -i server.log (أو client.log). يحافظ -i على بقاء tee نشطًا عندما يصل Ctrl+C إلى خط الأنابيب بأكمله، مما يتيح له التقاط رسائل الإيقاف السليم أيضًا.

ملاحظةالتحقق المفيد التالي
يسبب الإلحاق نتوءات عكسيةقارن المحاذاة عند نفس الإعداد؛ فقد يبدأ المقطع الكامل التالي من ملاحظة أقدم.
تكون عملية المحاذاة سلسة لكن نجاح المهمة ينخفضخفّض حدّ إعادة التعبئة ضمن هامش زمن الاستجابة لتقليل تكرار الاستبدال. اضبط الإيقاع قبل الدمج.
يبدو الدمج متردداًقَصِّر نافذته أو زِد الوزن الوارد؛ قارِن دون خلط عند الإيقاع التشغيلي.
استنفاد الانتظار المتكرر / الإجراءاتتحقق من بطء الاستجابة، والطلبات المفقودة أو المتوقفة، والتشغيل بعد التقليم. زد هامش الأمان فقط إذا سمح الأفق بذلك.
لا تفعل تغييرات إعادة التعبئة شيئاًقد تهيمن حدّ الكمون المقاس؛ افحص إعادة التعبئة الفعلية.
عطل المصدر القديمافحص أقدم مصدر من حيث العمر والأفق والدمج. الردود الجديدة لا تحدّث المساهمين القدامى.
BUSY بعد إعادة تشغيل العميلانتظر تنظيف العملاء الغائبين والعمل الجاري. لا تُجدِّد إعادة الاتصالات المرفوضة مهلة الملكية.
عدم تطابق العقدقارن مخططات البيانات وأوضاع التشغيل وبيانات الوصفية لبرامج الإقلاع؛ أعد تشغيل العملية غير المتوافقة أو حدّثها.

يتضمّن DEBUG إعادة تشغيل كل طلب عند الإرسال، وعمر الملاحظة، وتقدّم المؤشّر، بالإضافة إلى الخطوات المقصوصة/القابلة للاستخدام والتداخل لكل نتيجة. تصف هذه العناصر التقدّم المُمرَّر بالأوامر، وليس التنفيذ الفيزيائي المقاس.

التكوين والشبكات

احتفظ بملف YAML واحد للنشر يجمع بين نقطة التفتيش ومخطط الروبوت وإعدادات الخادم؛ واستخدم تجاوزات سطر الأوامر المتداخلة للتجارب. امنح التجارب المستقلة أسماء نشر مختلفة. تسجّل كلتا العمليتين إصدارات الحزمة والبروتوكول؛ وتتحقق عملية القبول من البروتوكول وعقود التنفيذ/البيانات، دون اشتراط تطابق إصدارات الحزمة.

Schema, camera names and checkpoint requirements

يتضمن server.yaml المُدار جميع الحقول المطلوبة. تُعلن features وaction_feature عن الشكل ونوع البيانات والدلالات، كما تُعلن متجهات الحالة/الإجراء عن ترتيب المكونات. تُستخدم الصور بصيغة uint8 بألوان RGB، بأبعاد الارتفاع × العرض × 3. على سبيل المثال:

features:
  - name: observation.state
    shape: [6]
    dtype: float32
    names:
      [
        shoulder_pan.pos,
        shoulder_lift.pos,
        elbow_flex.pos,
        wrist_flex.pos,
        wrist_roll.pos,
        gripper.pos,
      ]
    semantics: so101-degrees-gripper-percent-v1
  - name: observation.images.front
    shape: [480, 640, 3]
    dtype: uint8
    kind: rgb
    semantics: rgb-front-table-v1

استخدم الأسماء الموجهة نحو نقطة التفتيش. لربط كاميرا الروبوت المسماة scene بمنظر front في نقطة التفتيش، اضبط --rename_map='{"observation.images.scene":"observation.images.front"}' للعميل. لا يمكن لإعادة التسمية تغيير المنظر أو الدقة أو المعايرة. يمكن أن تبقى الكاميرات الإضافية متاحة للتسجيل دون إرسالها إلى الخادم.

تستخدم السياسات المدعومة المعالجات المحفوظة والتنبؤ المباشر بالقطع من الملاحظة الحالية. تتطلب السياسات المعتمدة على التاريخ ومخرجات المتحكم الكامن والإعدادات المتاحة فقط عبر select_action() تكاملاً إضافياً. لا يُثبت الاستدلال المتزامن الناجح أو الإحماء وحده جودة المهمة عن بُعد أو دعم اللغة/RTC.

في حالة نقطة تفتيش مدعومة تعتمد على المقاطع فقط، يُقصّر الخادم --execution.n_action_steps=30 شريحة التنفيذ الخاصة به دون الحاجة إلى تعديل نقطة التفتيش. ولا يمكن أن يتجاوز هذا الإعداد أفق التنبؤ، كما يُرفض في حالات النشر الخاصة بالتفاعل في الوقت الفعلي (RTC). أما الخيار الاختياري للعميل --inference.expected_artifact=... فيثبّت محتوى النموذج/المعالج وإعدادات الاستدلال الفعلية؛ فاسم النشر وحده لا يُعدّ هوية لنقطة التفتيش.

Independent deployments, bandwidth and connection loss

أقرن خادم --deployment=arm-a بعميل --inference.deployment=arm-a. يجب أن تكون الأسماء مقاطع أحادية تحتوي على أحرف وأرقام وعلامات شرطة سفلية ونقاط وشرطات فقط. لا يزال كل عملية خادم تخدم عميلاً نشطاً واحداً. إذا أعلنت عدة كائنات عن نفس الاسم، فاختر --inference.instance=... أو استخدم أسماء مميزة؛ فالاكتشاف لا يختار بشكل عشوائي.

تُحدَّد نطاقات الحركة تحت lerobot/inference/v1/deployments/{deployment}، ثم حسب خادم الحالة والجلسة. تتولى طلبات/ردود اكتشاف القبول والتحكم؛ بينما ينقل النشر/الاشتراك بيانات الاستدلال؛ وتتتبع الحيوية الحضور. تعطّل نقاط النهاية الصريحة اكتشاف البث المتعدد/الثرثرة. تحكّم هويات التسلسل/الجيل والتوقيت المحلي للعميل في الحركة؛ ولا حاجة إلى ساعات مضيف متزامنة.

الصيغة الخام RGB خالية من الفقد وهي الافتراضية. جرّب --inference.encoding=jpeg --inference.jpeg_quality=90 لتقليل عرض النطاق الترددي للصور، ثم قارن زمن الاستجابة وجودة المهمة. تتراوح الجودة من 1 إلى 100؛ ولا يتم ترميز الموترات (tensors) العشوائية بصيغة JPEG أبدًا.

قد لا تكشف ميزة Liveliness عن انقطاع الاتصال إلا بعد انتهاء مدة إيجار النقل. يمكن لملف Zenoh JSON5 المُقدَّم عبر --inference.zenoh_config_path للعميل أو --zenoh.config_file للخادم تعديل transport/link/tx/lease. ولا يغيّر هذا الأمر مواعيد انتهاء المهل للإجراءات، أو مهلة السماح للجوع، أو تنظيف ملكية العميل الغائب. يؤدي الازدحام في المراقبة إلى إسقاط البيانات بدلاً من تعطيل إرسال الأوامر إلى المحركات.

إعادة presence restored للخادم تلغي تنظيف الملكية؛ ولا يمكنها إحياء عميل تعطل بالفعل. يؤدي فشل إعادة تعيين السياسة إلى جعل النشر غير متاح حتى لو ظلّت العملية حية؛ عالج الفشل وأعد تشغيلها.

Private connections through an authenticated router

يوفر الموجّه نقطة التقاء قابلة للوصول لعمليات الروبوت ووحدات معالجة الرسوميات (GPU)، بما في ذلك عدة تجارب منفصلة. يضيف الموجّه زمن استجابة ونقطة فشل محتملة؛ ولا يوفر تجاوز الجدار الناري تلقائيًا، أو جدولة النماذج، أو استعادة الحركة. لا تُوثّق بروتوكولات TCP العارية ومعرفات الجلسات الأطراف المتصلة.

استخدم إعدادات Zenoh المُصانة: router.json5 وserver.json5 وrobot.json5. تستخدم هذه الإعدادات TLS والتحقق المتبادل من الشهادات وتعطيل الاكتشاف وقوائم التحكم في الوصول القائمة على الأدوار. جهّز سلطة شهادة خاصة (CA) وشهادات منفصلة لكل من router وserver وrobot تحت المسارات المُحددة. يحتاج كل عملية إلى مفتاحها الخاص وشهادة CA فقط؛ احتفظ بمفتاح CA في مكان آخر. لنشر على شبكة محلية (LAN)، استبدل localhost بشكل متسق باسم مضيف router وأصدر شهادة تغطي ذلك الاسم.

zenohd --config examples/remote_inference/zenoh/router.json5

uv run --no-sync lerobot-policy-server --config_path=server.yaml \
  --zenoh.mode=client \
  --zenoh.listen_endpoints='[]' \
  --zenoh.connect_endpoints='[tls/localhost:7447]' \
  --zenoh.config_file=examples/remote_inference/zenoh/server.json5

أضِف إلى أمر النشر العادي:

--inference.endpoint=tls/localhost:7447 \
--inference.zenoh_mode=client \
--inference.zenoh_config_path=examples/remote_inference/zenoh/robot.json5

غيّر مسارات نشر ACL مع اسم النشر. يستخدم جميع المشاركين وضع العميل دون روابط أقران مباشرة. يفصل المثال بين أدوار الروبوت والخادم، لكن مشاركة شهادات الأدوار تشارك الصلاحيات؛ استخدم هويات مصرّحًا بها منفصلة لمجموعات الثقة المختلفة. لا يمكن لقوائم تحكم الوصول في الموجّه حماية عملية روبوت مُخترقة أو إدارة حركة المرور المحلية الداخلية الخاصة بها. راجع وثائق TLS وACL الخاصة بـ Zenoh.

يجب أن تكون الإصدارتان المتوافقتان من الملف التنفيذي zenohd والربط بلغة بايثون. للتحقق من توافق الموجّه المثبت مع الربط المثبت، بما في ذلك فرض TLS وACL:

LEROBOT_ZENOHD=/absolute/path/to/zenohd \
  uv run --no-sync pytest tests/remote_inference/test_zenoh.py -q -rs

تتطلب الفحوصات أيضًا openssl؛ وتُبلَّغ المتطلبات غير المتوفرة كإجراءات تم تجاوزها. لم يتم التحقق بعد من تشغيل الروبوت عبر موجّه، أو وحدة معالجة رسومية خاصة مستضافة، أو مساحة Hugging Face. قِس الوقت الكلي للدورة وسلوك المقاطعة قبل تشغيل الروبوت عبر بنية جديدة؛ فالتوصيل العامل وحده لا يضمن ميزانية حركة قابلة للاستخدام.

اللغة والتسجيل

استخدم /vqa و/subtask و/autosteer عبر التنفيذ التفاعلي. فعّل خاصية language.enabled=true على الخادم فقط عند نقطة تحقق تدعم توليد النص؛ كما يتطلب توجيه /autosteer نقطة تحقق مدرّبة لتوليد المهام الفرعية مع ترميز متوافق للأهداف والمهام الفرعية. يعرض الخادم هذه الأوامر عندما تعلن نقطة التحقق عن هذه القدرة؛ أما مدى فائدة الإجابات والمهام الفرعية فيعتمد على نقطة التحقق.

توقف عمل النص يوقف الحركة ويتخلّى عن الاستمرار المخزّن مؤقتًا. أما VQA فيحافظ على تعليماتك ويستأنف بتنبؤ جديد، مما قد يؤدي إلى فقدان تقدّم المهمة لدى إعادة التخطيط، حتى بعد إجابة ناجحة. إبقاء الحركة المخزّنة مؤقتًا تعمل أثناء استعلام VQA معلوماتي مخطط له؛ راجع الأعمال المستقبلية.

يعتمد التسجيل على صيغة مجموعة البيانات المحلية المعتادة. تتبع تسميات المهام الإجراء المُنفَّذ. تبقى التشخيصات في سجلات التطبيق؛ فهي لا تُكتب في مجموعة البيانات ولا تُرفع. عند استخدام مجموعة بيانات، استخدم --dataset.single_task للتعليمات الأولية؛ وإلا استخدم --task. يُفضَّل استخدام أحدهما لتجنب تعارض الإعدادات.

استخدمه من بايثون

توجد المحركات المشتركة والإعدادات في lerobot.inference؛ بينما يوجد العميل البعيد والمحرك والخادم في lerobot.remote_inference. تربط حلقة تحكم خارج lerobot-rollout وتقبل عميلاً، ثم تغلفه في محرك، وتنشر اللقطات، وتُصدر كل نبضة محرك عبر dispatch_tick، التي تطبّق نفس عقد الإذن والاحتفاظ والتأكيد كما في واجهة سطر الأوامر:

import time

import numpy as np

from lerobot.inference import RemoteInferenceConfig, dispatch_tick
from lerobot.remote_inference import RemoteClient, RemoteInferenceEngine
from lerobot.utils.action_interpolator import ActionInterpolator

config = RemoteInferenceConfig(
    endpoint="tcp/127.0.0.1:7447",
    deployment="manipulation",
    semantics="so101-degrees-gripper-percent-v1",
)
client = RemoteClient.connect(config)
caps = client.capabilities
client.admit(
    features=caps.features,
    action_feature=caps.action_feature,
    semantics=config.semantics,
    action_interval=caps.action_interval,
    mode=config.mode,
)
engine = RemoteInferenceEngine(client, config, task="pick up the cube")
interpolator = ActionInterpolator(multiplier=1)

engine.start()
engine.resume()
try:
    while running():
        captured = time.monotonic()
        engine.submit_observation(
            {"observation.state": state_vector(), "observation.images.front": front_rgb()},
            capture_time=captured,
        )
        # send() receives a torch tensor in the deployment's action order; hold() refreshes
        # the last applied target. Returns None when the tick was held or starved.
        dispatch_tick(engine, interpolator, send=robot_send, hold=robot_hold)
finally:
    engine.stop()  # revokes motion and closes the client

تُفهرس الملاحظات بأسماء الميزات الموجهة نحو نقاط التفتيش، ويجب أن تتطابق مع مخطط الخادم: متجهات float32 بالترتيب المعلن للمكونات، وصور RGB من نوع uint8 بالحجم المعلن. ينفّذ tests/remote_inference/test_library_client.py هذا المسار ضد خادم حلقة الارتداد (loopback)، وهو المرجع لتسلسل الاستدعاء. يضيف lerobot-rollout تحويل السائق، وفحوصات تثبيت الموضع، والأوامر التفاعلية، والتسجيل فوق ذلك؛ بينما lerobot-policy-server هو نقطة الدخول للتقديم، ويُهيأ فقط عبر تجاوزات YAML وواجهة سطر الأوامر الخاصة به.

Migrating from lerobot[async]

استُبدل الإصدار الإضافي lerobot[async] المُتقاعس والأوامر lerobot.async_inference بـ lerobot[remote] وlerobot-policy-server وlerobot-rollout --inference.type=remote. لا يمكن استبدال عتبات حجم الدفعة القديمة وأوزان التجميع مع إعادة التعبئة والمحاذاة والدمج؛ أعد ضبطها من المعاملات المذكورة أعلاه.

تمت إزالة موقع الاستيراد القديم lerobot.rollout.inference لصالح lerobot.inference وlerobot.remote_inference. لا يوجد خيار hold_mode: يتطلب التنفيذ عن بُعد إعلان تثبيت الموضع من قِبل السائق، والذي يتحقق منه التمرير تلقائيًا.

بالنسبة إلى Unitree G1 مع SONIC، اتبع وصفة G1 عن بُعد بدلاً من تكييف الأوامر القديمة؛ حيث تبقى متحكمات الحركة في G1 غير مدعومة.

لمعرفة البنية وعقود التنفيذ والتوسعات المخطط لها، راجع مرجع التصميم الهندسي.

Update on GitHub