Skip to content

alfred-mls-nav on the single DimSlam module - #3597

Draft
jeff-hykin wants to merge 7 commits into
jeff/fix/ray_tracing_tffrom
jeff/feat/alfred_dim_slam
Draft

alfred-mls-nav on the single DimSlam module#3597
jeff-hykin wants to merge 7 commits into
jeff/fix/ray_tracing_tffrom
jeff/feat/alfred_dim_slam

Conversation

@jeff-hykin

Copy link
Copy Markdown
Member

Stacked on jeff/feat/dim_slam and jeff/fix/ray_tracing_tf; final branch of the stack.

  • alfred-mls-nav runs the single DimSlam module: cuVSLAM on the D455 IR pair + ESKF over visual, wheel odometry and the D455 IMU, in one process
  • merges the robot-proven alfred work from jeff/feat/alfred-mls-nav: rerun camera layout, D455 mount transform, world_frame="odom" on the voxel map, effector event-loop fix, 2 s replay buffer
  • CuvslamOdometry + OdometryFusion blueprint pair replaced by one DimSlam.blueprint; alfred_cuvslam.py and odometry_fusion.py removed
  • demo-cuvslam-replay moves to dimos/mapping/dim_slam and drives DimSlam

@codecov

codecov Bot commented Aug 21, 2026

Copy link
Copy Markdown

❌ 2 Tests Failed:

Tests completed Failed Passed Skipped
3794 2 3792 175
View the top 2 failed test(s) by shortest run time
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[alfred-mls-nav]
Stack Traces | 0.021s run time
blueprint_name = 'alfred-mls-nav'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
>       blueprint = _get_blueprint_or_skip(blueprint_name)

blueprint_name = 'alfred-mls-nav'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'alfred-mls-nav'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'alfred_mls_nav'
        module_path = 'dimos.robot.diy.alfred.blueprints.alfred_mls_nav'
        name       = 'alfred-mls-nav'
.../alfred/blueprints/alfred_mls_nav.py:50: in <module>
    from dimos.robot.diy.alfred.effector_high_level import AlfredHighLevel
        DanHolonomicTC = <class 'dimos.navigation.dannav.holonomic_tc.module.DanHolonomicTC'>
        DanLocalPlanner = <class 'dimos.navigation.dannav.local_planner.module.DanLocalPlanner'>
        DimSlam    = <class 'dimos.mapping.dim_slam.dim_slam.DimSlam'>
        GoalRelay  = <class 'dimos.navigation.nav_3d.mls_planner.goal_relay.GoalRelay'>
        MLSPlannerNative = <class 'dimos.navigation.nav_3d.mls_planner.mls_planner_native.MLSPlannerNative'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        Path       = <class 'pathlib.Path'>
        Quaternion = <class 'dimos.msgs.geometry_msgs.Quaternion.Quaternion'>
        RayTracingVoxelMap = <class 'dimos.mapping.ray_tracing.module.RayTracingVoxelMap'>
        RealSenseCamera = <class 'dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera'>
        Transform  = <class 'dimos.msgs.geometry_msgs.Transform.Transform'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/alfred_mls_nav.cpython-312.pyc'
        __doc__    = 'Alfred running MLS planning off the D455 alone, with no Mid-360.\n\n    dimos run alfred-mls-nav\n\n``alfred_nav`` ne...many voxels\nas ray tracing and ate the walls MLS needs to plan around (IoU 0.076 vs 0.107, recall\n0.200 vs 0.292).\n'
        __file__   = '/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_mls_nav.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff796529a4b0>
        __name__   = 'dimos.robot.diy.alfred.blueprints.alfred_mls_nav'
        __package__ = 'dimos.robot.diy.alfred.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.diy.alfred.blueprints.alfred_mls_nav', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff796529a4b0>, origin='/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_mls_nav.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff7a36b99e40>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev..._host='127.0.0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None)
        partial    = <class 'functools.partial'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2025-2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Alfred high-level control via Portal RPC.
    
    Subscribes to ``cmd_vel`` and forwards each Twist to the Alfred controller
    as a holonomic target velocity. The controller performs the wheel-level
    kinematics on-board, so this module hands off ``(vx, vy, wz)`` rather than
    computing per-wheel speeds locally.
    
    Frame convention: Alfred uses an inverted Y-axis vs. ROS, so ``vy`` and
    ``wz`` are negated before being sent to the hardware.
    
      Standard (ROS):     Alfred:
          +Y                -Y
          ↑                  ↑
       ───┼──→ +X         ───┼──→ +X
          |                  |
    """
    
    from __future__ import annotations
    
    import asyncio
    from collections.abc import AsyncGenerator
    import math
    import time
    from typing import Any
    
    import numpy as np
>   import portal
E   ModuleNotFoundError: No module named 'portal'

Any        = typing.Any
AsyncGenerator = <class 'collections.abc.AsyncGenerator'>
__builtins__ = <builtins>
__cached__ = '.../alfred/__pycache__/effector_high_level.cpython-312.pyc'
__doc__    = 'Alfred high-level control via Portal RPC.\n\nSubscribes to ``cmd_vel`` and forwards each Twist to the Alfred controll...      +Y                -Y\n      ↑                  ↑\n   ───┼──→ +X         ───┼──→ +X\n      |                  |\n'
__file__   = '.../diy/alfred/effector_high_level.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff7965806f60>
__name__   = 'dimos.robot.diy.alfred.effector_high_level'
__package__ = 'dimos.robot.diy.alfred'
__spec__   = ModuleSpec(name='dimos.robot.diy.alfred.effector_high_level', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff7965806f60>, origin='.../diy/alfred/effector_high_level.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
asyncio    = <module 'asyncio' from '.../usr/lib/python3.12/asyncio/__init__.py'>
math       = <module 'math' (built-in)>
np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/numpy/__init__.py'>
time       = <module 'time' (built-in)>

.../diy/alfred/effector_high_level.py:41: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[alfred-mls-nav]
Stack Traces | 0.022s run time
blueprint_name = 'alfred-mls-nav'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'alfred-mls-nav'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'alfred-mls-nav'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'alfred_mls_nav'
        module_path = 'dimos.robot.diy.alfred.blueprints.alfred_mls_nav'
        name       = 'alfred-mls-nav'
.../alfred/blueprints/alfred_mls_nav.py:50: in <module>
    from dimos.robot.diy.alfred.effector_high_level import AlfredHighLevel
        DanHolonomicTC = <class 'dimos.navigation.dannav.holonomic_tc.module.DanHolonomicTC'>
        DanLocalPlanner = <class 'dimos.navigation.dannav.local_planner.module.DanLocalPlanner'>
        DimSlam    = <class 'dimos.mapping.dim_slam.dim_slam.DimSlam'>
        GoalRelay  = <class 'dimos.navigation.nav_3d.mls_planner.goal_relay.GoalRelay'>
        MLSPlannerNative = <class 'dimos.navigation.nav_3d.mls_planner.mls_planner_native.MLSPlannerNative'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        Path       = <class 'pathlib.Path'>
        Quaternion = <class 'dimos.msgs.geometry_msgs.Quaternion.Quaternion'>
        RayTracingVoxelMap = <class 'dimos.mapping.ray_tracing.module.RayTracingVoxelMap'>
        RealSenseCamera = <class 'dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera'>
        Transform  = <class 'dimos.msgs.geometry_msgs.Transform.Transform'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/alfred_mls_nav.cpython-312.pyc'
        __doc__    = 'Alfred running MLS planning off the D455 alone, with no Mid-360.\n\n    dimos run alfred-mls-nav\n\n``alfred_nav`` ne...many voxels\nas ray tracing and ate the walls MLS needs to plan around (IoU 0.076 vs 0.107, recall\n0.200 vs 0.292).\n'
        __file__   = '/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_mls_nav.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff31bc8f84a0>
        __name__   = 'dimos.robot.diy.alfred.blueprints.alfred_mls_nav'
        __package__ = 'dimos.robot.diy.alfred.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.diy.alfred.blueprints.alfred_mls_nav', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff31bc8f84a0>, origin='/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_mls_nav.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff328e4f1e40>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev..._host='127.0.0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None)
        partial    = <class 'functools.partial'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2025-2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Alfred high-level control via Portal RPC.
    
    Subscribes to ``cmd_vel`` and forwards each Twist to the Alfred controller
    as a holonomic target velocity. The controller performs the wheel-level
    kinematics on-board, so this module hands off ``(vx, vy, wz)`` rather than
    computing per-wheel speeds locally.
    
    Frame convention: Alfred uses an inverted Y-axis vs. ROS, so ``vy`` and
    ``wz`` are negated before being sent to the hardware.
    
      Standard (ROS):     Alfred:
          +Y                -Y
          ↑                  ↑
       ───┼──→ +X         ───┼──→ +X
          |                  |
    """
    
    from __future__ import annotations
    
    import asyncio
    from collections.abc import AsyncGenerator
    import math
    import time
    from typing import Any
    
    import numpy as np
>   import portal
E   ModuleNotFoundError: No module named 'portal'

Any        = typing.Any
AsyncGenerator = <class 'collections.abc.AsyncGenerator'>
__builtins__ = <builtins>
__cached__ = '.../alfred/__pycache__/effector_high_level.cpython-312.pyc'
__doc__    = 'Alfred high-level control via Portal RPC.\n\nSubscribes to ``cmd_vel`` and forwards each Twist to the Alfred controll...      +Y                -Y\n      ↑                  ↑\n   ───┼──→ +X         ───┼──→ +X\n      |                  |\n'
__file__   = '.../diy/alfred/effector_high_level.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff31bc315130>
__name__   = 'dimos.robot.diy.alfred.effector_high_level'
__package__ = 'dimos.robot.diy.alfred'
__spec__   = ModuleSpec(name='dimos.robot.diy.alfred.effector_high_level', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff31bc315130>, origin='.../diy/alfred/effector_high_level.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
asyncio    = <module 'asyncio' from '.../usr/lib/python3.12/asyncio/__init__.py'>
math       = <module 'math' (built-in)>
np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/numpy/__init__.py'>
time       = <module 'time' (built-in)>

.../diy/alfred/effector_high_level.py:41: ModuleNotFoundError

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

@jeff-hykin
jeff-hykin force-pushed the jeff/feat/alfred_dim_slam branch from 338aa41 to 2259bc2 Compare August 21, 2026 10:48
@jeff-hykin
jeff-hykin changed the base branch from jeff/feat/dim_slam to jeff/fix/ray_tracing_tf August 21, 2026 10:48
@jeff-hykin
jeff-hykin force-pushed the jeff/fix/ray_tracing_tf branch from c8e8540 to c256a9e Compare August 21, 2026 22:47
The camera pointcloud was a 5 fps stand-in on the lidar stream and needed
colour streaming to assemble at all. DimSlam's depth_cloud follows the depth
frame rate and carries the range gate, so RayTracingVoxelMap consumes it
directly and the camera stops assembling a pointcloud nothing reads.
The camera's python pointcloud assembly tops out near 5 Hz regardless of
pointcloud_fps, and the full-resolution depth_cloud drowned the mapper.
DimSlam now publishes the cloud range-gated at 6 m and 3x3-median
decimated (42 mm pitch at the gate, under the 50 mm voxel), and
RayTracingVoxelMap consumes it in place of the camera pointcloud.
@jeff-hykin
jeff-hykin force-pushed the jeff/feat/alfred_dim_slam branch from b0e9b0b to c75734b Compare August 21, 2026 22:48
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