Skip to content

feat(robot): Go2 fleet support for multi-robot control#1487

Merged
paul-nechifor merged 14 commits intodevfrom
ruthwik/feat/go2_fleet
Mar 8, 2026
Merged

feat(robot): Go2 fleet support for multi-robot control#1487
paul-nechifor merged 14 commits intodevfrom
ruthwik/feat/go2_fleet

Conversation

@ruthwikdasyam
Copy link
Contributor

@ruthwikdasyam ruthwikdasyam commented Mar 7, 2026

Problem

  • No support for controlling multiple Go2 robots simultaneously
  • Go2 startup was missing activation, robot doesn't move after stand_up()
  • No feat to turn obstacle avoidance OFF

Solution

  • Added Go2FleetConnection extending GO2Connection - first IP is the primary robot (provides sensor streams), additional robots receive broadcast commands (move, standup, liedown)
  • Added ROBOT_IPS env var via GlobalConfig.robot_ips (comma-separated), following the same pattern as ROBOT_IP for single robot
  • Added balance_stand() and disable_obstacle_avoidance() to Go2ConnectionProtocol
  • Added configurable obstacle avoidance (DISABLE_OBSTACLE_AVOIDANCE=true) to Go2 startup

Breaking Changes

GO2Connection.start() now calls balance_stand() after standup with a 3s delay. Previously it only called standup(). May affect any timout checks (if)

How to Test

  • ROBOT_IPS=10.0.0.102,10.0.0.209 dimos run unitree-go2-fleet

  • dimos run unitree-go2-basic (robot can move - balance_stand() method unfreezes robot)

  • Phone teleop blueprint to control all go2's ROBOT_IPS=10.0.0.152,10.0.0.102 dimos run phone-go2-fleet-teleop

Contributor License Agreement

  • I have read and approved the CLA.

FUTURE WORK can be to map an env with multiple go2's together - spawning them in rerun and sharing the map. This PR just addresses blind go2 fleet control.

@ruthwikdasyam ruthwikdasyam marked this pull request as ready for review March 7, 2026 23:56
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 8, 2026

Greptile Summary

This PR adds multi-robot fleet support for the Unitree Go2 by introducing Go2FleetConnection, a new unitree-go2-fleet blueprint, and ROBOT_IPS/DISABLE_OBSTACLE_AVOIDANCE env vars. It also fixes a single-robot startup regression by adding a balance_stand() call after standup().

Key Issues:

  1. Broadcast commands lack error isolation (move, standup, liedown): List comprehensions without try/except means one failing robot stops the entire operation and leaves remaining robots unaddressed. Critical for liedown() which serves as emergency stop.

  2. Exception from extra connections silences primary (publish_request): Extra robots are processed first; any exception prevents the primary from receiving commands. Since publish_request underlies most commands, a single unreliable secondary robot can block the primary.

  3. Duplicate connections on repeated start(): _extra_connections is never reset, so calling start() twice appends new connections, causing duplicate commands to each robot.

  4. WebRTC thread leak on stop(): UnitreeWebRTCConnection.stop() only cancels the timer; the background event loop and thread are left running. The correct full teardown is disconnect(). This leaks a thread per extra robot on fleet shutdown.

  5. Blocking RPC handler with time.sleep(3): The hardcoded sleep in GO2Connection.start() blocks the entire RPC handler thread, delaying all other operations during startup.

The core fleet broadcast design is sound, but error handling and resource cleanup must be fixed before this PR is safe to merge.

Confidence Score: 1/5

  • Not safe to merge — critical error handling and resource cleanup issues in fleet broadcast operations create operational reliability and safety risks.
  • Five verified issues of high severity: (1) broadcast commands lack per-robot error isolation, so one failing extra robot prevents remaining robots from receiving commands, critical for emergency stop scenarios; (2) exceptions from extra connections silently prevent the primary robot from receiving commands; (3) _extra_connections grows unbounded on repeated start() calls; (4) WebRTC background threads leak on stop(); (5) blocking sleep in RPC handler delays all operations during startup. The fleet_connection.py file requires fixes to all broadcast methods and the stop() teardown path before this can be deployed reliably.
  • dimos/robot/unitree/go2/fleet_connection.py requires fixes to all broadcast methods (move, standup, liedown, publish_request), the start() idempotency guard, and proper disconnect() cleanup in stop(); dimos/robot/unitree/go2/connection.py requires moving the 3-second delay out of the RPC handler.

Last reviewed commit: 37fedd3

@paul-nechifor paul-nechifor merged commit 839681d into dev Mar 8, 2026
12 checks passed
@spomichter spomichter mentioned this pull request Mar 11, 2026
1 task
spomichter added a commit that referenced this pull request Mar 12, 2026
Release v0.0.11

82 PRs, 10 contributors, 396 files changed.

This release brings a production CLI, MCP tooling, temporal memory, and first-class support for coding agents. Dask has been removed. The entire stack now runs from `dimos run` through `dimos stop`.

### Agent-Native Development

DimOS is now built to be driven by coding agents. Point OpenClaw, Claude Code, or Cursor at [AGENTS.md](AGENTS.md) and they can build, run, and debug Dimensional applications using the CLI and MCP interfaces directly.

- **AGENTS.md** — comprehensive onboarding doc: architecture, CLI reference, skill rules, blueprint quick-reference. Your agent reads this and starts coding.
- **MCP server** — all `@skill` methods exposed as HTTP tools. External agents call `dimos mcp call relative_move --arg forward=0.5` or connect via JSON-RPC.
- **MCP CLI** — `dimos mcp list-tools`, `dimos mcp call`, `dimos mcp status`, `dimos mcp modules`
- **Agent context logging** — MCP tool calls and agent messages logged to per-run JSONL for debugging and replay.

### CLI & Daemon

Full process lifecycle — no more Ctrl-C in tmux.

- `dimos run --daemon` — background execution with health checks and run registry
- `dimos stop [--force]` — graceful shutdown with SIGTERM → SIGKILL fallback
- `dimos restart` — replays the original CLI arguments
- `dimos status` — PID, blueprint, uptime, MCP port
- `dimos log -f` — structured per-run logs with follow, JSON output, filtering
- `dimos show-config` — resolved GlobalConfig with source tracing

### Temporal-Spatial Memory

Robots in physical space ingest hours of video and lidar. Temporal-spatial memory gives them a human-like understanding of the world — causal object relationships, entity tracking through time and physical space, and the ability to answer complex temporal queries:

*Who spends the most time in the kitchen? What time on average do I wake up? Which set of switches toggles the main lights? Who was at the office at 9am last Thursday?*

Traditional frame-level embeddings (CLIP, ViT) lose temporal context and don't scale beyond a handful of frames. Video transformers are expensive and don't operate in RGB-D. Dimensional agents work with video + lidar natively, tracking entities across hours and days.

```bash
dimos --replay --replay-dir unitree_go2_office_walk2 run unitree-go2-temporal-memory
```

### Interactive Viewer

Custom Rerun fork (`dimos-viewer`) is now the default. Click-to-navigate: click a point in the 3D view → PointStamped → A* planner → robot moves.

- Camera | 3D split layout on Go2, G1, and drone blueprints
- Native keyboard teleop in the viewer
- `--viewer rerun|rerun-web|rerun-connect|foxglove|none`

### Drone Support

Drone blueprints modernized to match Go2 composition pattern. `drone-basic` and `drone-agentic` work with replay, Rerun, and the full CLI.

```bash
dimos --replay run drone-basic
dimos --replay run drone-agentic
```

### More

- **Go2 fleet control** — multi-robot with `--robot-ips` (#1487)
- **Replay `--replay-dir`** — select dataset, loops by default (#1519, #1494)
- **Interactive install** — `curl -fsSL .../install.sh | bash` (#1395)
- **Nix on non-Debian Linux** (#1472)
- **Remove Dask** — native worker pool (#1365)
- **Remove asyncio dependency** (#1367)
- **Perceive loop** — continuous observation module for agents (#1411)
- **Worker resource monitor** — `dtop` TUI (#1378)
- **G1 agent wiring fix** (#1518)
- **Rerun rate limiting** — prevents viewer OOM on continuous streams (#1509, #1521)
- **RotatingFileHandler** — prevents unbounded log growth (#1492)
- **Test coverage** (#1397), draft PR CI skip (#1398), manipulation test fixes (#1522)

### Breaking Changes

- `--viewer-backend` renamed to `--viewer`
- Dask removed — blueprints using Dask workers need migration to native worker pool
- Default viewer changed from `rerun-web` to `rerun` (native dimos-viewer)

### Contributors

@spomichter, @PaulNechifor, @ruthwikdasyam, @summeryang, @MustafaBhadsorawala, @leshy, @sambull, @JeffHykin, @RadientBrain

## Contributor License Agreement

- [x] I have read and approved the [CLA](https://github.com/dimensionalOS/dimos/blob/main/CLA.md).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants