Meta Quest 3 VR Teleop
Turn a Meta Quest 3 headset into a real-time robot arm controller — no leader arm required. Hand-tracking pose streams over UDP to Python, then to any supported arm. Latency under 120 ms on Wi-Fi 6.
Headset → UDP → Robot Arm
The system is built around a one-way UDP bridge. The Unity app on the Quest 3 reads hand-tracking data and broadcasts binary pose packets over Wi-Fi. A Python server on the control PC receives those packets and forwards commands to the robot via its native SDK. No ROS, no middleware — just sockets.
VRHandPoseSender.cs
XR Hands subsystem
Binary packet · 45 bytes
~50 Hz
Safety validator
Bounded queue
Workspace clamping
Emergency stop
Real-time motion
The key architectural insight: only the robot controller module changes between arm models. The Quest 3 Unity app, the UDP protocol, and the Python server infrastructure are all arm-agnostic. Swapping from one arm to another requires replacing roughly 80 lines of Python.
Your Setup Journey
Follow these steps to go from a bare Quest 3 to your first live teleoperation session. Takes about 1–2 hours on a familiar system.
Network & Prerequisites
Put Quest 3 and the control PC on the same LAN; verify UDP ports 8888/8889 are open
Unity App Configuration
Set target PC IP, positionOffset, rotationOffset, and scaleFactor in the Inspector
Python Server & Dependencies
Install piper_sdk, activate the CAN interface, run teleoperation_main.py
piper_controller.py Walkthrough
Understand connect, set_pose, set_gripper, and emergency_stop before going live
Safety Validation & First Session
Dry-run at 25% speed, verify workspace bounds, run live teleoperation
Compatible Robot Arms
The modular controller pattern means only one Python file changes per arm. All arms share the same Quest 3 Unity app and UDP protocol.
AgileX Piper
6-DOF arm · CAN bus via USB adapter · piper_sdk Python library
Controller: piper_controller.py
Production-readyOpenArm
7-DOF arm · SocketCAN / ROS 2 MoveIt2 · community open-source
Controller: openarm_controller.py
BetaDK1 Bimanual Kit
Dual 6-DOF arms · uses port 8888 (right) and 8889 (left) simultaneously
Controller: dk1_controller.py
BetaVLAI L1
Dual 6-DOF humanoid arms · ROS 2 bridge over TCP/IP
Controller: vlai_l1_controller.py
In developmentTo add a new arm, implement a controller class with five methods — connect, disconnect, set_pose, set_gripper, emergency_stop — and swap the import in teleoperation_main.py. See the adapter interface guide.
System at a Glance
Guides & References
SVRC-curated content covering the full Quest 3 teleoperation stack.
Community
Have a question about Quest 3 teleoperation or want to share your setup?
Ask the Forum → Discord #vr-teleop →Pricing & Availability
Includes our pre-configured Unity teleop app and Python server scripts. No additional software license required.
Already own a Quest 3? Jump to setup to get the teleop app running.