Skip to content

Home

neon

a strands agent on the unitree g1+, running on the robot

 live on G1 38 robot tools 500 Hz state 29 motors 8 safety gates

neon > wave hello and tell me what you see → g1_arm_action('high wave') rc=0, released → take_photo('what do you see?') 640x480 via the dashboard neon > Waved. A person at a desk, laptop open.

The neon cockpit: live RealSense colour feed in the centre, controller, posture and telemetry cards around it, the agent composer along the bottom

the cockpit at neon.cagatay.my, live from the G1 (camera frame blurred for the people in the office). more views

the whole thing in 3 minutes·

1 What it is. A Strands agent that drives a Unitree G1+ humanoid. It runs on the robot's Jetson, speaks DDS to the motor bus, and turns the SDK into 38 typed, safety-gated tools. The model is remote (Bedrock or OpenAI Realtime); everything that touches a motor is local.

2 How you talk to it. One agent, many faces: the chest speaker, Telegram, the cockpit in a browser or on your phone, the REPL over SSH, and a thinker that reflects every 30 s. Say wave, walk forward 30cm, what do you see?, map this room. Every persona shares one memory and one log.

3 Why it's safe. Walking is FSM-gated and only on your explicit request; the arm bus is mutex-locked; raw motor publishes need unsafe=True. After a walk the robot measures its own displacement and says "done" only when it moved.

Start the tour →

flowchart LR
  U(["you"]) -->|"voice, telegram, cockpit, REPL"| A

  subgraph G1["Unitree G1+, Jetson Orin"]
    direction TB
    A["neon<br/>strands, 38 robot tools"]
    C["MCU controllers"]
    M["motors, arms<br/>audio, LEDs"]
    S[("lidar, imu<br/>bms, cameras")]
    A -->|"DDS"| C --> M
    A -.->|"read-only"| S
  end

  classDef brain stroke:#007a3d,stroke-width:1.5px
  classDef io stroke:#666464,stroke-width:1.5px
  class A brain
  class C,M,S io

at a glance·

robot Unitree G1+, 29 motors, 2 arms, Livox MID-360 lidar, RealSense + Brio cameras
compute Jetson Orin NX, the agent runs on the robot
transport CycloneDDS over eth0 (no ROS)
tools 38 robot tools + 5 cross-persona tools, counted from the code at build time
model any Bedrock model id (NEON_MODEL_ID, default global.anthropic.claude-opus-4-8), changed live from the cockpit; voice on OpenAI Realtime, Nova Sonic or Gemini Live
surfaces voice (chest speaker), Telegram, cockpit (browser, phone, tiny app), REPL, thinker
safety eight gates: allowlist, prompt, tool class, FSM, arm mutex, clamps, request + look, measured motion
  • Run it: clone, add a Bedrock key, wave hello. 60 s.

  • See it: gestures, a measured walk, a Telegram message end to end.

  • Do it: recipes you can say: wave, walk, look, map, text.

  • Operate it: the cockpit, voice snooze, model switch, passkeys.

  • Dig in: 38 tools, use_unitree, use_dds, the eight gates, the runtime.


built with strands-agents, devduck, unitree_sdk2