feat(go2): unitree-go2-joystick blueprint, operator input recorded and plotted - #4242
KrishnaH96 wants to merge 3 commits into
Conversation
RerunWebSocketServer publishes the viewer's raw twist message as joystick: Out[Joy], six axes in the viewer's field order, before it converts it to tele_cmd_vel, so --record stores both.
…lotted unitree-go2 with its own viewer window: joystick, tele_cmd_vel and cmd_vel time series under the camera and the odom plot, one color per axis and step interpolation, since command streams go silent between bursts. Run it with --record to store all three streams. The default unitree-go2 window is unchanged. unitree-go2-joystick-replay plays a recording back with the same window: run replay finds the window from the recording's run folder name, which a dataset pulled from LFS does not have.
Three minute Go2 run recorded with dimos --record run unitree-go2: WASD driving from the viewer, then two click-to-go nav goals. Carries joystick, tele_cmd_vel, cmd_vel, nav_cmd_vel, lidar, global_map, color_image, camera_info, odom and tf.
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #4242 +/- ##
=======================================
Coverage 79.72% 79.72%
=======================================
Files 1508 1510 +2
Lines 142607 142688 +81
Branches 12209 12211 +2
=======================================
+ Hits 113689 113763 +74
- Misses 25478 25485 +7
Partials 3440 3440
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 3 files with indirect coverage changes 🚀 New features to boost your workflow:
|
|
Comments Outside DiffThese findings sit on lines the diff does not cover, so they could not be posted inline. Each one leaves this list once its file changes.
|
Problem
The viewer's WASD input is converted to
tele_cmd_velright away and never published in raw form, so--recordcannot store it, and no Go2 blueprint shows the operator's input next to the velocity it turns into.Solution
RerunWebSocketServerpublishes the viewer's twist message asjoystick: Out[Joy]before converting it totele_cmd_vel. 6 added lines, the existing conversion untouched.unitree-go2-joystick:unitree-go2with its own viewer window addingjoystick,tele_cmd_velandcmd_velplots under the camera and odom, one color per axis, step interpolation. Run with--recordto store all three. The defaultunitree-go2window is unchanged.unitree-go2-joystick-replay: the same window on the replay module from feat: replay blueprint - dimos --replay-db <memory.db> run replay #3738, for recordings without a run folder such as an LFS dataset.go2_teleop_sf_office_2026-09-18(379 MB): 3 min real Go2 run, WASD driving then two click-to-go goals.+237 lines, 0 deletions. A recording made with
unitree-go2-joysticklands in a run folder named after it, so plainrun replayfinds this window automatically.Note: dimos-viewer converts keys to velocities itself, so
joystickequalstele_cmd_veltoday.tele_cmd_velvscmd_velis the pair that diverges, whenever nav drives (2:22 and 2:43 in the clip).How to Test
Replay the shared recording, no robot needed. The dataset is pulled from LFS the first time:
Screencast_2026-09-18_14-50-29.mp4
To run the blueprint yourself and collect data on hardware:
dimos --record run unitree-go2-joystick --robot-ip <ip>.Alternative
#4224 does the same thing by adding the plots to the default
unitree-go2window, so every Go2 user sees them, plus aunitree-go2-replayblueprint for LFS datasets. Both are hardware-tested and mergeable; @spomichter pick one and I will close the other.AI assistance
Claude Code (Claude Opus 5) helped survey the code, draft the change and run the checks. I reviewed and understand every line.
Checklist