Turns your phone into a robot arm teleoperation device by leveraging the WebXR API
Project description
Transform your phone into a robot arm teleoperation device in three simple steps:
- Install and launch the server on your computer.
- Open the provided URL on your phone.
- Tap
Start, then press and hold theMovebutton to control the robot arm.
[!IMPORTANT]
Your phone has to support the WebXR API. Unfortunately, the iPhone doesn't support the WebXR API.
The web application leverages the WebXR API, which combines your phone’s sensors to detect its orientation and position in 3D space. The server receives this data and sends it to the robot arm controller.
| Teleoperation of a physical Lite6 robot | Teleoperation of a simulated UR5e robot in Webots |
Installation
The package is available on PyPI. You can install it using pip:
pip install teleop
Usage
We provide some ready-to-use robot arm interfaces, but you can also create your own by incorporating the teleop.Teleop class into your project.
Basic Interface
A simple interface that prints the teleop responses. You can use it as a reference to build your own interface.
python -m teleop.basic
xArm
Interface to teleoperate the uFactory Lite 6 robot. Minor changes are probably necessary to support other xArm robots.
python -m teleop.xarm
Note that the interface is very simple, it doesn't implement any kind of filtering. Therefore, you probably want to teleoperate it with a device with high frequency. Smart phones are typically 30fps while VR joysticks 90fps which is much more preferable for teleoperation without filtering.
ROS 2 Interface
The ROS 2 interface is designed primarily for use with the cartesian_controllers package, but it can also be adapted for MoveIt Servo or other packages.
python -m teleop.ros2
Published topics:
target_frame(geometry_msgs/PoseStamped): The target pose of the robot arm’s end effector in the robot base frame.tf(tf2_msgs/TFMessage): The transform between the robot base frame and the target frame for visualization.
Subscribed topics:
current_pose(geometry_msgs/PoseStamped): The current pose of the robot arm’s end effector in the robot base frame. Used to update the reference pose.
You can override the default topic names using standard ROS 2 arguments:
python -m teleop.ros2 --ros-args -r target_frame:=/some_other_topic_name
ROS 2 Interface with IK
No servoing support, no problem.
teleop provides servoing support through the JacobiRobotROS util class.
Panda arm usage example:
python -m teleop.ros2_ik \
--joint-names panda_joint1 panda_joint2 panda_joint3 panda_joint4 panda_joint5 panda_joint6 panda_joint7 \
--ee-link panda_hand \
--ros-args -r /joint_trajectory:=/panda_arm_controller/joint_trajectory
xArm usage example:
python -m teleop.ros2_ik \
--joint-names joint1 joint2 joint3 joint4 joint5 joint6 \
--ee-link link6 \
--ros-args -r /joint_trajectory:=/joint_trajectory_controller/joint_trajectory
Custom Interface
For most applications, you will need to create a custom interface to interact with your robot arm. Here’s an example:
import numpy as np
from teleop import Teleop
def callback(pose: np.ndarray, message: dict) -> None:
"""
Callback function triggered when pose updates are received.
Arguments:
- np.ndarray: A 4x4 transformation matrix representing the end-effector target pose.
- dict: A dictionary containing additional information.
"""
print(f'Pose: {pose}')
print(f'Message: {message}')
teleop = Teleop()
teleop.subscribe(callback)
teleop.run()
Examples
Explore the examples to learn how to use the package in various scenarios:
- examples/webots: Teleoperation of a UR5e robot arm using ikpy in the Webots simulator.
Utils
The package includes several utility classes to simplify robot arm integration:
[!NOTE]
To use the utility classes, install the package with the additional dependencies:pip install teleop[utils]
JacobiRobot
A Pinocchio-based servoing and kinematics for robotic manipulators.
Key Features:
- Forward/inverse kinematics using Pinocchio
- Pose-based servo control with velocity/acceleration limits
- Real-time 3D visualization
- Joint-level control and monitoring
Usage:
from teleop.utils.jacobi_robot import JacobiRobot
robot = JacobiRobot("robot.urdf", ee_link="end_effector")
target_pose = np.eye(4) # 4x4 transformation matrix
reached = robot.servo_to_pose(target_pose, dt=0.01)
JacobiRobotROS
ROS 2 wrapper for JacobiRobot that integrates with standard ROS 2 topics and messages.
Key Features:
- Automatic URDF loading from
/robot_descriptiontopic - Joint state subscription and trajectory publishing
- Compatible with
joint_trajectory_controller - Seamless integration with existing ROS 2 control stacks
Usage:
from teleop.utils.jacobi_robot_ros import JacobiRobotROS
import rclpy
rclpy.init()
node = rclpy.create_node("robot_control")
robot = JacobiRobotROS(
node=node,
ee_link="end_effector",
joint_names=["joint1", "joint2", "joint3"]
)
robot.reset_joint_states() # Wait for initial joint states
reached = robot.servo_to_pose(target_pose, dt=0.03)
| Topic | Type | Message Type | Description |
|---|---|---|---|
/joint_states |
Subscribed | sensor_msgs/JointState | Current joint positions and velocities |
/robot_description |
Subscribed | std_msgs/String | URDF robot description |
/joint_trajectory_controller/joint_trajectory |
Published | trajectory_msgs/JointTrajectory | Joint trajectory commands for robot control |
Development
If you’d like to contribute, install the package in editable mode:
# Install the package in editable mode
git clone https://github.com/SpesRobotics/teleop.git
cd teleop
pip install -e .
# Run the tests
python -m pytest
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-0.1.4.tar.gz.
File metadata
- Download URL: teleop-0.1.4.tar.gz
- Upload date:
- Size: 44.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5cedcff336c612a3f7e6f93e379e24979ed42070903b722f5fefe07c8fca3ce
|
|
| MD5 |
ecbaff2d2b18de74665e89b383473880
|
|
| BLAKE2b-256 |
ec8c902ef4c0fa148325e6b19a5af63c3aac5927c67551efabcd5732fc446c6d
|
Provenance
The following attestation bundles were made for teleop-0.1.4.tar.gz:
Publisher:
python-publish.yml on SpesRobotics/teleop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
teleop-0.1.4.tar.gz -
Subject digest:
b5cedcff336c612a3f7e6f93e379e24979ed42070903b722f5fefe07c8fca3ce - Sigstore transparency entry: 748784033
- Sigstore integration time:
-
Permalink:
SpesRobotics/teleop@2226b84cc11e6b9c500ff53f01e671bac686582a -
Branch / Tag:
refs/tags/0.1.4 - Owner: https://github.com/SpesRobotics
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2226b84cc11e6b9c500ff53f01e671bac686582a -
Trigger Event:
release
-
Statement type:
File details
Details for the file teleop-0.1.4-py3-none-any.whl.
File metadata
- Download URL: teleop-0.1.4-py3-none-any.whl
- Upload date:
- Size: 42.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b8013947b27b89dbce50f9231a57d29f2e59ea864807b1ce6611ea3ad1694f4
|
|
| MD5 |
ed70baf40938a9f0058e1b7dca71a04c
|
|
| BLAKE2b-256 |
b09c217176617df23f634b0388111adbeb17ccb0409072639a97512e6c1c818d
|
Provenance
The following attestation bundles were made for teleop-0.1.4-py3-none-any.whl:
Publisher:
python-publish.yml on SpesRobotics/teleop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
teleop-0.1.4-py3-none-any.whl -
Subject digest:
6b8013947b27b89dbce50f9231a57d29f2e59ea864807b1ce6611ea3ad1694f4 - Sigstore transparency entry: 748784035
- Sigstore integration time:
-
Permalink:
SpesRobotics/teleop@2226b84cc11e6b9c500ff53f01e671bac686582a -
Branch / Tag:
refs/tags/0.1.4 - Owner: https://github.com/SpesRobotics
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2226b84cc11e6b9c500ff53f01e671bac686582a -
Trigger Event:
release
-
Statement type: