Skip to content

strands-labs/robots roadmap | v0.3.8 → v0.3.9 → v0.4.0 #94

@cagataycali

Description

@cagataycali

📌 Pinned roadmap — tracks where every open PR and issue lands across the next two releases.

Current: v0.3.8 — released 2026-02-23
Next: v0.3.9 — simulation foundation + GR00T N1.7
Target: v0.4.0Robot Mesh (fleet coordination over Zenoh) + Newton & Isaac Sim backends


TL;DR

Version Theme Status Key PRs & Issues
v0.3.8 Foundation ✅ Shipped 2026-02-23
v0.3.9 Simulation + GR00T N1.7 🔜 #83#84#85#86#87#93
v0.4.0 Robot Mesh + Newton + Isaac Sim 🎯 #48, #52, #96, #97, #98

v0.3.9 — "The 5-line promise"

After this ships, pip install strands-robots[sim] is the fastest path from zero to a robot arm grasping a cube in MuJoCo. GR00T N1.7 support lands in the same release so real-hardware users get the latest Cosmos-Reason2-2B backbone.

What the user gets

# ═══════════════════════════════════════════════════════════════
# 1. One-line sim or real — auto-detected
# ═══════════════════════════════════════════════════════════════
from strands_robots import Robot, list_robots
from strands import Agent

robot = Robot("so100")                # USB detected → real; else → sim
agent = Agent(tools=[robot])
agent("Pick up the red cube")         # ← the 5-line promise

# Explicit mode override
sim = Robot("so100", mode="sim")
hw  = Robot("so100", mode="real", cameras={"wrist": {"index_or_path": "/dev/video0"}})

# Discovery — 68 robots registered (was 38 in v0.3.8)
list_robots(mode="sim")

# ═══════════════════════════════════════════════════════════════
# 2. Simulation is a standalone AgentTool — no Robot needed
# ═══════════════════════════════════════════════════════════════
from strands_robots.simulation import Simulation

sim = Simulation()                    # MuJoCo backend, lazy-imported
agent = Agent(tools=[sim])
agent("Create a world with an so100 and a red cube, then step 100 times")

# 35 actions exposed through the AgentTool interface:
#   create_world, step, reset, render, run_policy, record_dataset,
#   raycast, jacobian, energy, apply_force, save_checkpoint, …

# ═══════════════════════════════════════════════════════════════
# 3. Pluggable physics backends via SimEngine ABC
# ═══════════════════════════════════════════════════════════════
from strands_robots.simulation import create_simulation, register_backend

# Bring your own physics engine — as long as it implements SimEngine
register_backend("bullet", lambda: BulletSim, aliases=["pb"])
sim = create_simulation("bullet")

# ═══════════════════════════════════════════════════════════════
# 4. GR00T N1.7 — new Cosmos-Reason2-2B backbone
# ═══════════════════════════════════════════════════════════════
robot = Robot(
    "unitree_g1",
    policy={"name": "gr00t", "server": "thor.local:5555"},
    embodiment="REAL_G1",             # new N1.7 embodiment tag
)
# Detection order: N1.7 → N1.6 → N1.5 (newest-first)
# Verified live against nvidia/GR00T-N1.7-3B on Jetson AGX Thor.

Blocking PRs (merge order matters)

Order PR Title Diff
1 #83 build system (uv, py3.12, [sim]) minor
2 #84 simulation foundation (models, ABC, registry, assets) +3,780 / −569
3 #85 MuJoCo backend (35 actions) +8,723 / −568
4 #86 Robot() factory + lazy imports +7,875 / −753
5 #87 README rewrite + 8 examples +7,974 / −405
6 #93 Isaac-GR00T N1.7 Early Access +505 / −13
7 #90 gr00t_inference input validation +332 / −8
8 #81 CI: integration test workflow (closes #69) +210

Supporting issues

Definition of Done


v0.4.0 — Robot Mesh + Newton + Isaac Sim

The big one. Three headline features land together in v0.4.0:

  1. Robot Mesh (#98) — every Robot() auto-joins a Zenoh peer network. Agent-to-agent tool calls over a LAN with zero config.
  2. Newton backend (#96) — NewtonSimulation(SimEngine) on NVIDIA Warp + Newton 1.x. GPU-native, 4096+ envs per GPU, differentiable.
  3. Isaac Sim backend (#97) — IsaacSimulation(SimEngine) with USD + IsaacLab 3.0. Photorealistic, Replicator synthetic data.

Together these turn strands-robots from "run one robot in MuJoCo" into "run a fleet across sim + real + photoreal, all coordinated through a mesh."

What the user gets

# ═══════════════════════════════════════════════════════════════
# 1. Every Robot is automatically on the mesh — #98
# ═══════════════════════════════════════════════════════════════
from strands_robots import Robot

striker = Robot("unitree_g1", peer_id="striker")
mid_1   = Robot("unitree_g1", peer_id="mid_1")

# Mesh auto-starts in __init__. Verify:
assert striker.mesh.alive
assert striker.mesh.peer_id == "striker"

# Peer discovery (local network multicast, no broker, no config)
print(striker.mesh.peers)
# → [{'peer_id': 'mid_1', 'peer_type': 'robot', 'hostname': '…',
#     'caps': {…}, 'last_seen': 1716…}]

# ═══════════════════════════════════════════════════════════════
# 2. Agent-to-agent tool calls — #98
# ═══════════════════════════════════════════════════════════════
# Natural language instruction — peer's agent interprets and executes
resp = striker.mesh.tell("mid_1", "pass the ball to me")
# → {'status': 'done', 'responder_id': 'mid_1', 'result': …}

# Structured command (bypass NL — faster, typed)
resp = striker.mesh.send(
    "mid_1",
    {"action": "execute", "instruction": "cross to box"},
    timeout=30.0,
)

# Broadcast to every peer on the mesh
responses = striker.mesh.broadcast({"action": "status"}, timeout=3.0)
for r in responses:
    print(r["responder_id"], r["result"])

# Safety — always broadcasts, always wins
striker.mesh.emergency_stop()

# ═══════════════════════════════════════════════════════════════
# 3. GPU-native training at scale — #96 (Newton)
# ═══════════════════════════════════════════════════════════════
from strands_robots.simulation import create_simulation

sim = create_simulation("newton", solver="mujoco", num_envs=4096)
sim.create_world()
sim.add_robot("so100")
sim.replicate(4096)
sim.step(100)                         # 4096 envs × 100 steps, one GPU

# Differentiable simulation for gradient-based policy optimization
sim.run_diffsim(num_steps=100, loss_fn=…, optimize_params=…)

# ═══════════════════════════════════════════════════════════════
# 4. Photorealistic synthesis — #97 (Isaac Sim)
# ═══════════════════════════════════════════════════════════════
sim = create_simulation("isaac", rtx_mode="path_traced")
sim.create_world()
sim.add_robot("unitree_g1")
sim.add_terrain("rough")
frame = sim.render(camera_name="wrist")     # RTX path-traced RGB
sim.record_video("demo.mp4", duration=10)   # for DreamGen dataset gen

# ═══════════════════════════════════════════════════════════════
# 5. Mixed sim + real fleets — same API across all three backends
# ═══════════════════════════════════════════════════════════════
planner  = Robot("so100", mode="sim",  backend="newton", peer_id="planner")
executor = Robot("so100", mode="real",                   peer_id="executor")

# Planner trains the policy in 4096-env Newton, then tells the real robot
planner.mesh.tell("executor", "approach the red cube and grasp it")

# ═══════════════════════════════════════════════════════════════
# 6. Live observability — mesh publishes state + events
# ═══════════════════════════════════════════════════════════════
# Every Robot publishes joint state, camera frames, and events to
# strands/<peer_id>/... at up to 50 Hz. Any peer (or the dashboard)
# can subscribe.

python -m strands_robots.dashboard     # live gauges, camera feeds,
                                       # teleop, E-STOP button

Full example — 2-robot coordinated pick-and-place

from strands_robots import Robot
import time

picker = Robot("so100", peer_id="picker")
placer = Robot("so100", peer_id="placer")

# Wait for discovery
while len(picker.mesh.peers) < 1:
    time.sleep(0.1)

# Orchestrate through the mesh
picker.execute("pick up the red cube")
picker.mesh.tell("placer", "open gripper and hold still")
picker.mesh.tell("placer", "gripper closing — release on contact")
picker.execute("release gripper")
placer.execute("move to target pose and place cube")

Full example — 5v5 humanoid coordination (the agentic_soccer teaser)

# 10 G1 humanoids — 5 per team, each running its own Strands agent
striker = Robot("unitree_g1", peer_id="striker")
mid_1   = Robot("unitree_g1", peer_id="mid_1")
def_1   = Robot("unitree_g1", peer_id="def_1")
# … and so on for 10 peers

# Striker initiates a play via the mesh
striker.mesh.tell("mid_1", "pass diagonal")
mid_1.mesh.tell("striker", "cross to box")
striker.execute("shoot")

Blocking PRs & tracking issues

Order Ref Title Notes
1 #98 feat(mesh): Zenoh-based Robot Mesh v0.4 headliner; unblocks #48 and #52. ~1K LOC core + 1.5K tests + 1K docs across 6 PRs
2 #96 feat(newton): NVIDIA Warp/Newton backend GPU-native SimEngine on Warp 1.x. ~2.1K LOC across 7 PRs
3 #97 feat(isaac): Isaac Sim backend USD + IsaacLab 3.0. ~3.6K LOC across 5 PRs; asset-converter sub-PR mergeable independently
4 #48 Zenoh-native web dashboard, camera streaming & teleop draft; rebases on #98; +2,062 / −13
5 #52 Device Connect integration (with Zenoh fallback) draft; depends on #98's robot_mesh primitive; +4,273 / −142
6 #50 Newton up_axis fix + [isaac] extras GPU unblocker; feeds into #96 / #97
7 — (new) samples/fleet_orchestration.py, samples/live_stream.py, samples/emergency_stop.py reference examples for #98
8 — (new) examples/newton_fleet_training.py, examples/isaac_photo_realistic_so100.py reference examples for #96 / #97
9 — (new) Fleet-scale soak test suite 10 robots × 10 min × 0 drops

Execution ordering

All three headline issues depend on the SimEngine ABC (#84) and the MuJoCo reference backend (#85) landing first. Once v0.3.9 ships:

  1. feat(mesh): Zenoh-based Robot Mesh — fleet coordination primitive #98 (mesh) — FIRST. Unblocks feat: Zenoh-native web dashboard, camera streaming & teleop #48 (dashboard) and feat: add Device Connect integration #52 (Device Connect). Smallest of the three (~1K LOC core).
  2. feat(newton): NVIDIA Warp/Newton simulation backend — GPU-native SimEngine #96 (Newton) — SECOND. Establishes the port pattern that feat(isaac): Isaac Sim simulation backend — USD + IsaacLab 3.0 #97 mirrors.
  3. feat(isaac): Isaac Sim simulation backend — USD + IsaacLab 3.0 #97 (Isaac Sim) — LAST. Largest scope. Acceptable to slip to v0.4.1 if needed; asset-converter sub-PR can merge independently.

Supporting issues

  • #98Zenoh-based Robot Mesh (P0 — v0.4 headliner)
  • #96Newton backend (P1)
  • #97Isaac Sim backend (P2)
  • #52 — Device Connect + robot_mesh tool API
  • #48 — Zenoh-native web dashboard
  • #6 — design for lerobot_teleoperate.py
  • #5 — SIL/HIL integration with Isaac Sim
  • #4 — expanded E2E robotics workloads
  • #3 — clarify target edge devices (Jetson, Thor, etc.)
  • #2 — generic framework integration class (ROS2 support)
  • #1ModalityTransform methods in DataConfigs

Definition of Done

Robot Mesh (#98)

  • robot.mesh.tell() / send() / broadcast() / emergency_stop() — stable public API
  • Auto peer discovery works cross-machine on a LAN (multicast, no broker)
  • Dashboard (#48) subscribes to any mesh peer without config
  • Device Connect + Zenoh dual-transport (#52) merged
  • 2+ multi-robot examples shipped in examples/
  • Soak test: 10 robots on one network for 10 minutes with zero dropped messages
  • Emergency stop propagates in ≤ 100 ms across the fleet
  • Docs: "Your first fleet" tutorial

Newton backend (#96)

  • create_simulation("newton") registered + lazy-imported
  • sim.add_robot("so100") + sim.step(100) stable at 4096 envs on one GPU
  • sim.replicate(num_envs=4096) — >50k aggregate steps/sec target
  • sim.run_diffsim(...) + sim.solve_ik(...) working end-to-end
  • At least 3 solvers production-ready (mujoco, xpbd, semi_implicit)
  • docs/backends/newton.md + 2 examples shipped

Isaac Sim backend (#97)

  • create_simulation("isaac") registered + lazy-imported
  • sim.is_available() runtime check works without Isaac Sim installed
  • urdf_to_usd / mjcf_to_usd asset converter merges as independent sub-PR
  • sim.render(rtx_mode="path_traced") produces photorealistic frames
  • Teleop + add_terrain + get_contact_forces + record_video all working
  • IsaacLab 3.0 breaking changes from Track IsaacLab 3.0 breaking changes — quaternion, wp.array, multi-backend #68 fully applied
  • docs/backends/isaac.md + 3 examples shipped

🗺️ Beyond v0.4 — research directions

Not scoped to a release yet, but tracked for later:


📚 Full snapshot (2026-04-21)

All 10 open PRs
# Title Base Status Landing
#93 Isaac-GR00T N1.7 Early Access main ✅ ready v0.3.9
#90 gr00t_inference input validation main ✅ ready v0.3.9
#87 README + 8 examples main ✅ ready v0.3.9
#86 Robot() factory main ✅ ready v0.3.9
#85 MuJoCo backend main ✅ ready v0.3.9
#84 simulation foundation main ✅ ready v0.3.9
#83 build system (uv, py3.12) main ✅ ready v0.3.9
#81 CI integration test workflow main ✅ ready v0.3.9
#52 Device Connect integration dev 📝 draft v0.4.0
#50 Newton up_axis fix dev ✅ ready v0.3.9 or v0.4
#48 Zenoh web dashboard dev 📝 draft v0.4.0
All 16 open issues
# Title Release
#98 feat(mesh): Zenoh-based Robot Mesh v0.4.0 — P0
#97 feat(isaac): Isaac Sim backend v0.4.0 — P2
#96 feat(newton): Newton backend v0.4.0 — P1
#89 docs: Python ≥3.12 in release notes v0.3.9
#88 ci: fix CI failures on #48 v0.3.9/v0.4
#75 chore: reconcile dev with main v0.3.9
#72 refactor: package-wide lazy-loading v0.3.9
#71 replace sleep() with readiness checks v0.3.9
#69 ci: enable integ tests in CI v0.3.9
#61 rename grootgr00t v0.3.9
#6 design for lerobot_teleoperate.py v0.4.0
#5 SIL/HIL with Isaac Sim v0.4.0
#4 expanded E2E robotics workloads v0.4.0
#3 clarify target edge devices v0.4.0
#2 ROS2 support v0.4.0
#1 ModalityTransform in DataConfigs v0.4.0

📬 Feedback

If you see something missing, mislabeled, or mistimed - drop a comment. This issue is the pinned source of truth for where every PR and issue is headed across the next two releases.


Last updated: 2026-04-21 (added #96 Newton, #97 Isaac Sim, #98 Robot Mesh tracking issues)

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

Status

In progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions