# Run Teleop

> Launch the geniesim_teleop VR / Pico teleoperation loop (or the in-process image bridge) using the `geniesim teleop` CLI verb, typically inside the Genie Sim GUI Docker container. Trigger: When the user asks to "start teleop", "run teleop", "启动遥操作", "VR 采集", "遥操作采集", "drive the robot with the VR headset", "launch the teleop loop", or wants to run anything under `geniesim_teleop`.

- Skill: `agibottech/run-teleop` (Agent Skill)
- Install (CLI): `npx skillmds@latest add agibottech/run-teleop`
- Raw SKILL.md: https://api.skillmd.com/api/skills/agibottech/run-teleop/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: MPL-2.0
- Author: agibottech (https://skillmd.com/u/agibottech)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/agibottech/run-teleop

---


## When to Use

- User wants to teleoperate the simulated robot with a VR device (Pico) and
  optionally record episodes.
- User references `geniesim_teleop`, `teleop.py`, or the teleop bridge.

Do **not** use for:
- Running a benchmark task → `run-benchmark`.
- Verifying an inference server → `check-inference`.

## Critical Patterns

1. **The runtime needs ROS 2 + Isaac Sim on the host.** Inside the
   Genie Sim Docker image (`geniesim docker up` → `geniesim docker into`)
   that's already set up. Outside the container, source your ROS overlay
   and have Isaac Sim available.
2. **A VR device must be reachable.** The teleop loop opens a VR server
   (default port `8080`) and waits for the Pico headset to connect.
3. **Working directory**: anywhere under the repo works — the CLI uses
   `find_spec` to locate the `geniesim_teleop` package.
4. **Confirm before launching.** Teleop holds a GPU and a live device
   connection; ask before kicking it off if there's any ambiguity.

## Workflow

### Step 1 — Collect inputs

Ask via `AskUserQuestion` (all optional — sensible defaults exist):
- **Device type** (default `pico`).
- **VR port** (default `8080`).
- **Robot config** (default `G2_omnipicker.json`).
- **gRPC client host** (default `localhost:50051`).

### Step 2 — Launch the teleop loop

Inside the GUI container (`geniesim docker into`):

```bash
geniesim teleop run --device_type=pico --port=8080
```

With explicit overrides:

```bash
geniesim teleop run \
    --client_host=localhost:50051 \
    --port=8080 \
    --robot_cfg=G2_omnipicker.json \
    --device_type=pico
```

### Step 3 — (optional) Image bridge

If the user needs the in-process image pub/sub bridge:

```bash
geniesim teleop bridge --mode inprocess
```

## Commands (copy-paste summary for the user)

```bash
# Terminal A — host (start GUI container)
cd /path/to/main
./scripts/start_gui.sh

# Terminal B — host, then container
cd /path/to/main
./scripts/into.sh
# inside container:
geniesim teleop run --device_type=pico --port=8080
```

## Notes

- If `geniesim` isn't on `$PATH`, substitute `python3 -m geniesim_cli teleop …` — same args.
- Any unknown `--flag` after the subcommand is forwarded verbatim to
  `geniesim_teleop.teleop` / `geniesim_teleop.bridge`.
- Robot init states are loaded from the `geniesim_benchmark` package when
  it's installed; if it isn't, teleop still runs (init-state loading is
  skipped with a warning).

