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.