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.

Prerequisites

Complete the Quick Start to have the sim2sim loop running.

Emergency Stop

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):

# 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 sim --input-type manager

Real Robot:

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

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

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

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.

  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.

  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.

  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.

Shift+2 (@)

Gamepad

Unitree wireless gamepad. See Gamepad tutorial.

Shift+3 (#)

ZMQ

ZMQ streaming (requires --zmq-host etc.). See ZMQ tutorial.

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

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 — T/R/P/N for motions, ENTER for planner, WASD for movement, etc.

  • Gamepad (@): All buttons from the Gamepad tutorial — 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.

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.