Skip to content

refactor(tf): use generated CDR values for live and recorded lookups - #4658

Closed
TomCC7 wants to merge 2 commits into
cc/feat/cdr-native-tffrom
cc/feat/cdr-python-tf
Closed

TomCC7 wants to merge 2 commits into
cc/feat/cdr-native-tffrom
cc/feat/cdr-python-tf

Conversation

@TomCC7

@TomCC7 TomCC7 commented Oct 20, 2026

Copy link
Copy Markdown
Member

TF lookups, static frame publication and recorded-stream queries now use generated TransformStamped, PoseStamped and TFMessage values from dimos.messages. The query/publish argument names and seconds-based lookup interface remain unchanged. Geometry operations use the existing proposal helpers rather than rich wire classes.

Project: https://linear.app/dimensional/project/message-encoding-refactor-05a3ddb4af3e/overview

Stack dependencies

Base: #4657 (native TF / RealSense). This layer also includes the unchanged recording prerequisite from #4645 (fe5a5260, cherry-picked as 8a27beb1). It is shared dependency code, not a second recording implementation. Final stack alignment is pending the remaining consumer migrations.

graph TD
  Native["#4657 native TF and RealSense"] --> Python["Python TF: this PR"]
  Memory["#4645 CDR recording"] --> Python
  Python --> Consumers["Remaining perception / robot consumers"]
Loading

File changes

Category Files Additions Deletions Scope
Python TF and recorded lookup 3 111 72 Generated values, integer-nanosecond buffer snapshots, composition/inversion and stream replay
Behavioral tests 2 505 260 Real CDR memq delivery, frame paths, timing, snapshot ownership and static publication
Self-contained guide 1 111 432 Five short executable examples replacing legacy rich-message usage
Focused CI 1 9 0 Installed-wheel TF tests, scoped typing and change triggers

Counts above are the TF commit e530aec6 relative to its recording prerequisite 8a27beb1. The full parent-relative diff includes the unchanged #4645 prerequisite: 20 files, 1,438 additions and 777 deletions. Generated-at-build outputs are not checked in.

Manual review

From this PR checkout, use the normal project development environment:

uv run pytest dimos/protocol/tf/test_tf.py dimos/protocol/tf/test_static_tf_publisher.py

Then copy and run any complete block from Transforms. The “Attach a stream” block is a complete offline CDR publication/lookup example using memq://, with transport/subscription cleanup. No device or host multicast setup is needed.

Verified locally

  • 67 combined TF/static/recording/MCAP cases passed from source and against the installed main wheel; includes 57 TF/static cases.
  • All five documentation blocks executed successfully.
  • Strict typing passed for the three production TF/replay files; applicable commit hooks passed.
  • Normal main wheel build and installed dependency check passed (198 packages compatible).
  • An initially missing optional MCAP test dependency was installed in the isolated proof environment before the successful installed regression.

No terminal CI result is claimed. Benchmark investigation remains paused. Device operation, Nix derivation evaluation, default-host multicast, proprietary M20 SDK access and external viewer sign-in/human acceptance are separate unverified gates. This layer retains explicit CDR transport selection until the default runtime cutover is complete.

@github-actions github-actions Bot left a comment

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.

go2 replay realtime (arm64)

Details
Benchmark suite Current: e530aec Previous: 97344c8 Ratio
peak memory 1717.527 MB 1602.453 MB 1.07
peak threads 369 threads 356 threads 1.04
network (transport) 2722.164 MB 2724.755 MB 1.00
disk write 1.816 MB 1.742 MB 1.04
instructions 133.062 G 114.909 G 1.16

This comment was automatically generated by workflow using github-action-benchmark.

@codecov

codecov Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

❌ 4 Tests Failed:

Tests completed Failed Passed Skipped
4 4 0 19
View the top 3 failed test(s) by shortest run time
::dimos.robot.unitree.go2.blueprints.navigation.test_go2_sim_nav
Stack Traces | 0s run time
.../blueprints/navigation/test_go2_sim_nav.py:22: in <module>
    from dimos.robot.unitree.go2.blueprints.basic.go2_sim import go2_sim
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        BlueprintAtom = <class 'dimos.core.coordination.blueprints.BlueprintAtom'>
        ModuleBase = <class 'dimos.core.module.ModuleBase'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        __builtins__ = <builtins>
        __cached__ = '.../navigation/__pycache__/test_go2_sim_nav.cpython-312.pyc'
        __doc__    = 'The simulator runs the navigation the robot runs, unmodified.'
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/navigation/test_go2_sim_nav.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7797491a2db0>
        __name__   = 'dimos.robot.unitree.go2.blueprints.navigation.test_go2_sim_nav'
        __package__ = 'dimos.robot.unitree.go2.blueprints.navigation'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.navigation.test_go2_sim_nav', loader=<_pytest.assertion.rewrite.As...igin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/navigation/test_go2_sim_nav.py')
        pytest     = <module 'pytest' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/pytest/__init__.py'>
