Skip to main content

Teleop

Transform your phone into a robot arm teleoperation device in three simple steps:

  1. Install and launch the server on your computer.
  2. Open the provided URL on your phone.
  3. Tap Start, then press and hold the Move button 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.

Lite6 Physical Teleoperation UR5e Webots Teleoperation
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:

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_description topic
  • 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

Metadata

Release files for teleop 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for teleop 0.1.5
File Size Uploaded
teleop-0.1.5.tar.gz 44.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for teleop 0.1.5
File Interpreter ABI Platform
teleop-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 86.6 kB

Release files / teleop-0.1.5.tar.gz

Download URL teleop-0.1.5.tar.gz
Size 44.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9f5367b167e0f67abe818f346c467671bd2c1ad653df604bdfb2fa69b2937da9
BLAKE2b-256 checksum
How to use checksums
87dc312c19122c8e64fcff16dc8a74659b84ba8a7bcd3ef7b3c330cfc65a2a29
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.

Transparency log

Release files / teleop-0.1.5-py3-none-any.whl

Download URL teleop-0.1.5-py3-none-any.whl
Size 42.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
75c3e63bb9eed1ea8ca32b48086cea45fa5ae3eb022dd0dcf0d615cf0b0d58dc
BLAKE2b-256 checksum
How to use checksums
f2d145c79fcbf2551f2035c375e81d560c4ac46a5bbdb1622583b559eedcfc4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page