Skip to content

Feat/rerun bridge tf reconstruction - #3371

Open
jeffreychu0 wants to merge 6 commits into
dimensionalOS:mainfrom
jeffreychu0:feat/rerun-bridge-tf-reconstruction
Open

Feat/rerun bridge tf reconstruction#3371
jeffreychu0 wants to merge 6 commits into
dimensionalOS:mainfrom
jeffreychu0:feat/rerun-bridge-tf-reconstruction

Conversation

@jeffreychu0

Copy link
Copy Markdown

Contribution path

Problem

Within the rerun-bridge standalone workflow, the TF trees that are generated are hard-coded based on the unitree blueprints. They don't leverage the TF tree service and lead to broken TF trees that aren't generated whenever the rerun-bridge is ran by itself

Solution

  • Created a variable for axis-length within rerun-bridge to visualize TF changes (invisible otherwise)
  • Setup rerun-bridge to connect chaining TF paths from TF messages together to formulate the final TF tree
    -> Within the TODO / issue, it stated that the TF service has a function to rebuild the TF trees. However, it was missing functionality to find the parent through directed ancestry, The new methods in rerun-bridge are there to perform that missing functionality
  • Created tests to verify TF trees are created properly even with throttling or chaining issues

How to Test

GUI Test:
dimos rerun-bridge

NOTE: the GUI test will only showcase the TF trees if another process (a script, for example) is publishing it to the rerun service.

Test Suite:
.venv/bin/pytest dimos/visualization/rerun/test_tf_bridge.py -q

AI assistance

Claude Code with Opus 5, Wrote all code while being supervised on the changes it made

Checklist

  • I have read and approved the CLA.

@github-actions github-actions Bot added the first-time-contributor PR opened by an author who had not previously committed to this repository label Aug 5, 2026
@greptile-apps

greptile-apps Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR replaces flat TF visualization with stateful reconstruction of nested Rerun entity paths and adds visible frame axes, re-anchoring, throttling, and cycle tests.

  • Tracks parent relationships across partial TF messages.
  • Logs transforms under reconstructed tree-shaped entity paths.
  • Clears and rebuilds committed paths when a frame is subsequently observed with new ancestry.
  • Adds focused tests for chained, late, cyclic, and throttled TF updates.

Confidence Score: 4/5

The late-parent path handling should be fixed before merging because previously logged descendants can remain under obsolete TF paths when their next update is delayed or suppressed.

Topology updates and visualization updates are decoupled: recording a new ancestor changes the in-memory chain but does not clear or relocate affected committed descendants unless each descendant is subsequently logged.

Files Needing Attention: dimos/visualization/rerun/bridge.py, dimos/visualization/rerun/test_tf_bridge.py

Important Files Changed

Filename Overview
dimos/visualization/rerun/bridge.py Adds stateful TF-tree reconstruction, but late topology updates leave committed descendants stale until each descendant is logged again.
dimos/visualization/rerun/test_tf_bridge.py Covers normal chaining, cycles, throttling, and late parents, though the late-parent test retransmits the child and misses the persistent stale-path case.
dimos/msgs/tf2_msgs/TFMessage.py Documents that full tree reconstruction now belongs to the rerun bridge without changing message behavior.
dimos/robot/unitree/go2/blueprints/basic/unitree_go2_basic.py Contains only whitespace changes with no behavioral impact.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  M[TFMessage received] --> P[Update child-to-parent topology]
  P --> T{Topic throttled?}
  T -- Yes --> D[Skip Rerun logging]
  T -- No --> C[Build ancestry chain]
  C --> X{Committed path changed?}
  X -- Yes --> R[Clear stale path recursively]
  X -- No --> L[Use committed path]
  R --> L2[Commit reconstructed path]
  L --> G[Log axes and transform]
  L2 --> G
Loading

Reviews (1): Last reviewed commit: "fix: simplified changes to remove AI blo..." | Re-trigger Greptile

Comment on lines +378 to +380
if isinstance(msg, TFMessage):
for transform in msg.transforms:
self._tf_parents[transform.child_frame_id] = transform.frame_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Late ancestry leaves stale paths

When an ancestor edge arrives after a child was logged, these lines update only _tf_parents; the child's committed path is not cleared or rebuilt until an unthrottled child transform arrives, causing the recording to keep displaying that frame under its obsolete root indefinitely when the child is not retransmitted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

first-time-contributor PR opened by an author who had not previously committed to this repository

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant