sanad_api_go2 — Go2 fleet telemetry agent
Pushes the Unitree Go2's live status to the YS Lootah fleet server. Sibling of
sanad_api_r1; deploy it with the fleet installer (../../fleet_install.sh).
POST {SERVER_URL}/api/v1/fleet/ingest/telemetry Authorization: Bearer <device_token>
{ "sn":"go2_0000", "mac":"…", "battery":74, "charging":false,
"status":"idle", "position":{"x":…,"y":…}|null, "faults":[], "ts":… }
Sent every ~2 s; a heartbeat (battery:null, status:offline) when DDS is
silent so the robot stays online.
Data sources (Go2, unitree_go DDS)
| field | source |
|---|---|
battery, charging |
rt/lowstate.bms_state (nested — Go2 has no separate BMS topic): soc 0–100; charging from current sign |
faults[] |
rt/lowstate motor temps + staleness |
status |
derived (charging / moving / idle / offline) |
position |
optional: sportmode (rt/lf/sportmodestate) or rosbridge (/odom) — default off |
mac |
primary NIC |
Safety: read-only — never commands motion.
Run / test
../../fleet_install.sh install go2 <ip> --sn go2_<id>
../../fleet_install.sh data go2 <ip>
# bare simulate (no robot):
SERVER_URL=… DEVICE_TOKEN=… SN=go2_0 python3 sanad_api_go2.py --simulate -v
Build on the Go2 compute (arm64); bundles CycloneDDS + the vendored
unitree_sdk2py wheel (vendor/). network_mode: host for DDS.
⚠️ UNVERIFIED ON HARDWARE. Written from the
unitree_goSDK layout but not yet run on a real Go2. Confirm thebms_statecurrent sign (charging polarity) and thesportmodestatefields on the robot. Verified so far: image builds,unitree_goimports, simulate/heartbeat payloads correct.