Skip to content

strands-robots integration·

⏱ 90s

NEON drives the G1 through two control layers, fused by neon() into one agent toolset.

you call what drives NEON
Robot("g1") simulation (MuJoCo, CPU) — safe, no hardware
Robot("g1", mode="real", robot_ip=...) joints via LeRobot unitree_g1 driver, running a policy
tools/ DDS tools the live controller over CycloneDDS — FSM-gated, real-time
neon() both, in one agent

DDS ≠ LeRobot path

Robot(mode="real") streams joint targets from a VLA policy via LeRobot — it does not route through the DDS tools. The DDS tools are a separate live-control layer (FSM gates, arm mutex, chest speaker). neon() gives the agent both: DDS for presence/gestures/walking, Robot() for sim/policy/dataset/mesh.

two layers·

flowchart LR
    A[Agent tools=neon] --> L1
    A --> L2
    subgraph L1[Layer 1 · live DDS · ON the robot]
        S[state/battery] --- ARM[gestures] --- W[walking] --- AUD[voice] --- SEN[lidar·slam·cam]
    end
    subgraph L2[Layer 2 · strands-robots]
        SIM[MuJoCo sim] --- POL[VLA policies] --- DS[dataset+train] --- MESH[Zenoh mesh]
    end

usage·

from strands import Agent
from neon import neon

Agent(tools=neon(mode="sim"))("create a world with the g1, run mock policy 30 steps")
Agent(tools=neon(mode="real", robot_ip="192.168.123.161"))("wave, then walk 0.3 m")

Robot("g1") and Robot("neon") both resolve to the upstream unitree_g1 (46-DOF) — no new assets downloaded.

neon() knobs·

arg default effect
mode sim sim / real / auto
dds True live DDS tools
locomotion True walking tools
lookout True memory/voice/telegram/dispatch/vision
robot_tool True the strands-robots Robot tool
mesh None Zenoh fleet mesh (STRANDS_MESH env)

install·

pip install -e ".[sim]"     # sim + policy layer
pip install -e ".[all]"     # + voice + lerobot + mesh
make sdk && pip install -e ".[robot]"   # on the robot (aarch64)

strands-robots is pulled from source; pip users: pip install git+https://github.com/strands-labs/robots.git.


architecture catalog