Looking for a platform-independent solution? One that also takes care of data collection and training different methods from the same data?
Visit INCAR Robotics
ROS 1 ROS 2 ✨ ROS 2 Now Available

Quest2ROS

A Meta Quest app for robot teleoperation. Controller poses, velocities, and button inputs are published as ROS topics; haptic feedback can be sent back to the controllers.

Get on Meta Quest Store View on GitHub Privacy Policy
0.46mm
Mean position error
1-metre distance · 2,180 data points
82ms
Average latency
Across eight independent trials
71.86Hz
Mean publish rate
Averaged across all topics
6+2
Topics (pub + sub)

Controller data as ROS topics

The app connects to a ROS-TCP-Endpoint on the same network and begins publishing controller data immediately.

🎮

Dual Controller Tracking

6-DOF pose (position & orientation) for both left and right controllers streamed as PoseStamped messages.

💨

Velocity Streaming

Linear and angular velocities published as Twist messages, ready to pipe directly into your robot's motion stack.

🔘

Full Button Inputs

All buttons, thumbstick axes, trigger values, and finger-pressure data exposed via custom OVR2ROSInputs messages.

📳

Haptic Feedback

Subscribe to vibration commands with configurable frequency and amplitude to drive each controller independently.

🧭

Frame Calibration

Hold A+B or X+Y for 4 seconds to align the VR coordinate frame with your robot's reference frame. A haptic vibration confirms the calibration.

🌐

Local Network Only

Data is sent directly to the ROS-TCP-Endpoint on your own machine. No cloud relay involved.

Calibration to robot frame

Example usage on Franka Panda (10× speed)

Publishers & Subscribers

Six published topics — three per controller — plus two haptic feedback subscribers.

PUB Published (6 topics)
  • /right_hand/posegeometry_msgs/PoseStamped
  • /right_hand/twistgeometry_msgs/Twist
  • /right_hand/inputsquest2ros/OVR2ROSInputs
  • /left_hand/posegeometry_msgs/PoseStamped
  • /left_hand/twistgeometry_msgs/Twist
  • /left_hand/inputsquest2ros/OVR2ROSInputs
SUB Subscribed (2 topics)
  • /right_hand/haptic_feedbackquest2ros/OVR2ROSHapticFeedback
  • /left_hand/haptic_feedbackquest2ros/OVR2ROSHapticFeedback

Custom message fields:

# OVR2ROSInputs bool[] buttons float32[] thumbstick float32[] finger_pressure   # OVR2ROSHapticFeedback float32 frequency float32 amplitude

Setup

Requires the Quest app, the ROS-TCP-Endpoint, and both machines on the same network.

1

Install the Quest app

Download Quest2ROS from the Meta Quest Store onto your headset.

2

Clone the packages

Clone the main branch and the standard ROS-TCP-Endpoint into your catkin workspace.

$cd ~/catkin_ws/src $git clone https://github.com/Quest2ROS/quest2ros.git $git clone https://github.com/Unity-Technologies/ROS-TCP-Endpoint.git
3

Build the workspace

$cd ~/catkin_ws && catkin build $source devel/setup.bash
4

Launch the TCP endpoint

Start the endpoint on your Ubuntu machine. Note your local IP address.

$roslaunch ros_tcp_endpoint endpoint.launch tcp_ip:=YOUR_IP tcp_port:=10000
5

Connect from your Quest

Open Quest2ROS, select ROS 1, enter the machine IP and port 10000, and tap Connect.

6

Calibrate the frame

Press A+B (right) or X+Y (left) simultaneously to align the VR frame with your robot's reference frame.

If you use Quest2ROS

Please cite the workshop paper:

Michael C. Welle, Nils Ingelhag, Martina Lippi, Maciej Wozniak, Andrea Gasparri, Danica Kragic.
Quest2ROS: An App to Facilitate Teleoperating Robots.
7th International Workshop on Virtual, Augmented, and Mixed-Reality for Human-Robot Interactions, 2024.

@inproceedings{welle2024quest2ros,   title = {Quest2ROS: An App to Facilitate Teleoperating Robots},   author = {Welle, Michael C and Ingelhag, Nils and Lippi, Martina and             Wozniak, Maciej and Gasparri, Andrea and Kragic, Danica},   booktitle = {7th International Workshop on Virtual, Augmented, and             Mixed-Reality for Human-Robot Interactions},   year = {2024} }
Download preprint (PDF)