From df895c0d12ec9dd521a91f2558cb7e33bd46ce5a Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Thu, 10 Sep 2026 16:57:40 -0700 Subject: [PATCH 1/2] fix(spot): anchor camera pixels to their capture-time pose in rerun The Pinhole on each camera entity named the optical tf frame as its parent, which overrode the capture-time pose _ImageBakedIntoAnchor logs on the entity above it and hung the pixels off the live tf instead. Log the Pinhole without a parent frame so the entity hierarchy, and the baked pose, apply. Claude-Session: https://claude.ai/code/session_012LAQvtJ7PuTpphgzkTEKtM --- dimos/experimental/robot/bosdyn/spot/rerun.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/dimos/experimental/robot/bosdyn/spot/rerun.py b/dimos/experimental/robot/bosdyn/spot/rerun.py index 0f028b571a..23504ebd25 100644 --- a/dimos/experimental/robot/bosdyn/spot/rerun.py +++ b/dimos/experimental/robot/bosdyn/spot/rerun.py @@ -92,14 +92,30 @@ def _tf_to_rerun(tf_message: TFMessage) -> RerunData: def _camera_info_pinhole(camera_info: CameraInfo, origin: Callable[[str], str]) -> RerunData | None: - """Re-emit a shared CameraInfo onto its camera's image entity as a Pinhole.""" + """Re-emit a shared CameraInfo onto its camera's image entity as a Pinhole. + + The Pinhole names no ``parent_frame``: the camera entity takes its pose + from the entity above it, which :class:`_ImageBakedIntoAnchor` sets to the + camera's pose at capture time. A named parent frame would override that + and hang the pixels off the live tf instead. + """ suffix = _OPTICAL_FRAME_TO_SUFFIX.get(camera_info.frame_id) if suffix is None: return None - return camera_info.to_rerun( - image_plane_distance=_FRUSTUM_PLANE_DISTANCE, - image_topic=_camera_entity(origin(suffix)), - ) + import rerun as rr + + return [ + ( + _camera_entity(origin(suffix)), + rr.Pinhole( + focal_length=[camera_info.K[0], camera_info.K[4]], + principal_point=[camera_info.K[2], camera_info.K[5]], + width=camera_info.width, + height=camera_info.height, + image_plane_distance=_FRUSTUM_PLANE_DISTANCE, + ), + ) + ] # Module-level (not closures) so the RerunBridgeModule config stays picklable From c6e76220bb6910caecfab4601ca81ae53dd15965 Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Thu, 10 Sep 2026 17:56:28 -0700 Subject: [PATCH 2/2] Update rerun.py --- dimos/experimental/robot/bosdyn/spot/rerun.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/dimos/experimental/robot/bosdyn/spot/rerun.py b/dimos/experimental/robot/bosdyn/spot/rerun.py index 23504ebd25..26cfe3efa2 100644 --- a/dimos/experimental/robot/bosdyn/spot/rerun.py +++ b/dimos/experimental/robot/bosdyn/spot/rerun.py @@ -92,13 +92,6 @@ def _tf_to_rerun(tf_message: TFMessage) -> RerunData: def _camera_info_pinhole(camera_info: CameraInfo, origin: Callable[[str], str]) -> RerunData | None: - """Re-emit a shared CameraInfo onto its camera's image entity as a Pinhole. - - The Pinhole names no ``parent_frame``: the camera entity takes its pose - from the entity above it, which :class:`_ImageBakedIntoAnchor` sets to the - camera's pose at capture time. A named parent frame would override that - and hang the pixels off the live tf instead. - """ suffix = _OPTICAL_FRAME_TO_SUFFIX.get(camera_info.frame_id) if suffix is None: return None