Skip to content

use_dds·

⏱ 60s · escape hatch

Raw DDS on any topic — for monitoring, debugging, or publishing what the SDK doesn't wrap.

tool what
g1_dds_list_topics curated G1 topic catalog
g1_dds_discover(timeout=5.0) full live topic set (no arg)
g1_dds_snapshot(topic) read ONE sample
g1_dds_subscribe(topic, max_buffer=20) buffered subscription
g1_dds_read(topic, n=10) pop latest N
g1_dds_unsubscribe(topic) stop
g1_dds_stats() active subs/pubs + counts
g1_dds_publish(topic, payload, unsafe=True) raw publish ⚠

read flow·

> list all DDS topics rt/lowstate, rt/bmsstate, rt/armsdk, rt/lowcmd, ... > snapshot rt/lowstate { timestamp, imu_state, motor_state[29] } > subscribe rt/bmsstate · read last 3 [{soc:86, current:-2.1}, {...}, {...}]

publishing — the dangerous part·

rt/*cmd topics are single-writer, owned by the motor controller. Publishing without coordination WILL cause motor failures.

# safe topic — no flag:
g1_dds_publish(topic="rt/utlidar/switch", payload={"data": "ON"})
# dangerous topic — REQUIRES unsafe=True:
g1_dds_publish(topic="rt/armsdk", payload={...}, unsafe=True)

unsafe=True required for: rt/lowcmd · rt/user_lowcmd · rt/armsdk · rt/bmscmd · rt/inspire/cmd. The flag forces explicit intent — the LLM can't publish to these "by accident".

when to reach for this·

✅ inspecting a topic the SDK doesn't surface · prototyping before a composed tool · debugging why an RPC isn't reaching the MCU

❌ bypassing safety · publishing motor commands manually · anything use_unitree already covers

See DDS topics for the full schema list.