Turns your phone into a robot arm teleoperation device by leveraging the WebXR API
Project description
TeleopXR
TeleopXR transforms your VR/AR headset into a powerful, precise robot controller. It provides a lightweight, installation-free teleoperation interface with low-latency video streaming and full WebXR state tracking.
Key Features
- 🕶️ VR/Passthrough: Seamlessly switch between fully immersive VR and high-fidelity AR Passthrough modes, allowing you to choose between total focus and situational awareness.
- 📡 WebRTC Video Streaming: Get ultra-low latency, real-time video feedback directly in the headset, providing a near-instantaneous visual link to your robot's perspective.
- 🤖 Robot Visualization: Benefit from real-time 3D visualization of the robot model, ensuring your digital twin is always perfectly synchronized with the physical robot's state.
- 🕹️ Realtime Teleoperation based on Whole-Body IK: Achieve precise and intuitive control through advanced Whole-Body Inverse Kinematics, enabling complex coordination with minimal effort.
🚀 Quick Start (Demo)
Use the built-in demo to verify connectivity and visualize the XR state data in real-time.
Installation
Basic installation (teleop mode only):
pip install teleop-xr
With IK support:
The IK solver requires additional dependencies. Install with:
pip install teleop-xr
# Install IK dependencies from PyPI
pip install spatialmath-python>=1.1.15 gitpython>=3.1.46 xacro>=2.1.1 filelock>=3.20.3 viser>=1.0.21
# Install pyroki and ballpark from GitHub (not available on PyPI)
pip install git+https://github.com/chungmin99/pyroki.git
pip install git+https://github.com/chungmin99/ballpark.git
Note:
pyrokiandballparkare not available on PyPI, sopip install teleop-xr[ik]will not work. You must install them manually from GitHub as shown above.
Running the Demo
python -m teleop_xr.demo
Modes
The demo supports two operation modes:
- Teleop Mode (Default): Visualizes raw XR state data and button events.
python -m teleop_xr.demo --mode teleop
- IK Mode: Enables the high-performance IK solver (configured for Unitree H1 by default). Requires IK dependencies installed.
python -m teleop_xr.demo --mode ik
Usage
- Open the displayed URL (
https://<ip>:4443) in your headset. - Enter VR mode.
- Observe the live state data and event logs in your terminal.
📖 Documentation
For detailed guides on integrating TeleopXR into your own projects, including the Generic Python API and ROS2 Interface, please visit our official documentation website:
👉 https://qrafty-ai.github.io/teleop_xr/generic/
Development
For developers contributing to TeleopXR or customizing the frontend:
Prerequisites
- Python 3.10+ with pip
- uv (recommended for development)
- Node.js & npm (for WebXR frontend)
Setup
-
Clone the repository:
git clone https://github.com/qrafty-ai/teleop_xr.git cd teleop_xr
-
Install Python dependencies:
Option A: Using uv (recommended)
uv syncOption B: Using pip
pip install -e . # For IK support, install additional dependencies: pip install spatialmath-python>=1.1.15 gitpython>=3.1.46 xacro>=2.1.1 filelock>=3.20.3 viser>=1.0.21 pip install git+https://github.com/chungmin99/pyroki.git pip install git+https://github.com/chungmin99/ballpark.git
-
Build the WebXR frontend:
cd webxr npm install npm run build
(The build output will be used by the Python server)
-
Run from source:
# From the root directory # With uv: uv run python -m teleop_xr.demo # Or with pip: python -m teleop_xr.demo
Note on IK Dependencies
The IK solver requires pyroki and ballpark, which are not on PyPI. During development with uv, these are automatically installed from git. For pip-based installations, install them manually from GitHub as shown above.
Acknowledgments
This project is forked from SpesRobotics/teleop. We are grateful for their foundational work in creating a WebXR-based teleoperation solution.
We also leverage powerful libraries for robotics:
- Pyroki: For high-performance, differentiable Inverse Kinematics and collision checking.
- Ballpark: For robust collision geometry generation and sphere decomposition.
License
This project is licensed under the Apache License 2.0. See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file teleop_xr-1.0.6.tar.gz.
File metadata
- Download URL: teleop_xr-1.0.6.tar.gz
- Upload date:
- Size: 17.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a82dfeb46e3d1943ad2f329ec9456b0ed4a653e8c5a29af78a3ce8e6afb01cc6
|
|
| MD5 |
4aa5dee11121fad77fc51c39cbca0658
|
|
| BLAKE2b-256 |
0519a828ed02104d93a75b05464d200abe2963535f75f88424ab77ae0257d530
|
File details
Details for the file teleop_xr-1.0.6-py3-none-any.whl.
File metadata
- Download URL: teleop_xr-1.0.6-py3-none-any.whl
- Upload date:
- Size: 2.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61a451d415b85d5de25c2ed142287863f85fc478a051e8101517765d58d0079d
|
|
| MD5 |
63d7a8102ffd4e4618899c39a3647734
|
|
| BLAKE2b-256 |
e887858a724daa12704b337ef75362527085a3fea6d4816a35e9ada55482e243
|