חיישנים וציוד היקפי
מפרטי 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 |
| ספרייה רגילה בלבד | שקע, מבנה, תור, השחלה, אות, זמן |