أجهزة الاستشعار والأجهزة الطرفية
مواصفات Meta Quest 3 VR Teleop
مرجع فني كامل: مخطط حزمة UDP، وأنواع الحقول وتخطيط البايت، وتفاصيل وقت الاستجابة من طرف إلى طرف، والمعلمات الرئيسية القابلة للضبط، ومواصفات الذراع المتوافقة.
نظرة عامة على النظام
الأجهزة ووقت التشغيل
| سماعة الرأس | Meta Quest 3 (يتطلب وضع التتبع اليدوي) |
| نسخة الوحدة | 2022.3 LTS أو أحدث · حزمة XR Hands · البرنامج المساعد OpenXR |
| وقت تشغيل المضيف | Python 3.10+ (Linux أو macOS؛ لا يتطلب ROS) |
| متطلبات الشبكة | نفس الشبكة الفرعية LAN؛ يوصى بنقطة وصول Wi-Fi 6 |
| منفذ UDP الأيمن | 8888 |
| منفذ UDP الأيسر | 8889 (التحكم الثنائي فقط، وإلا فهو غير مستخدم) |
| معدل الحزمة (المرسل) | ~ 50 هرتز من Unity (حلقة التحديث الثابتة للوحدة) |
| معدل قيادة الروبوت | 30 هرتز افتراضي (قابل للتكوين عبر CONTROL_HZ) |
| SDK الأساسي (بايبر) | Piper_sdk · python-can · CAN عبر محول USB |
مخطط حزمة UDP
كل حزمة عبارة عن رسالة ثنائية ذات طول ثابت تبلغ 45 بايت. تستخدم كافة الحقول متعددة البايت ليتل إنديان ترتيب البايت. يتم تجاهل البايتات غير المعروفة الملحقة في النهاية بواسطة جهاز الاستقبال من أجل التوافق الأمامي.
تخطيط الحزمة الثنائية - إجمالي 45 بايت
| مجال | يكتب | بايت | وصف |
|---|---|---|---|
| header | uint8[4] | 4 | بايتات سحرية 0x52 0x43 0x54 0x50 — ASCII "RCTP". يتم إسقاط الحزم ذات القيمة السحرية الخاطئة بصمت. |
| الطابع الزمني | float64 | 8 | الوحدة Time.realtimeSinceStartup في ثواني. تستخدم لقياس غضب. لا يتم تفسيرها بواسطة وحدة تحكم الروبوت. |
| pos_x | float32 | 4 | موضع المؤثر النهائي X بالأمتار، إطار عالم الواقع الافتراضي (اليد اليمنى، Y-up). تم تحويله إلى إطار روبوت ملم بواسطة transform_position(). |
| pos_y | float32 | 4 | موضع المؤثر النهائي Y بالأمتار، إطار عالم الواقع الافتراضي. |
| pos_z | float32 | 4 | موضع المؤثر النهائي Z بالأمتار، إطار عالم الواقع الافتراضي. |
| rot_x، rot_y، rot_z، rot_w | تعويم 32 × 4 | 16 | دوران المؤثر النهائي كوحدة رباعية في إطار عالم الواقع الافتراضي. تم تحويله إلى أويلر (لفة/درجة/انعراج) بواسطة quat_to_euler() قبل المرور إلى الروبوت SDK. |
| القابض | float32 | 4 | انفتاح القابض: 0.0 = مغلق بالكامل 1.0 = مفتوحة بالكامل. مستمدة من قوة قرصة عبر VRGripperController.cs. |
| أعلام | uint8 | 1 | البت 0: التتبع صالح (1 = تم اكتشاف اليد). البتة 1: طلب التوقف في حالات الطوارئ (1 = ضغط المشغل على القائمة). البتات المتبقية محفوظة. |
ملخص إزاحة البايت: الرأس 0–3، الطابع الزمني 4–11، pos_x 12–15، pos_y 16–19، pos_z 20–23، rot_x 24–27، rot_y 28–31، rot_z 32–35، rot_w 36–39، القابض 40–43، الأعلام 44.
بايثون struct سلسلة التنسيق للتفريغ:
يستورد struct PACKET_MAGIC = b'\x52\x43\x54\x50' # "RCTP" PACKET_FMT = '<4sdffffffff و ب' # ^ ^ ^^^^^^^^^^ ^ ^ # | | pos xyz | flags (uint8) # | timestamp gripper (float32) # header (4 bytes) rot xyzw (float32×4) مواطنه parse_packet(data: bytes) -> dict | None: لو len(data) < struct.calcsize(PACKET_FMT): يعود None fields = struct.unpack_from(PACKET_FMT, data) header, ts, px, py, pz, rx, ry, rz, rw, gripper, flags = fields لو header != PACKET_MAGIC: يعود None يعود { "الطابع الزمني": ts, "موضع": (px, py, pz), "تناوب": (rx, ry, rz, rw), "القابض": gripper, "صالح": bool(flags & 0x01), "قف": bool(flags & 0x02), }
الكمون من النهاية إلى النهاية
تم القياس على شبكة Wi-Fi 6 LAN باستخدام ذراع AgileX Piper بمعدل تحكم 30 هرتز وحد سرعة 25%. القيم نموذجية. يعتمد الكمون الفعلي على ظروف Wi-Fi ومعدل مضاعفات الروبوت.
~20 مللي ثانية
كويست 3 تتبع خط الأنابيب
اندماج مستشعر وضع اليد في رد اتصال الوحدة
<5 مللي ثانية
اجتياز UDP
واي فاي 6 لان؛ ما يصل إلى 15 مللي ثانية تقريبًا على شبكة Wi-Fi الأقدم
<2 مللي ثانية
تحليل بايثون وقائمة الانتظار
فك الهيكل + إدراج قائمة الانتظار
30-80 مللي ثانية
تنفيذ مسار الروبوت
يعتمد على الحد الأقصى للسرعة ومسافة التحرك
إجمالي نموذجي من النهاية إلى النهاية
| واي فاي 6 LAN، سرعة 25% | 50-120 مللي ثانية |
| واي فاي 5 LAN، سرعة 25% | 80-150 مللي ثانية |
| استجابة الإيقاف الإلكتروني للبرنامج (مسار البت 1) | دورة تحكم واحدة (~33 مللي ثانية عند 30 هرتز) |
| كشف تتبع الخسارة | فوري (إشارة البايت في الحزمة الحالية) |
حافظ على حدود السرعة متحفظة لتقليل الشعور بزمن الوصول.
عنصر الكمون الإدراكي المهيمن هو تنفيذ مسار الروبوت. أقل
SPEED_PERCENT يجعل النظام يبدو أكثر قابلية للتنبؤ به على الرغم من تشابه الوقت الفعلي لرحلة الذهاب والإياب. ابدأ بـ 25% ولا ترفع إلا بعد التحقق من صحة الحركة بشكل كامل.
المعلمات الرئيسية القابلة للضبط
مفتش الوحدة (VRHandPoseSender)
| إزاحة الموضع (م) | (0، 0، 0.3) — نقطة بداية بايبر |
| إزاحة الدوران (درجة) | (0، 90، 0) — نقطة بداية بايبر |
| عامل القياس | 0.75 — يقيس حركة اليد إلى مساحة عمل بايبر |
| مساحة العمل X المشبك (مم) | ±400 (بايبر)؛ ±600 (xArm6) |
| مساحة العمل Z المشبك (مم) | 50 - 700 (بايبر)؛ 0 - 900 (xArm6) |
| منفذ UDP المستهدف | 8888 (اليد اليمنى) / 8889 (اليد اليسرى) |
خادم بايثون (teleoperation_main.py)
| CONTROL_HZ | 30 هرتز — معدل قيادة الروبوت؛ تطابق مع معدل المؤازرة |
| QUEUE_MAXSIZE | 3 - إطارات مخزنة مؤقتًا بين سلاسل جهاز الاستقبال وجهاز التحكم |
Piper_controller.py (AgileX Piper)
| SPEED_PERCENT | 25% — الحد الأقصى لكسر سرعة المفصل؛ رفع تدريجيا |
| X_MIN / X_MAX (مم) | −400 / +400 |
| Y_MIN / Y_MAX (مم) | −400 / +400 |
| Z_MIN / Z_MAX (مم) | 50 / 700 |
| GRIPPER_MAX_UM (ميكرومتر) | 70000 - 70 ملم فتحة مادية |
| وحدات موضع SDK | ميكرومتر (عدد صحيح) - اضرب قيم المليمتر في 1000 |
| وحدات توجيه SDK | ميلي درجة (عدد صحيح) - ضرب قيم الدرجات بـ 1000 |
| يمكن واجهة | can0 (افتراضي) — قم بالتنشيط باستخدام can_activate.sh قبل التشغيل |
الأسلحة المتوافقة في SVRC
| ذراع | DOF | SDK/الواجهة | ملف وحدة التحكم | حالة |
|---|---|---|---|---|
| أجيليكس بايبر | 6 | Piper_sdk · يمكن عبر USB | piper_controller.py | جاهز للإنتاج |
| الذراع المفتوحة | 7 | المقبس CAN / ROS 2 MoveIt2 | openarm_controller.py | بيتا |
| مجموعة DK1 ثنائية الاستخدام | المزدوج 6 | المنافذ 8888 + 8889 في وقت واحد | dk1_controller.py | بيتا |
| فلاي L1 | المزدوج 6 | جسر ROS 2 · TCP/IP | vlai_l1_controller.py | في التنمية |
متطلبات البرمجيات
المهمة 3 / جانب الوحدة
| الوحدة | 2022.3 LTS أو أحدث |
| حزمة الأيدي XR | com.unity.xr.hands ≥ 1.3 |
| البرنامج المساعد OpenXR | com.unity.xr.openxr ≥ 1.9 |
| ميتا XR SDK | اختياري ولكن يوصى به للعبور |
| وضع تتبع اليد | ممكّن في إعدادات نظام Quest (تتبع الحركة) |
التحكم في جهاز الكمبيوتر/جانب بايثون
| بايثون | 3.10 أو الأحدث (يستخدم بناء جملة نوع الاتحاد) |
| Piper_sdk | pip install piper_sdk |
| بيثون يمكن | pip install python-can |
| يمكن واجهة | محول USB إلى CAN؛ تفعيلها مع can_activate.sh can0 1000000 |
| المكتبة القياسية فقط | المقبس، البنية، قائمة الانتظار، الخيوط، الإشارة، الوقت |