.../blueprints/basic/go2_sim.py:28: in <module>
    from dimos.simulation.go2_sim.world import SimGo2World
        Any        = typing.Any
        Go2Mid360StaticTf = <class 'dimos.robot.unitree.go2.go2_mid360_static_transforms.Go2Mid360StaticTf'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        ROBOT_HEIGHT = 0.45
        ROBOT_LENGTH = 0.6858
        ROBOT_WIDTH = 0.3175
        TYPE_CHECKING = False
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/go2_sim.cpython-312.pyc'
        __doc__    = 'The legged Go2 with its Mid-360 in a generated office, driven from the rerun viewer.'
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7794410ebfb0>
        __name__   = 'dimos.robot.unitree.go2.blueprints.basic.go2_sim'
        __package__ = 'dimos.robot.unitree.go2.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.basic.go2_sim', loader=<_frozen_importlib_external.SourceFileLoade...4410ebfb0>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x779715976480>
        body_on_base_link = <function body_on_base_link at 0x7794457804a0>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, lite6_ip=None, can...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
        partial    = <class 'functools.partial'>
.../simulation/go2_sim/world.py:115: in <module>
    MOUNT_XYZ, MOUNT_R = _mount()
        BOX_EDGES  = array([[[         -1,          -1,          -1],
        [          1,          -1,          -1]],

       [[         ... 1,           1]],

       [[          1,           1,          -1],
        [          1,           1,           1]]])
        BOX_RGBA   = {'ceiling': (0.95, 0.95, 0.95, 1.0), 'clutter': (0.45, 0.55, 0.7, 1.0), 'wall': (0.86, 0.84, 0.78, 1.0)}
        CEILING_GROUP = 1
        CMD_VEL_TIMEOUT = 0.2
        COLLISION_GROUP = 3
        CONTROL_DT = 0.02
        Contact    = <class 'dimos.msgs.sim_msgs.Contacts.Contact'>
        Contacts   = <class 'dimos.msgs.sim_msgs.Contacts.Contacts'>
        DEFAULT_THREAD_JOIN_TIMEOUT = 2.0
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Event      = <class 'threading.Event'>
        FLOOR_CHECKER = ((0.62, 0.6, 0.56), (0.7, 0.68, 0.64))
        FRAMES     = [('base_link', None, (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)), ('front_camera', 'base_link', (0.32715, -3e-05, 0.04297), (0.0...511965976, 0.0)), ('camera_optical', 'front_camera', (0.0, 0.0, 0.0), (-1.5707963267948966, 0.0, -1.5707963267948966))]
        FRAME_DT   = 0.1
        Family     = typing.Literal['office']
        Field      = <function Field at 0x779745ca5300>
        Go2Policy  = <class 'dimos.simulation.go2_legged.policy.Go2Policy'>
        In         = <class 'dimos.core.stream.In'>
        LIDAR_GROUPS = array([1, 1, 1, 0, 0, 0], dtype=uint8)
        LIDAR_HALF_EXTENTS = (0.0325, 0.0325, 0.03)
        LeggedGo2  = <class 'dimos.simulation.go2_legged.robot.LeggedGo2'>
        LineSegments3D = <class 'dimos.msgs.nav_msgs.LineSegments3D.LineSegments3D'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        MujocoRaycaster = <class 'dimos.simulation.sensors.mujoco_raycaster.MujocoRaycaster'>
        NDArray    = numpy.ndarray[tuple[typing.Any, ...], numpy.dtype[~_ScalarT]]
        ODOM_FRAME_ID = 'odom'
        Odometry   = <class 'dimos.msgs.nav_msgs.Odometry.Odometry'>
        Out        = <class 'dimos.core.stream.Out'>
        POINT_RATE = 200000.0
        Part       = typing.Literal['trunk', 'lidar', 'leg', 'foot']
        Path       = <class 'pathlib.Path'>
        PointCloud2 = <class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>
        Pose       = <class 'dimos.msgs.geometry_msgs.Pose.Pose'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Quaternion = <class 'dimos.msgs.geometry_msgs.Quaternion.Quaternion'>
        ROBOT_VISUAL_GROUP = 2
        Rotation   = <class 'scipy.spatial.transform._rotation.Rotation'>
        SCENE_GROUP = 0
        SCENE_PUBLISH_DT = 2.0
        SENSOR_FRAME_ID = 'mid360_link'
        STILL      = array([          0,           0,           0])
        Scene      = <class 'dimos.simulation.scenes.procedural.Scene'>
        SimMid360  = <class 'dimos.simulation.sensors.mid360.lidar.SimMid360'>
        TFMessage  = <class 'dimos.msgs.tf2_msgs.TFMessage.TFMessage'>
        TICKS_PER_FRAME = 5
        Thread     = <class 'threading.Thread'>
        Transform  = <class 'dimos.msgs.geometry_msgs.Transform.Transform'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../go2_sim/__pycache__/world.cpython-312.pyc'
        __doc__    = "The simulated world: a generated scene, the legged Go2 and its Mid-360.\n\nStands in for the Go2 driver and PointLio, publishing PointLio's output contract from\nground truth.\n"
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7794410ec380>
        __name__   = 'dimos.simulation.go2_sim.world'
        __package__ = 'dimos.simulation.go2_sim'
        __spec__   = ModuleSpec(name='dimos.simulation.go2_sim.world', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7794410ec380>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x779441071ee0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x779441070540>
        dataclass  = <function dataclass at 0x7797495c4cc0>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x7795b22916c0>
        generate   = <function generate at 0x779441071d00>
        go2_spec   = <function go2_spec at 0x7794410704a0>
        load_policy = <function load_policy at 0x779441097ec0>
        logger     = <BoundLoggerLazyProxy(logger=<_FixedFindCallerLogger .../simulation/go2_sim/world.py (INFO)>, wrapper_class=<class 'structlog.stdlib.BoundLogger'>, processors=None, context_class=None, initial_values={}, logger_factory_args=())>
        math       = <module 'math' (built-in)>
        mujoco     = <module 'mujoco' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/mujoco/__init__.py'>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/numpy/__init__.py'>
        rpc        = <function rpc at 0x77974271c180>
        setup_logger = <function setup_logger at 0x779741d53420>
        time       = <module 'time' (built-in)>
.../simulation/go2_sim/world.py:111: in _mount
    matrix = edges["front_camera"].to_matrix() @ edges["mid360_link"].to_matrix()
E   AttributeError: 'geometry_msgs__msg__TransformStamped' object has no attribute 'to_matrix'
        edges      = {'camera_optical': geometry_msgs__msg__TransformStamped(header=std_msgs__msg__Header(stamp=builtin_interfaces__msg__Ti...y_msgs/msg/Quaternion'), __msgtype__='geometry_msgs/msg/Transform'), __msgtype__='geometry_msgs/msg/TransformStamped')}
::dimos.robot.unitree.go2.blueprints.test_tf_topology
Stack Traces | 0s run time
.../go2/blueprints/test_tf_topology.py:34: in <module>
    from dimos.robot.unitree.go2.blueprints.navigation.go2_sim_nav import go2_sim_nav
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        PointLio   = <class 'dimos.hardware.sensors.lidar.pointlio.module.PointLio'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        RelocalizationModule = <class 'dimos.mapping.relocalization.module.RelocalizationModule'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/test_tf_topology.cpython-312.pyc'
        __doc__    = 'Every Go2 blueprint publishes a tf tree, not a tf graph.\n\ntf gives each frame one parent. Two publishers writing th...mount tree owns base_link, and the static tree is rooted at\nmid360_link so it never writes the frame PointLio owns.\n'
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../go2/blueprints/test_tf_topology.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7797491a2db0>
        __name__   = 'dimos.robot.unitree.go2.blueprints.test_tf_topology'
        __package__ = 'dimos.robot.unitree.go2.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.test_tf_topology', loader=<_pytest.assertion.rewrite.AssertionRewr...1a2db0>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../go2/blueprints/test_tf_topology.py')
        pytest     = <module 'pytest' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/pytest/__init__.py'>
        unitree_go2_mid360_record = Blueprint(blueprints=(BlueprintAtom(kwargs={}, module=<class 'dimos.navigation.movement_manager.movement_manager.Movem..., ('keyboardteleop', 'cmd_vel'): 'tele_cmd_vel'}), requirement_checks=(), configurator_checks=(), hosted_placements=())
.../blueprints/navigation/go2_sim_nav.py:24: in <module>
    from dimos.robot.unitree.go2.blueprints.basic.go2_sim import go2_sim, rerun_blueprint, rerun_config
        Any        = typing.Any
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../navigation/__pycache__/go2_sim_nav.cpython-312.pyc'
        __doc__    = 'Go2 navigation driving the simulated legged Go2 to a clicked goal.'
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/navigation/go2_sim_nav.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x779441103140>
        __name__   = 'dimos.robot.unitree.go2.blueprints.navigation.go2_sim_nav'
        __package__ = 'dimos.robot.unitree.go2.blueprints.navigation'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.navigation.go2_sim_nav', loader=<_frozen_importlib_external.Source...>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/navigation/go2_sim_nav.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x779715976480>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, lite6_ip=None, can...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
        partial    = <class 'functools.partial'>
.../blueprints/basic/go2_sim.py:28: in <module>
    from dimos.simulation.go2_sim.world import SimGo2World
        Any        = typing.Any
        Go2Mid360StaticTf = <class 'dimos.robot.unitree.go2.go2_mid360_static_transforms.Go2Mid360StaticTf'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        ROBOT_HEIGHT = 0.45
        ROBOT_LENGTH = 0.6858
        ROBOT_WIDTH = 0.3175
        TYPE_CHECKING = False
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/go2_sim.cpython-312.pyc'
        __doc__    = 'The legged Go2 with its Mid-360 in a generated office, driven from the rerun viewer.'
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x779441103fb0>
        __name__   = 'dimos.robot.unitree.go2.blueprints.basic.go2_sim'
        __package__ = 'dimos.robot.unitree.go2.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.go2.blueprints.basic.go2_sim', loader=<_frozen_importlib_external.SourceFileLoade...441103fb0>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x779715976480>
        body_on_base_link = <function body_on_base_link at 0x7794457804a0>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, lite6_ip=None, can...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
        partial    = <class 'functools.partial'>
.../simulation/go2_sim/world.py:115: in <module>
    MOUNT_XYZ, MOUNT_R = _mount()
        BOX_EDGES  = array([[[         -1,          -1,          -1],
        [          1,          -1,          -1]],

       [[         ... 1,           1]],

       [[          1,           1,          -1],
        [          1,           1,           1]]])
        BOX_RGBA   = {'ceiling': (0.95, 0.95, 0.95, 1.0), 'clutter': (0.45, 0.55, 0.7, 1.0), 'wall': (0.86, 0.84, 0.78, 1.0)}
        CEILING_GROUP = 1
        CMD_VEL_TIMEOUT = 0.2
        COLLISION_GROUP = 3
        CONTROL_DT = 0.02
        Contact    = <class 'dimos.msgs.sim_msgs.Contacts.Contact'>
        Contacts   = <class 'dimos.msgs.sim_msgs.Contacts.Contacts'>
        DEFAULT_THREAD_JOIN_TIMEOUT = 2.0
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Event      = <class 'threading.Event'>
        FLOOR_CHECKER = ((0.62, 0.6, 0.56), (0.7, 0.68, 0.64))
        FRAMES     = [('base_link', None, (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)), ('front_camera', 'base_link', (0.32715, -3e-05, 0.04297), (0.0...511965976, 0.0)), ('camera_optical', 'front_camera', (0.0, 0.0, 0.0), (-1.5707963267948966, 0.0, -1.5707963267948966))]
        FRAME_DT   = 0.1
        Family     = typing.Literal['office']
        Field      = <function Field at 0x779745ca5300>
        Go2Policy  = <class 'dimos.simulation.go2_legged.policy.Go2Policy'>
        In         = <class 'dimos.core.stream.In'>
        LIDAR_GROUPS = array([1, 1, 1, 0, 0, 0], dtype=uint8)
        LIDAR_HALF_EXTENTS = (0.0325, 0.0325, 0.03)
        LeggedGo2  = <class 'dimos.simulation.go2_legged.robot.LeggedGo2'>
        LineSegments3D = <class 'dimos.msgs.nav_msgs.LineSegments3D.LineSegments3D'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        MujocoRaycaster = <class 'dimos.simulation.sensors.mujoco_raycaster.MujocoRaycaster'>
        NDArray    = numpy.ndarray[tuple[typing.Any, ...], numpy.dtype[~_ScalarT]]
        ODOM_FRAME_ID = 'odom'
        Odometry   = <class 'dimos.msgs.nav_msgs.Odometry.Odometry'>
        Out        = <class 'dimos.core.stream.Out'>
        POINT_RATE = 200000.0
        Part       = typing.Literal['trunk', 'lidar', 'leg', 'foot']
        Path       = <class 'pathlib.Path'>
        PointCloud2 = <class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>
        Pose       = <class 'dimos.msgs.geometry_msgs.Pose.Pose'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Quaternion = <class 'dimos.msgs.geometry_msgs.Quaternion.Quaternion'>
        ROBOT_VISUAL_GROUP = 2
        Rotation   = <class 'scipy.spatial.transform._rotation.Rotation'>
        SCENE_GROUP = 0
        SCENE_PUBLISH_DT = 2.0
        SENSOR_FRAME_ID = 'mid360_link'
        STILL      = array([          0,           0,           0])
        Scene      = <class 'dimos.simulation.scenes.procedural.Scene'>
        SimMid360  = <class 'dimos.simulation.sensors.mid360.lidar.SimMid360'>
        TFMessage  = <class 'dimos.msgs.tf2_msgs.TFMessage.TFMessage'>
        TICKS_PER_FRAME = 5
        Thread     = <class 'threading.Thread'>
        Transform  = <class 'dimos.msgs.geometry_msgs.Transform.Transform'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../go2_sim/__pycache__/world.cpython-312.pyc'
        __doc__    = "The simulated world: a generated scene, the legged Go2 and its Mid-360.\n\nStands in for the Go2 driver and PointLio, publishing PointLio's output contract from\nground truth.\n"
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x779441104500>
        __name__   = 'dimos.simulation.go2_sim.world'
        __package__ = 'dimos.simulation.go2_sim'
        __spec__   = ModuleSpec(name='dimos.simulation.go2_sim.world', loader=<_frozen_importlib_external.SourceFileLoader object at 0x779441104500>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x779440670cc0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x779441070540>
        dataclass  = <function dataclass at 0x7797495c4cc0>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x7795b22916c0>
        generate   = <function generate at 0x779441071d00>
        go2_spec   = <function go2_spec at 0x7794410704a0>
        load_policy = <function load_policy at 0x779441097ec0>
        logger     = <BoundLoggerLazyProxy(logger=<_FixedFindCallerLogger .../simulation/go2_sim/world.py (INFO)>, wrapper_class=<class 'structlog.stdlib.BoundLogger'>, processors=None, context_class=None, initial_values={}, logger_factory_args=())>
        math       = <module 'math' (built-in)>
        mujoco     = <module 'mujoco' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/mujoco/__init__.py'>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/numpy/__init__.py'>
        rpc        = <function rpc at 0x77974271c180>
        setup_logger = <function setup_logger at 0x779741d53420>
        time       = <module 'time' (built-in)>
.../simulation/go2_sim/world.py:111: in _mount
    matrix = edges["front_camera"].to_matrix() @ edges["mid360_link"].to_matrix()
E   AttributeError: 'geometry_msgs__msg__TransformStamped' object has no attribute 'to_matrix'
        edges      = {'camera_optical': geometry_msgs__msg__TransformStamped(header=std_msgs__msg__Header(stamp=builtin_interfaces__msg__Ti...y_msgs/msg/Quaternion'), __msgtype__='geometry_msgs/msg/Transform'), __msgtype__='geometry_msgs/msg/TransformStamped')}
::dimos.simulation.go2_sim.test_command_hold
Stack Traces | 0s run time
.../simulation/go2_sim/test_command_hold.py:19: in <module>
    from dimos.simulation.go2_sim.world import STILL, CommandHold
        __builtins__ = <builtins>
        __cached__ = '.../go2_sim/__pycache__/test_command_hold.cpython-312.pyc'
        __doc__    = None
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/test_command_hold.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7797491a2db0>
        __name__   = 'dimos.simulation.go2_sim.test_command_hold'
        __package__ = 'dimos.simulation.go2_sim'
        __spec__   = ModuleSpec(name='dimos.simulation.go2_sim.test_command_hold', loader=<_pytest.assertion.rewrite.AssertionRewritingHook... 0x7797491a2db0>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/test_command_hold.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/numpy/__init__.py'>
.../simulation/go2_sim/world.py:115: in <module>
    MOUNT_XYZ, MOUNT_R = _mount()
        BOX_EDGES  = array([[[         -1,          -1,          -1],
        [          1,          -1,          -1]],

       [[         ... 1,           1]],

       [[          1,           1,          -1],
        [          1,           1,           1]]])
        BOX_RGBA   = {'ceiling': (0.95, 0.95, 0.95, 1.0), 'clutter': (0.45, 0.55, 0.7, 1.0), 'wall': (0.86, 0.84, 0.78, 1.0)}
        CEILING_GROUP = 1
        CMD_VEL_TIMEOUT = 0.2
        COLLISION_GROUP = 3
        CONTROL_DT = 0.02
        Contact    = <class 'dimos.msgs.sim_msgs.Contacts.Contact'>
        Contacts   = <class 'dimos.msgs.sim_msgs.Contacts.Contacts'>
        DEFAULT_THREAD_JOIN_TIMEOUT = 2.0
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Event      = <class 'threading.Event'>
        FLOOR_CHECKER = ((0.62, 0.6, 0.56), (0.7, 0.68, 0.64))
        FRAMES     = [('base_link', None, (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)), ('front_camera', 'base_link', (0.32715, -3e-05, 0.04297), (0.0...511965976, 0.0)), ('camera_optical', 'front_camera', (0.0, 0.0, 0.0), (-1.5707963267948966, 0.0, -1.5707963267948966))]
        FRAME_DT   = 0.1
        Family     = typing.Literal['office']
        Field      = <function Field at 0x779745ca5300>
        Go2Policy  = <class 'dimos.simulation.go2_legged.policy.Go2Policy'>
        In         = <class 'dimos.core.stream.In'>
        LIDAR_GROUPS = array([1, 1, 1, 0, 0, 0], dtype=uint8)
        LIDAR_HALF_EXTENTS = (0.0325, 0.0325, 0.03)
        LeggedGo2  = <class 'dimos.simulation.go2_legged.robot.LeggedGo2'>
        LineSegments3D = <class 'dimos.msgs.nav_msgs.LineSegments3D.LineSegments3D'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        MujocoRaycaster = <class 'dimos.simulation.sensors.mujoco_raycaster.MujocoRaycaster'>
        NDArray    = numpy.ndarray[tuple[typing.Any, ...], numpy.dtype[~_ScalarT]]
        ODOM_FRAME_ID = 'odom'
        Odometry   = <class 'dimos.msgs.nav_msgs.Odometry.Odometry'>
        Out        = <class 'dimos.core.stream.Out'>
        POINT_RATE = 200000.0
        Part       = typing.Literal['trunk', 'lidar', 'leg', 'foot']
        Path       = <class 'pathlib.Path'>
        PointCloud2 = <class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>
        Pose       = <class 'dimos.msgs.geometry_msgs.Pose.Pose'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Quaternion = <class 'dimos.msgs.geometry_msgs.Quaternion.Quaternion'>
        ROBOT_VISUAL_GROUP = 2
        Rotation   = <class 'scipy.spatial.transform._rotation.Rotation'>
        SCENE_GROUP = 0
        SCENE_PUBLISH_DT = 2.0
        SENSOR_FRAME_ID = 'mid360_link'
        STILL      = array([          0,           0,           0])
        Scene      = <class 'dimos.simulation.scenes.procedural.Scene'>
        SimMid360  = <class 'dimos.simulation.sensors.mid360.lidar.SimMid360'>
        TFMessage  = <class 'dimos.msgs.tf2_msgs.TFMessage.TFMessage'>
        TICKS_PER_FRAME = 5
        Thread     = <class 'threading.Thread'>
        Transform  = <class 'dimos.msgs.geometry_msgs.Transform.Transform'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../go2_sim/__pycache__/world.cpython-312.pyc'
        __doc__    = "The simulated world: a generated scene, the legged Go2 and its Mid-360.\n\nStands in for the Go2 driver and PointLio, publishing PointLio's output contract from\nground truth.\n"
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x77944113af00>
        __name__   = 'dimos.simulation.go2_sim.world'
        __package__ = 'dimos.simulation.go2_sim'
        __spec__   = ModuleSpec(name='dimos.simulation.go2_sim.world', loader=<_frozen_importlib_external.SourceFileLoader object at 0x77944113af00>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x77944124e0c0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x779441070540>
        dataclass  = <function dataclass at 0x7797495c4cc0>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x7795b22916c0>
        generate   = <function generate at 0x779441071d00>
        go2_spec   = <function go2_spec at 0x7794410704a0>
        load_policy = <function load_policy at 0x779441097ec0>
        logger     = <BoundLoggerLazyProxy(logger=<_FixedFindCallerLogger .../simulation/go2_sim/world.py (INFO)>, wrapper_class=<class 'structlog.stdlib.BoundLogger'>, processors=None, context_class=None, initial_values={}, logger_factory_args=())>
        math       = <module 'math' (built-in)>
        mujoco     = <module 'mujoco' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/mujoco/__init__.py'>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/numpy/__init__.py'>
        rpc        = <function rpc at 0x77974271c180>
        setup_logger = <function setup_logger at 0x779741d53420>
        time       = <module 'time' (built-in)>
.../simulation/go2_sim/world.py:111: in _mount
    matrix = edges["front_camera"].to_matrix() @ edges["mid360_link"].to_matrix()
E   AttributeError: 'geometry_msgs__msg__TransformStamped' object has no attribute 'to_matrix'
        edges      = {'camera_optical': geometry_msgs__msg__TransformStamped(header=std_msgs__msg__Header(stamp=builtin_interfaces__msg__Ti...y_msgs/msg/Quaternion'), __msgtype__='geometry_msgs/msg/Transform'), __msgtype__='geometry_msgs/msg/TransformStamped')}
::dimos.simulation.go2_sim.test_world
Stack Traces | 0s run time
.../simulation/go2_sim/test_world.py:25: in <module>
    from dimos.simulation.go2_sim.world import (
        CONTROL_DT = 0.02
        Contact    = <class 'dimos.msgs.sim_msgs.Contacts.Contact'>
        NDArray    = numpy.ndarray[tuple[typing.Any, ...], numpy.dtype[~_ScalarT]]
        OnnxGo2Policy = <class 'dimos.simulation.go2_legged.policy.OnnxGo2Policy'>
        __builtins__ = <builtins>
        __cached__ = '.../go2_sim/__pycache__/test_world.cpython-312.pyc'
        __doc__    = None
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/test_world.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7797491a2db0>
        __name__   = 'dimos.simulation.go2_sim.test_world'
        __package__ = 'dimos.simulation.go2_sim'
        __spec__   = ModuleSpec(name='dimos.simulation.go2_sim.test_world', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x7797491a2db0>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/test_world.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        mujoco     = <module 'mujoco' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/mujoco/__init__.py'>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/numpy/__init__.py'>
        pytest     = <module 'pytest' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/pytest/__init__.py'>
.../simulation/go2_sim/world.py:115: in <module>
    MOUNT_XYZ, MOUNT_R = _mount()
        BOX_EDGES  = array([[[         -1,          -1,          -1],
        [          1,          -1,          -1]],

       [[         ... 1,           1]],

       [[          1,           1,          -1],
        [          1,           1,           1]]])
        BOX_RGBA   = {'ceiling': (0.95, 0.95, 0.95, 1.0), 'clutter': (0.45, 0.55, 0.7, 1.0), 'wall': (0.86, 0.84, 0.78, 1.0)}
        CEILING_GROUP = 1
        CMD_VEL_TIMEOUT = 0.2
        COLLISION_GROUP = 3
        CONTROL_DT = 0.02
        Contact    = <class 'dimos.msgs.sim_msgs.Contacts.Contact'>
        Contacts   = <class 'dimos.msgs.sim_msgs.Contacts.Contacts'>
        DEFAULT_THREAD_JOIN_TIMEOUT = 2.0
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Event      = <class 'threading.Event'>
        FLOOR_CHECKER = ((0.62, 0.6, 0.56), (0.7, 0.68, 0.64))
        FRAMES     = [('base_link', None, (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)), ('front_camera', 'base_link', (0.32715, -3e-05, 0.04297), (0.0...511965976, 0.0)), ('camera_optical', 'front_camera', (0.0, 0.0, 0.0), (-1.5707963267948966, 0.0, -1.5707963267948966))]
        FRAME_DT   = 0.1
        Family     = typing.Literal['office']
        Field      = <function Field at 0x779745ca5300>
        Go2Policy  = <class 'dimos.simulation.go2_legged.policy.Go2Policy'>
        In         = <class 'dimos.core.stream.In'>
        LIDAR_GROUPS = array([1, 1, 1, 0, 0, 0], dtype=uint8)
        LIDAR_HALF_EXTENTS = (0.0325, 0.0325, 0.03)
        LeggedGo2  = <class 'dimos.simulation.go2_legged.robot.LeggedGo2'>
        LineSegments3D = <class 'dimos.msgs.nav_msgs.LineSegments3D.LineSegments3D'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        MujocoRaycaster = <class 'dimos.simulation.sensors.mujoco_raycaster.MujocoRaycaster'>
        NDArray    = numpy.ndarray[tuple[typing.Any, ...], numpy.dtype[~_ScalarT]]
        ODOM_FRAME_ID = 'odom'
        Odometry   = <class 'dimos.msgs.nav_msgs.Odometry.Odometry'>
        Out        = <class 'dimos.core.stream.Out'>
        POINT_RATE = 200000.0
        Part       = typing.Literal['trunk', 'lidar', 'leg', 'foot']
        Path       = <class 'pathlib.Path'>
        PointCloud2 = <class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>
        Pose       = <class 'dimos.msgs.geometry_msgs.Pose.Pose'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Quaternion = <class 'dimos.msgs.geometry_msgs.Quaternion.Quaternion'>
        ROBOT_VISUAL_GROUP = 2
        Rotation   = <class 'scipy.spatial.transform._rotation.Rotation'>
        SCENE_GROUP = 0
        SCENE_PUBLISH_DT = 2.0
        SENSOR_FRAME_ID = 'mid360_link'
        STILL      = array([          0,           0,           0])
        Scene      = <class 'dimos.simulation.scenes.procedural.Scene'>
        SimMid360  = <class 'dimos.simulation.sensors.mid360.lidar.SimMid360'>
        TFMessage  = <class 'dimos.msgs.tf2_msgs.TFMessage.TFMessage'>
        TICKS_PER_FRAME = 5
        Thread     = <class 'threading.Thread'>
        Transform  = <class 'dimos.msgs.geometry_msgs.Transform.Transform'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../go2_sim/__pycache__/world.cpython-312.pyc'
        __doc__    = "The simulated world: a generated scene, the legged Go2 and its Mid-360.\n\nStands in for the Go2 driver and PointLio, publishing PointLio's output contract from\nground truth.\n"
        __file__   = '/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7794411355b0>
        __name__   = 'dimos.simulation.go2_sim.world'
        __package__ = 'dimos.simulation.go2_sim'
        __spec__   = ModuleSpec(name='dimos.simulation.go2_sim.world', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7794411355b0>, origin='/home/ubuntu/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x77944124e020>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x779441070540>
        dataclass  = <function dataclass at 0x7797495c4cc0>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x7795b22916c0>
        generate   = <function generate at 0x779441071d00>
        go2_spec   = <function go2_spec at 0x7794410704a0>
        load_policy = <function load_policy at 0x779441097ec0>
        logger     = <BoundLoggerLazyProxy(logger=<_FixedFindCallerLogger .../simulation/go2_sim/world.py (INFO)>, wrapper_class=<class 'structlog.stdlib.BoundLogger'>, processors=None, context_class=None, initial_values={}, logger_factory_args=())>
        math       = <module 'math' (built-in)>
        mujoco     = <module 'mujoco' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/mujoco/__init__.py'>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/numpy/__init__.py'>
        rpc        = <function rpc at 0x77974271c180>
        setup_logger = <function setup_logger at 0x779741d53420>
        time       = <module 'time' (built-in)>
.../simulation/go2_sim/world.py:111: in _mount
    matrix = edges["front_camera"].to_matrix() @ edges["mid360_link"].to_matrix()
E   AttributeError: 'geometry_msgs__msg__TransformStamped' object has no attribute 'to_matrix'
        edges      = {'camera_optical': geometry_msgs__msg__TransformStamped(header=std_msgs__msg__Header(stamp=builtin_interfaces__msg__Ti...y_msgs/msg/Quaternion'), __msgtype__='geometry_msgs/msg/Transform'), __msgtype__='geometry_msgs/msg/TransformStamped')}

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@TomCC7 TomCC7 closed this Oct 20, 2026
@TomCC7
TomCC7 deleted the cc/feat/cdr-python-tf branch October 20, 2026 18:10

This branch was successfully deployed

1 active deployment
cachix — e530aec6 Deployed Oct 20, 2026 by TomCC7 via cachix-build #13374
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant