Imported hardware project from GitHub.
Loading README and project media…
Robot-teleop system: watch a robot arm live, "insert coin" to take control.
A player watches a TOM robot arm over live video, joins a queue, and takes a turn driving it. The operator (sender) side is the web app; the robot (receiver) side runs on the Pi next to the arm.
| Path | What |
|---|---|
client/ | Next.js web app — the operator UI (LiveKit video + queue + teleop). |
robot/ | The robot-side teleop stack (Python) — control core + sim, real-arm teleop, the LiveKit camera publisher + control bridge, and calibration. See robot/README.md. |
edge/ | Early robot-side stub (test-pattern camera + teleop logger). Superseded by robot/. |
tools/ | Standalone, no-build debug utilities (livekit_viewer.html sender, latency_probe.py). |
The teleop stack lives in robot/ and runs as python -m tomctl.<x> from that directory:
cd robot
python -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m tomctl.control --web # local sim in a browser
.venv/bin/python -m tomctl.remote_sim --arms arm1 arm2 --room tom-sim # remote sim (no hardware)
Full guides: robot/OPERATIONS.md (the Local/Remote × Sim/Real grid) and
robot/REMOTE_CONTROL.md (the LiveKit wire protocol for senders).
cd client
npm install
npm run dev # http://localhost:3000
Copy client/.env.example → client/.env.local and fill in the LiveKit
credentials: local dev points at the robot Pi's LiveKit over insecure ws://
(works from next dev; an https deploy can't open ws://), while a production
deploy uses LiveKit Cloud over wss:// with the same env var names set on the
host (e.g. Vercel). See client/AGENTS.md for the (non-standard Next.js)
conventions.
robot/lerobot/, a vendored subset of
HuggingFace LeRobot, which remains
Apache-2.0 (© The HuggingFace Inc. team).