Skip to content

refactor(perception): consume generated CDR detection values - #4659

Closed
TomCC7 wants to merge 2 commits into
cc/feat/cdr-python-tffrom
cc/feat/cdr-detection-values
Closed

TomCC7 wants to merge 2 commits into
cc/feat/cdr-python-tffrom
cc/feat/cdr-detection-values

Conversation

@TomCC7

@TomCC7 TomCC7 commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Detection image, calibration, TF, point-cloud and vision-message consumers now use generated values from dimos.messages. Local detection collections keep their existing methods; their export methods produce standard generated vision messages for CDR encoding. This removes the legacy rich-message dependency from the migrated YOLO, 2D/3D module and experimental object accumulation paths.

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

Stack

Base: #4658 (Python TF and its unchanged #4645 recording prerequisite). Remaining detector families, other perception consumers and the final default transport/legacy retirement are follow-up layers; this draft is not the completed runtime cutover. Final stack bases/descriptions will be aligned after those remaining implementation layers.

graph TD
  TF["#4658 generated Python TF"] --> Detect["This PR: generated detection consumers"]
  Detect --> Image["Generated Image + local detection collections"]
  Detect --> Cloud["Generated PointCloud2 + CameraInfo + TransformStamped"]
  Image --> Wire["Generated vision messages / CDR"]
  Cloud --> Wire
Loading

File changes

Category Files Additions Deletions Scope
Detection values and projection 14 345 203 Canonical fields, geometry helpers, selected complete point records and exact source headers
Detector/module consumers and source-time adapter 7 124 80 YOLO image boundaries, module ports, object accumulation, local alignment adapter
VLM generated image boundary 2 35 22 Base/Qwen image conversion and resize; NumPy call compatibility retained; actual JPEG MIME
Behavioral tests and fixture loading 11 741 227 Real recording regression, packet fields/time identity, local assets, deterministic cleanup and mocked external API boundary
Real project CDR fixture 1 3 0 LFS pointer, 5,823,304-byte archive, not generated source code
Self-contained guide 1 44 0 Copyable CPU detector example and generated-value/clock contract
Focused CI 1 16 0 Installed-wheel tests, scoped typing, explicit optional test dependencies

Total relative to #4658: 37 files, 1,308 additions, 532 deletions. Generated-at-build classes are not checked in. The real CDR fixture is a selected conversion of DimOS's approved recording, not copied upstream message definitions.

Manual test

From this PR checkout with the normal perception development dependencies:

uv run pytest dimos/perception/detection/type dimos/models/vl/test_base.py -m self_hosted --import-mode=importlib

For all cases in those two locations, including the fast codec/VLM cases:

uv run pytest dimos/perception/detection/type dimos/models/vl/test_base.py -o addopts='' --import-mode=importlib

Run the complete Python block under Perception / Detections for actual CPU YOLO detection, generated message export and cleanup. The first use obtains the existing project sample/model assets. No robot or API key is required. VLM tests mock only the external OpenAI client and exercise actual resize/JPEG/request construction.

Verification

  • 41 final source + 41 installed-main-wheel cases pass, including real CPU YOLO inference, original real-scene 3D geometry assertions, five-frame object accumulation, detection wire round trips, individual/batched cloud field selection, exact source nanoseconds, source-time alignment and offline VLM request encoding.
  • 59 combined checks including existing timestamp alignment passed; the final focused 41 checks cover the subsequent asset-path/cleanup and import corrections.
  • Strict typing: 23 production files pass. All applicable configured hooks pass.
  • The exact new documentation block executed successfully.
  • Normal main wheel builds; default installed dependency check passes (198 packages compatible). Optional ML proof uses official hash-pinned CPU PyTorch wheels, existing OpenCV-contrib and cached project weights, with no CUDA/system installation.

The new fixture archive SHA256 is 966a7b4d542a58a7891b7c0fc4951e3ea3975c56f52cd99b0a5f0541198d2d40. Its manifest records the approved original archive OID 51a817f2b5664c9e2f2856293db242e030f0edce276e21da0edc2821d947aad2, source entry hashes, recorder timestamps and per-packet CDR hashes/source nanoseconds. Fixture loading verifies packet hashes and exact stamps. The real image/odometry source-clock offset of approximately 58 seconds is preserved; a lookup using the wrong clock is explicitly rejected rather than rewriting data.

Wheel SHA256: 0210891196eaf71505691a6b508ac1d104b9f36450054813d834512e6afa2554.

No terminal CI result is claimed; CI has not been polled. Benchmark investigation remains paused. M20 proprietary SDK access, default-host multicast, Nix derivation evaluation, external viewer sign-in and physical/human acceptance remain separate unverified gates. There are also remaining implementation scopes described above; this PR does not claim only external gates remain.

The preserved remote autofix head is e156b18bdcc1ed0ec1e5ff1d5dc5bf1d3b76a433. Its only change from the validated author commit 94c8d724 removes three inline lint comments in dimos/models/vl/base.py; the parsed Python AST is identical. The categorized table above is pinned to the author commit. No terminal CI result is inferred from this metadata update.

@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: e156b18 Previous: 97344c8 Ratio
peak memory 1728.785 MB 1602.453 MB 1.08
peak threads 371 threads 356 threads 1.04
network (transport) 2724.566 MB 2724.755 MB 1.00
disk write 1.816 MB 1.742 MB 1.04
instructions 133.116 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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/navigation/test_go2_sim_nav.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x101762a80>
        __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...n='/Users/ec2-user/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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a910fa40>
        __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...10fa40>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x10d8c3b00>
        body_on_base_link = <function body_on_base_link at 0x3a4537920>
        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 0x1083f98a0>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a910f980>
        __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 0x3a910f980>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x3a61e4360>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x3a61ce660>
        dataclass  = <function dataclass at 0x101274a40>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x35b9899e0>
        generate   = <function generate at 0x3a61e40e0>
        go2_spec   = <function go2_spec at 0x3a61ce5c0>
        load_policy = <function load_policy at 0x3a61cdf80>
        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 0x10a202020>
        setup_logger = <function setup_logger at 0x10a3c2340>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../go2/blueprints/test_tf_topology.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x101762a80>
        __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...a80>, origin='/Users/ec2-user/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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/navigation/go2_sim_nav.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a9125580>
        __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='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/navigation/go2_sim_nav.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x10d8c3b00>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a9126c00>
        __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...126c00>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../blueprints/basic/go2_sim.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x10d8c3b00>
        body_on_base_link = <function body_on_base_link at 0x3a4537920>
        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 0x1083f98a0>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a9127410>
        __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 0x3a9127410>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x3ac4ae0c0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x3a61ce660>
        dataclass  = <function dataclass at 0x101274a40>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x35b9899e0>
        generate   = <function generate at 0x3a61e40e0>
        go2_spec   = <function go2_spec at 0x3a61ce5c0>
        load_policy = <function load_policy at 0x3a61cdf80>
        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 0x10a202020>
        setup_logger = <function setup_logger at 0x10a3c2340>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/test_command_hold.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x101762a80>
        __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... 0x101762a80>, origin='/Users/ec2-user/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 0x1083f98a0>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a9171160>
        __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 0x3a9171160>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x3a93899e0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x3a61ce660>
        dataclass  = <function dataclass at 0x101274a40>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x35b9899e0>
        generate   = <function generate at 0x3a61e40e0>
        go2_spec   = <function go2_spec at 0x3a61ce5c0>
        load_policy = <function load_policy at 0x3a61cdf80>
        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 0x10a202020>
        setup_logger = <function setup_logger at 0x10a3c2340>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/test_world.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x101762a80>
        __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 0x101762a80>, origin='/Users/ec2-user/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 0x1083f98a0>
        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__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x3a9173f80>
        __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 0x3a9173f80>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../simulation/go2_sim/world.py')
        _mount     = <function _mount at 0x3a9389940>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        apply_fitted_physics = <function apply_fitted_physics at 0x3a61ce660>
        dataclass  = <function dataclass at 0x101274a40>
        frames_to_edge_transforms = <function frames_to_edge_transforms at 0x35b9899e0>
        generate   = <function generate at 0x3a61e40e0>
        go2_spec   = <function go2_spec at 0x3a61ce5c0>
        load_policy = <function load_policy at 0x3a61cdf80>
        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 0x10a202020>
        setup_logger = <function setup_logger at 0x10a3c2340>
        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-detection-values branch October 20, 2026 18:10

This branch was successfully deployed

1 active deployment
cachix — e156b18b Deployed Oct 20, 2026 by autofix-ci[bot] via cachix-build-macos #13377
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