مخطط حزمة UDP
كل حزمة عبارة عن رسالة ثنائية ذات طول ثابت تبلغ 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% ولا ترفع إلا بعد التحقق من صحة الحركة بشكل كامل.