File size: 5,555 Bytes
700dd75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# Interface Manager (All-In-One)

Dynamically switch between keyboard, gamepad, and ZMQ input interfaces at runtime using hotkeys (`--input-type manager`). The manager owns all interfaces simultaneously and delegates to the currently active one. You can switch at any time without restarting the program.

```{admonition} Prerequisites
:class: note
Complete the [Quick Start](../getting_started/quickstart.md) to have the sim2sim loop running.
```

```{admonition} Emergency Stop
:class: danger
Press **`O`** at any time to immediately stop control and exit — this works regardless of which interface is active, including when the gamepad is selected. Always keep a hand near the keyboard ready to press **`O`**.
```

## Launch

**Sim2Sim (MuJoCo):**

```bash
# Terminal 1 — MuJoCo simulator (from repo root)
source .venv_sim/bin/activate
python gear_sonic/scripts/run_sim_loop.py

# Terminal 2 — C++ deployment (from gear_sonic_deploy/)
bash deploy.sh --input-type manager sim
```

**Real Robot:**

```bash
# From gear_sonic_deploy/
bash deploy.sh --input-type manager real
```

If you plan to use the ZMQ interface, add ZMQ flags:

```bash
bash deploy.sh --input-type manager \
  --zmq-host <publisher-ip> \
  --zmq-port 5556 \
  --zmq-topic pose \
  sim
```

## Step-by-Step

1. The manager starts in **Keyboard** mode by default.
2. Press **`]`** to start the control system (keyboard mode). Use the robot as described in the [Keyboard tutorial](keyboard.md).
3. To switch to gamepad, press **`Shift+2`** (types `@`). The terminal prints `Switched to: GAMEPAD (safety reset triggered)`. The robot returns to reference motion at frame 0 and the planner is disabled.
4. Use the gamepad controls as described in the [Gamepad tutorial](gamepad.md).
5. To switch to ZMQ streaming, press **`Shift+3`** (types `#`). A safety reset is triggered and the terminal prints `Switched to: ZMQ`. Use the ZMQ controls as described in the [ZMQ tutorial](zmq.md).
6. To switch back to keyboard at any time, press **`Shift+1`** (types `!`).
7. Press **`O`** to stop control and exit from any interface.

## Switching Interfaces

| Hotkey | Interface | Notes |
|--------|-----------|-------|
| **Shift+1** (`!`) | Keyboard | Default. Full keyboard controls (Normal + Planner modes). See [Keyboard tutorial](keyboard.md). |
| **Shift+2** (`@`) | Gamepad | Unitree wireless gamepad. See [Gamepad tutorial](gamepad.md). |
| **Shift+3** (`#`) | ZMQ | ZMQ streaming (requires `--zmq-host` etc.). See [ZMQ tutorial](zmq.md). |

```{tip}
A **ROS2** interface is also available via **Shift+4** (`$`) when built with ROS2 support. It requires the planner to be loaded and falls back to Keyboard otherwise. The ROS2 interface is provided as a reference implementation for building custom ROS2-based control pipelines and may not receive the same level of updates as the other interfaces.
```

### What Happens When You Switch

Each switch triggers a **safety reset** on **all** managed interfaces (not just the one you're switching to). This:

- Disables the planner and returns to reference motion at frame 0
- Resets heading and movement states
- Disables ZMQ streaming (if it was active)
- Prevents control discontinuities from stale state in the previous interface

The safety reset ensures you always start from a clean state after switching, regardless of what the previous interface was doing.

```{note}
All four interfaces are created at startup and stay alive across switches. Their internal state (e.g., gamepad mode, ZMQ connection) is preserved — only the planner/motion state is reset for safety. This means you don't need to re-establish the ZMQ connection or re-pair the gamepad when switching back.
```

## Global Controls

These controls work at the manager level, **regardless of which interface is active**. They are intercepted by the manager before being passed to the active interface.

### Emergency Stop

| Key | Action |
|-----|--------|
| **O** / **o** | Immediate emergency stop — works even when gamepad or ZMQ is the active interface |
| **F** / **f** | Report motor temperatures (TTS voice alert) |

### Compliance Controls

These adjust hand compliance and grasp parameters globally. They are especially useful during teleoperation (ZMQ / ROS2) where the robot's hands interact with objects.

| Key | Action |
|-----|--------|
| **G** / **H** | Increase / Decrease left hand compliance by 0.1 |
| **B** / **V** | Increase / Decrease right hand compliance by 0.1 |
| **X** / **C** | Increase / Decrease max hand close ratio by 0.1 |

```{note}
Compliance controls are global — they affect the robot's hands no matter which interface is active. This lets you adjust compliance from the keyboard even while the gamepad or ZMQ is controlling the robot's movement.
```

## Interface-Specific Controls

Once an interface is active, all its normal controls work as documented in its own tutorial:

- **Keyboard** (`!`): All keys from the [Keyboard tutorial](keyboard.md) — T/R/P/N for motions, ENTER for planner, WASD for movement, etc.
- **Gamepad** (`@`): All buttons from the [Gamepad tutorial](gamepad.md) — Start, A/B, L1/R1, analog sticks, etc.
- **ZMQ** (`#`): ENTER to toggle streaming, T/P/N/R for reference motions when not streaming. See the [ZMQ tutorial](zmq.md).

The only exceptions are:
- **`O`** is always intercepted by the manager for emergency stop (not passed to the active interface).
- **`G/H/B/V/X/C`** are always intercepted for compliance control.
- **`!/@ /#/$`** are always intercepted for interface switching.