מפרטי 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 (לולאת העדכון הקבועה של Unity)
קצב פיקוד רובוט ברירת מחדל של 30 הרץ (ניתן להגדרה באמצעות CONTROL_HZ)
SDK ראשי (Piper) piper_sdk · python-can · מתאם CAN דרך USB

סכימת מנות UDP

כל מנה היא הודעה בינארית באורך קבוע של 45 בתים. כל השדות מרובי-בתים משתמשים מעט-אנדיאן סדר בתים. בתים לא ידועים המצורפים בסוף מתעלמים על ידי המקלט לצורך תאימות קדימה.

פריסת מנות בינארית - 45 בתים בסך הכל
שָׂדֶה סוּג בתים תֵאוּר
כּוֹתֶרֶת uint8[4] 4 בתים קסמים 0x52 0x43 0x54 0x50 — ASCII "RCTP". חבילות עם ערך קסם שגוי נשמטות בשקט.
חותמת זמן לצוף64 8 אַחְדוּת Time.realtimeSinceStartup תוך שניות. משמש למדידת ריצוד; לא מתפרש על ידי בקר הרובוט.
pos_x לצוף32 4 מיקום X של מנגנון הקצה במטרים, מסגרת עולם VR (יד ימין, Y-up). הומר למסגרת רובוט מ"מ על ידי transform_position().
זֵר לצוף32 4 מיקום Y של מנגנון קצה במטרים, מסגרת עולם VR.
pos_z לצוף32 4 מיקום Z של מנגנון הקצה במטרים, מסגרת עולם VR.
rot_x, rot_y, rot_z, rot_w לצוף32 × 4 16 סיבוב אפקטור קצה כקווטרניון יחידה במסגרת עולם VR. הומר לאולר (גלגול/גובה/פיהוק) על ידי quat_to_euler() לפני המעבר לרובוט SDK.
תפסן לצוף32 4 פתיחות האוחזת: 0.0 = סגור לחלוטין, 1.0 = פתוח לגמרי. נגזר מחוזק צביטה דרך VRGripperController.cs.
דגלים uint8 1 סיביות 0: מעקב חוקי (1 = זיהוי יד). Bit 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– 43, gripper.

פִּיתוֹן struct מחרוזת פורמט לפירוק:

יְבוּא struct

PACKET_MAGIC = b'\x52\x43\x54\x50'  # "RCTP"
PACKET_FMT   = '<4sdffffffffff f B'
#              ^  ^ ^^^^^^^^^^ ^ ^
#              |  | pos xyz    | flags (uint8)
#              |  timestamp   gripper (float32)
#              header (4 bytes)   rot xyzw (float32×4)

def 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 אלפיות השנייה
Quest 3 Tracking Pipeline
מיזוג חיישן תנוחת יד להתקשרות חוזרת של Unity
<5 אלפיות השנייה
UDP Transit
Wi-Fi 6 LAN; עד ~15 אלפיות השנייה ב-Wi-Fi ישן יותר
< 2 אלפיות השנייה
פייתון ניתוח ותור
פירוק מבנה + הכנסת תור
30-80 אלפיות השנייה
ביצוע מסלול רובוט
תלוי במגבלת המהירות ובמרחק התנועה
טיפוסי סה"כ מקצה לקצה
Wi-Fi 6 LAN, מהירות של 25%. 50–120 אלפיות השנייה
Wi-Fi 5 LAN, מהירות של 25%. 80-150 אלפיות השנייה
תגובת עצירה אלקטרונית של תוכנה (נתיב סיביות 1) מחזור בקרה אחד (~33 אלפיות השנייה ב-30 הרץ)
זיהוי מעקב אובדן מיידי (מסמן בייט בחבילה הנוכחית)
שמור על מגבלות מהירות שמרניות כדי להפחית את תחושת השהיה. מרכיב השהיה התפיסתי הדומיננטי הוא ביצוע מסלול רובוט. נמוך יותר SPEED_PERCENT גורם למערכת להרגיש צפויה יותר למרות שזמן ההליכה הלוך ושוב דומה. התחל ב-25% והעלה רק לאחר שהתנועה מאומתת במלואה.

פרמטרים ניתנים לכוונון מפתח

מפקח אחדות (VRHandPoseSender)
מיקום היסט (מ') (0, 0, 0.3) - נקודת התחלה של פייפר
סיבוב היסט (מעלה) (0, 90, 0) - נקודת התחלה של פייפר
scaleFactor 0.75 - קנה מידה של תנועת ידיים לסביבת העבודה של Piper
מהדק משטח עבודה X (מ"מ) ±400 (פייפר); ±600 (xArm6)
מהדק Z של סביבת עבודה (מ"מ) 50 – 700 (פייפר); 0 - 900 (xArm6)
יציאת יעד UDP 8888 (יד ימין) / 8889 (יד שמאל)
שרת Python (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 (מיקרומטר) פתיחה פיזית של 70,000 — 70 מ"מ
יחידות מיקום SDK מיקרומטר (מספר שלם) - הכפל את ערכי המ"מ ב-1,000
יחידות כיוון SDK מילידים (מספר שלם) - הכפל ערכי מעלות ב-1,000
ממשק CAN can0 (ברירת מחדל) - הפעל עם can_activate.sh לפני ההרצה

זרועות תואמות ב-SVRC

זְרוֹעַ DOF SDK / ממשק קובץ בקר סטָטוּס
AgileX Piper 6 piper_sdk · CAN דרך USB piper_controller.py מוכן להפקה
OpenArm 7 SocketCAN / ROS 2 MoveIt2 openarm_controller.py בטא
ערכה דו-מנואלית DK1 כפול 6 יציאות 8888 + 8889 בו זמנית dk1_controller.py בטא
VLAI L1 כפול 6 גשר ROS 2 · TCP/IP vlai_l1_controller.py בפיתוח

דרישות תוכנה

קווסט 3 / Unity Side
אַחְדוּת 2022.3 LTS ומעלה
חבילת XR Hands com.unity.xr.hands ≥ 1.3
תוסף OpenXR com.unity.xr.openxr ≥ 1.9
Meta XR SDK אופציונלי אך מומלץ למעבר
מצב מעקב יד מופעל בהגדרות מערכת Quest (מעקב תנועה)
שליטה במחשב / צד Python
פִּיתוֹן 3.10 ואילך (משתמש בתחביר מסוג איחוד)
piper_sdk pip install piper_sdk
יכול פיתון pip install python-can
ממשק CAN מתאם USB ל-CAN; מופעל עם can_activate.sh can0 1000000
ספרייה רגילה בלבד שקע, מבנה, תור, השחלה, אות, זמן

מוכן לטלאופ?

חזור למדריך ההתקנה כדי להזרים את ה-Quest 3 שלך לזרוע רובוט, או קרא את הוויקי המלא לעיון המפתחים המלא.