zeroruntime-teleops
Drive any robot over the internet, and know exactly what the operator was looking at when they moved it.
A WebRTC transport for robot teleoperation, with frame-accurate observation/action correlation, a safety envelope that cannot be bypassed, and a recorder that turns every session into training data.
Install
pip install zeroruntime-teleops # transport + cameras, ready to run
pip install "zeroruntime-teleops[lerobot]" # + the lerobot adapters
Your robot, in three methods
Everything else is inherited: lease negotiation, clamping, the watchdog, the e-stop latch, correlation, recording.
from zeroruntime.teleops import Follower, SafetyConfig, single_group_descriptor
class MyArm(Follower):
def descriptor(self): return single_group_descriptor(...)
def read_joints(self): return {"shoulder": 12.4, "elbow": -3.1}
def write_joints(self, joints): ... # RAISE on failure
MyArm("abcd-efgh-ijkl", safety=SafetyConfig(slew=0.75)).run(hz=200)
Already on lerobot? Wrap the device instead of subclassing:
from zeroruntime.teleops.adapters.lerobot import (SO101FollowerAdapter,
SO101LeaderAdapter)
follower = SO101FollowerAdapter("abcd-efgh-ijkl", robot=arm, token=TOKEN)
Run it locally, no robot needed
Runnable examples live in zrt-teleops-examples:
git clone https://github.com/ZeroRuntimeAI/zrt-teleops-examples
cd zrt-teleops-examples
python quickstart/remote_teleop.py --ticks 100 # full chain, in-process
python quickstart/my_arm.py # port your own arm
python quickstart/protocol_demo.py # the correlation model, live
remote_teleop.py runs a real follower against a real leader: real gates,
real clamps, real correlation. Only the network is swapped for a loopback.
Safety
SafetyConfig(
slew=0.75, # max change per joint per TICK:
# at the default 200 Hz that is
# 150 units/s, a full sweep in ~1.3 s
watchdog_timeout_s=0.5, # silence for this long -> failsafe
max_staleness_ms=100.0, # older commands are dropped
require_deadman=True,
on_starvation=FailsafeAction.HOLD,
resume_requires_reclaim=False)
Every command is checked before it reaches the motors: who sent it, whether it arrived too late, and how far it moves the arm. If the operator stops sending, the arm holds where it is.
Recording
follower.start_recording("./sessions")
follower.start_episode("pick up the cube")
... # your loop runs
follower.end_episode(success=True)
follower.stop_recording()
On the follower this captures pixels before an encoder or a network touched them. Episodes open and close on the deadman by default.
VideoSDK can also record the session in the cloud:
follower = MyArm("abcd-efgh-ijkl", cloud_recording=True)
follower.cloud_recording_state # idle / requested / starting / ready / failed
If the cloud recorder never comes up, recording carries on locally and the state says so.
Documentation
Full documentation at docs.zeroruntime.ai.
Apache-2.0 · docs.zeroruntime.ai · examples
Release files for zeroruntime-teleops 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zeroruntime_teleops-0.1.1-py3-none-manylinux_2_34_x86_64.whl | Python 3 | none | Linux glibc 2.34+ x86-64 | Details |
| zeroruntime_teleops-0.1.1-py3-none-manylinux_2_34_aarch64.whl | Python 3 | none | Linux glibc 2.34+ ARM64 | Details |
| zeroruntime_teleops-0.1.1-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 24.9 MB
Release files / zeroruntime_teleops-0.1.1-py3-none-manylinux_2_34_x86_64.whl
| Download URL | zeroruntime_teleops-0.1.1-py3-none-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 9.7 MB |
| Tags | Linux glibc 2.34+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
c79f5a470e392f47da0157c03ecc4734511f2d300c09eee70da693cb0f313e31
|
|
BLAKE2b-256 checksum How to use checksums |
296229efec95aef41ece0fa13b6f6bb872074cbe912e14e6fdbf5bd71655014f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / zeroruntime_teleops-0.1.1-py3-none-manylinux_2_34_aarch64.whl
| Download URL | zeroruntime_teleops-0.1.1-py3-none-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 9.4 MB |
| Tags | Linux glibc 2.34+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
91587a9b907bd8527c590c423b5c51fb2794085d79d46a46202ceace32a13cb1
|
|
BLAKE2b-256 checksum How to use checksums |
a77d8a31d1b0beba90aad0318d2c6c4a23602b402cc86246d799cd24722fc4ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / zeroruntime_teleops-0.1.1-py3-none-macosx_11_0_arm64.whl
| Download URL | zeroruntime_teleops-0.1.1-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.8 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
68f8e7aeac5ad2674fa79375477151838cbb4ce8a900aaeeb5b8a358c451125c
|
|
BLAKE2b-256 checksum How to use checksums |
572ea10c071b6e13602a063964047e8b42a7ed8129b3ee07cebbbb3af63f16f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|