Migrate blob consumers of coordinaotor_joint_state topic to per robot joint topic - #3277
Merged
Conversation
mustafab0
requested review from
Dreamsorcerer,
leshy,
paul-nechifor and
spomichter
as code owners
July 29, 2026 21:36
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #3277 +/- ##
=======================================
Coverage 75.20% 75.21%
=======================================
Files 1128 1128
Lines 107954 107983 +29
Branches 9751 9751
=======================================
+ Hits 81188 81219 +31
+ Misses 23955 23954 -1
+ Partials 2811 2810 -1
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 5 files with indirect coverage changes 🚀 New features to boost your workflow:
|
mustafab0
force-pushed
the
migrate-blob-consumers
branch
from
July 29, 2026 21:55
0fb03ca to
4d7f733
Compare
mustafab0
commented
Jul 29, 2026
paul-nechifor
previously approved these changes
Jul 29, 2026
mustafab0
enabled auto-merge
July 29, 2026 22:05
The quest teleop coordinators subclass ControlCoordinator to declare arm_joints and opt into publish_robot_joint_states; the collection blueprints remap the recorder's joint port onto it. The recorder module is unchanged, so the db stream name DataPrep reads stays coordinator_joint_state. test_blueprints looks the coordinator up with issubclass now that deployments subclass it.
The xArm6 worldbelief coordinator declares arm_joints and opts into publish_robot_joint_states; the blueprint remaps the recorder's joint port onto it. The recorder module is unchanged, so both the db stream name and its @pose_setter_for still key off the port name.
unitree-g1-coordinator declares g1_joints, opts into publish_robot_joint_states, and exports it on /g1/joints alongside the other /g1/* wire topics; g1_replay subscribes there instead of the merged /coordinator_joint_state. Replay behaviour is otherwise unchanged.
The groot coordinator declares g1_joints and exports it on /g1/joints, so the Rerun URDF override and its throttle now key off world/g1/joints. The twist_command remap names the subclass, because remapping_map is keyed by instance name and a base-class key stops matching once the blueprint subclasses ControlCoordinator.
The holonomic and RPP controllers declare go2_joints and export it on
/coordinator/joint_state, the same wire topic the merged blob used, so
external readers are unaffected. Also drops the dead ('joint_state',
JointState) transport key — no stream by that name exists in either
blueprint.
mustafab0
force-pushed
the
migrate-blob-consumers
branch
from
July 29, 2026 23:25
4d7f733 to
9cd73dd
Compare
mustafab0
enabled auto-merge
July 29, 2026 23:25
paul-nechifor
approved these changes
Jul 29, 2026
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Jul 30, 2026
mustafab0
added a commit
that referenced
this pull request
Jul 30, 2026
CollectionRecorder and WorldBeliefRecorder capture whatever joints are present, so the aggregate stream is their intended input. Dropping the remaps #3277 added lets autoconnect pair them by port name again, with no module-code changes. Nothing else consumed either coordinator's `arm_joints`, so the per-robot opt-in comes off the xarm7 teleop, piper teleop, and xarm6 worldbelief coordinators too.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The control coordinator publishes one message with every robot's joints stitched
together. Anything that wants one robot's joints has to take the whole thing.
That merged message is being retired. Five places still read it, and all five only care
about a single robot.
Issue: #
Solution
Each coordinator now also publishes one stream per robot, and those five readers
subscribe to the one they need.
Two halves per deployment: add the output on the coordinator, point the reader at it.
One commit per reader.
Recorder modules are untouched, so recordings keep their old stream names and DataPrep
configs still work.
The merged message still publishes. Retiring it is a later PR, as is the manipulation
module.
Breaking Changes
None. The go2 controllers keep the same LCM topic, so Foxglove and lcm-spy are unaffected.
How to Test
pytest dimos/control dimos/imitation dimos/perception dimos/robot -m 'not (tool or self_hosted or mujoco or self_hosted_large)'dimos --simulation mujoco run unitree-g1-groot-wbc— G1 still animates in Rerun, nav still drives it.learning-collect-quest-piper— record an episode, DataPrep still builds itxarm6-worldbelief— recording still hascoordinator_joint_stateunitree-g1-coordinator+g1_replay.py --dry-run— picks up current poseunitree-go2-holonomic-controllerand-rpp-controller— tracking unchanged