Meta Quest 3 VR Teleop-Spezifikationen

Vollständige technische Referenz: UDP-Paketschema, Feldtypen und Byte-Layout, Aufschlüsselung der End-to-End-Latenz, wichtige einstellbare Parameter und kompatible Armspezifikationen.

Systemübersicht

Hardware & Laufzeit
Headset Meta Quest 3 (Hand-Tracking-Modus erforderlich)
Unity-Version 2022.3 LTS oder höher · XR Hands-Paket · OpenXR-Plugin
Host-Laufzeit Python 3.10+ (Linux oder macOS; kein ROS erforderlich)
Netzwerkanforderung Gleiches LAN-Subnetz; Wi-Fi 6-Zugangspunkt empfohlen
Rechter UDP-Port 8888
Linker UDP-Port 8889 (nur bilaterale Kontrolle; sonst nicht verwendet)
Paketrate (Absender) ~50 Hz von Unity (Unitys feste Update-Schleife)
Befehlsrate des Roboters 30 Hz Standard (konfigurierbar über CONTROL_HZ)
Primäres SDK (Piper) piper_sdk · python-can · CAN über USB-Adapter

UDP-Paketschema

Jedes Paket ist eine 45-Byte-Binärnachricht fester Länge. Alle Multibyte-Felder verwenden Little-Endian Byte-Reihenfolge. Am Ende angehängte unbekannte Bytes werden vom Empfänger aus Gründen der Vorwärtskompatibilität ignoriert.

Binärpaket-Layout – insgesamt 45 Byte
Feld Typ Bytes Beschreibung
Kopfzeile uint8[4] 4 Magische Bytes 0x52 0x43 0x54 0x50 — ASCII „RCTP“. Pakete mit einem falschen magischen Wert werden stillschweigend verworfen.
Zeitstempel float64 8 Einheit Time.realtimeSinceStartup in Sekunden. Wird zur Jitter-Messung verwendet. nicht von der Robotersteuerung interpretiert.
pos_x float32 4 Endeffektor-X-Position in Metern, VR-Weltrahmen (rechtshändig, Y-oben). Umgerechnet in mm Roboterrahmen von transform_position().
Sträußchen float32 4 Y-Position des Endeffektors in Metern, VR-Weltrahmen.
pos_z float32 4 Z-Position des Endeffektors in Metern, VR-Weltrahmen.
rot_x, rot_y, rot_z, rot_w float32 × 4 16 Endeffektorrotation als Einheitsquaternion im VR-Weltrahmen. Umgerechnet in Euler (Rollen/Nicken/Gieren) von quat_to_euler() bevor es an das Roboter-SDK übergeben wird.
Greifer float32 4 Greiferöffnung: 0.0 = vollständig geschlossen, 1.0 = vollständig geöffnet. Abgeleitet von der Pinch-Stärke über VRGripperController.cs.
Flaggen uint8 1 Bit 0: Tracking gültig (1 = Hand erkannt). Bit 1: Notstopp angefordert (1 = Bediener hat Menü gedrückt). Restliche Bits reserviert.

Byte-Offset-Zusammenfassung: Header 0–3, Zeitstempel 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, Gripper 40–43, Flags 44.

Python struct Formatstring zum Entpacken:

Import struct

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

def parse_packet(data: bytes) -> dict | None:
    Wenn len(data) < struct.calcsize(PACKET_FMT):
        zurückkehren None
    fields = struct.unpack_from(PACKET_FMT, data)
    header, ts, px, py, pz, rx, ry, rz, rw, gripper, flags = fields
    Wenn header != PACKET_MAGIC:
        zurückkehren None
    zurückkehren {
        „Zeitstempel“: ts,
        "Position": (px, py, pz),
        "Drehung": (rx, ry, rz, rw),
        „Greifer“:  gripper,
        "gültig":    bool(flags & 0x01),
        „Sicherungen“:    bool(flags & 0x02),
    }

End-to-End-Latenz

Gemessen in einem Wi-Fi 6 LAN mit dem AgileX Piper-Arm bei 30 Hz Steuerfrequenz und 25 % Geschwindigkeitsbegrenzung. Werte sind typisch; Die tatsächliche Latenz hängt von den WLAN-Bedingungen und der Servogeschwindigkeit des Roboters ab.

~20 ms
Quest 3-Tracking-Pipeline
Handpose-Sensorfusion zum Unity-Rückruf
<5 ms
UDP-Transit
Wi-Fi 6 LAN; bis zu ~15 ms bei älterem WLAN
<2 ms
Python-Analyse und Warteschlange
Struktur entpacken + Warteschlange einfügen
30–80 ms
Ausführung der Roboterbahn
Hängt von der Geschwindigkeitsbegrenzung und der Bewegungsdistanz ab
Typisches Total End-to-End
Wi-Fi 6 LAN, 25 % Geschwindigkeit 50–120 ms
Wi-Fi 5 LAN, 25 % Geschwindigkeit 80–150 ms
Software Not-Aus-Reaktion (Bit 1 Pfad) 1 Regelzyklus (~33 ms bei 30 Hz)
Erkennung von Tracking-Verlusten Sofort (Flaggen-Byte im aktuellen Paket)
Halten Sie die Geschwindigkeitsbegrenzungen konservativ, um das Latenzgefühl zu reduzieren. Die dominierende Komponente der Wahrnehmungslatenz ist die Ausführung der Roboterbahn. Eine niedrigere SPEED_PERCENT Dadurch fühlt sich das System vorhersehbarer an, auch wenn die tatsächliche Umlaufzeit ähnlich ist. Beginnen Sie bei 25 % und erhöhen Sie den Wert erst, nachdem die Bewegung vollständig bestätigt wurde.

Wichtige einstellbare Parameter

Unity-Inspektor (VRHandPoseSender)
positionOffset (m) (0, 0, 0,3) – Piper-Startpunkt
rotationOffset (Grad) (0, 90, 0) – Piper-Startpunkt
Skalierungsfaktor 0,75 – skaliert die Handbewegung auf den Piper-Arbeitsbereich
Arbeitsbereich X-Klemme (mm) ±400 (Pfeifer); ±600 (xArm6)
Arbeitsbereich Z-Klemme (mm) 50 – 700 (Pfeifer); 0 – 900 (xArm6)
UDP-Zielport 8888 (rechte Hand) / 8889 (linke Hand)
Python-Server (teleoperation_main.py)
CONTROL_HZ 30 Hz – Roboterbefehlsrate; Anpassung an die Servorate
QUEUE_MAXSIZE 3 – zwischen Empfänger- und Controller-Threads gepufferte Frames
piper_controller.py (AgileX Piper)
SPEED_PERCENT 25 % – maximaler Gelenkgeschwindigkeitsanteil; schrittweise erhöhen
X_MIN / X_MAX (mm) −400 / +400
Y_MIN / Y_MAX (mm) −400 / +400
Z_MIN / Z_MAX (mm) 50 / 700
GRIPPER_MAX_UM (µm) 70 000 – 70 mm physische Öffnung
SDK-Positionseinheiten Mikrometer (Ganzzahl) – mm-Werte mit 1.000 multiplizieren
SDK-Orientierungseinheiten Milligrad (Ganzzahl) – Gradwerte mit 1.000 multiplizieren
CAN-Schnittstelle can0 (Standard) – vor der Ausführung mit can_activate.sh aktivieren

Kompatible Waffen bei SVRC

Arm DOF SDK/Schnittstelle Controller-Datei Status
AgileX Piper 6 piper_sdk · CAN über USB piper_controller.py Produktionsbereit
OpenArm 7 SocketCAN / ROS 2 MoveIt2 openarm_controller.py Beta
DK1 Bimanual-Kit Dual 6 Ports 8888 + 8889 gleichzeitig dk1_controller.py Beta
VLAI L1 Dual 6 ROS 2-Brücke · TCP/IP vlai_l1_controller.py In der Entwicklung

Softwareanforderungen

Quest 3 / Einheitsseite
Einheit 2022.3 LTS oder höher
XR Hands-Paket com.unity.xr.hands ≥ 1,3
OpenXR-Plugin com.unity.xr.openxr ≥ 1.9
Meta XR SDK Optional, aber für Passthrough empfohlen
Handverfolgungsmodus In den Quest-Systemeinstellungen aktiviert (Bewegungsverfolgung)
PC-/Python-Seite steuern
Python 3.10 oder höher (verwendet Union-Typ-Syntax)
piper_sdk pip install piper_sdk
Python-kann pip install python-can
CAN-Schnittstelle USB-zu-CAN-Adapter; aktiviert mit can_activate.sh can0 1000000
Nur Standardbibliothek Socket, Struktur, Warteschlange, Threading, Signal, Zeit

Bereit für Teleop?

Kehren Sie zur Einrichtungsanleitung zurück, um Ihr Quest 3 auf einen Roboterarm zu streamen, oder lesen Sie das vollständige Wiki für die vollständige Entwicklerreferenz.