Skip to content

cuvslam: range-gated depth cloud output - #3537

Draft
jeff-hykin wants to merge 3 commits into
jeff/feat/alfred_cuvslamfrom
jeff/feat/depth_clean_cloud
Draft

cuvslam: range-gated depth cloud output#3537
jeff-hykin wants to merge 3 commits into
jeff/feat/alfred_cuvslamfrom
jeff/feat/depth_clean_cloud

Conversation

@jeff-hykin

@jeff-hykin jeff-hykin commented Aug 19, 2026

Copy link
Copy Markdown
Member

Stacked on #3538 (dimSLAM wheel+IMU/ESKF), which is stacked on #3391.

  • depth_cloud: Out[PointCloud2] — the depth sensor's own points, in its own frame
  • depth_cloud_min_range / depth_cloud_max_range config, default 0 / 4 m
  • pins dimSLAM b8022eb (branch jeff/feat/depth_clean_cloud), which does the deprojection + gate

Measured on the Alfred recording, D455 depth vs a point-lio lidar voxel map (5 cm voxels): ungated IoU 0.0086, 4 m gate 0.0197.

The RealSense driver's own cloud is unfiltered, so every consumer rebuilds the
same range gate. The native module now emits a clean sensor-frame cloud; this
wires up the port and the gate.
@codecov

codecov Bot commented Aug 19, 2026

Copy link
Copy Markdown

❌ 2 Tests Failed:

Tests completed Failed Passed Skipped
3793 2 3791 175
View the top 2 failed test(s) by shortest run time
dimos.robot.test_all_blueprints::test_blueprint_is_valid[alfred-cuvslam]
Stack Traces | 0.019s run time
blueprint_name = 'alfred-cuvslam'

    @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-cuvslam'

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-cuvslam'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'alfred_cuvslam'
        module_path = 'dimos.robot.diy.alfred.blueprints.alfred_cuvslam'
        name       = 'alfred-cuvslam'
.../alfred/blueprints/alfred_cuvslam.py:37: in <module>
    from dimos.robot.diy.alfred.effector_high_level import AlfredHighLevel
        CuvslamOdometry = <class 'dimos.mapping.cuvslam.cuvslam.CuvslamOdometry'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        RealSenseCamera = <class 'dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/alfred_cuvslam.cpython-312.pyc'
        __doc__    = "Alfred localising from its D455 alone, with cuVSLAM instead of the lidar.\n\n    dimos run alfred-cuvslam\n\n``alfred...ing pace.\n``use_gpu`` is off because Alfred's computer has no GPU; the fork-built libcuvslam\ncarries the CPU path.\n"
        __file__   = '/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_cuvslam.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6661d53f50>
        __name__   = 'dimos.robot.diy.alfred.blueprints.alfred_cuvslam'
        __package__ = 'dimos.robot.diy.alfred.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.diy.alfred.blueprints.alfred_cuvslam', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6661d53f50>, origin='/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_cuvslam.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff67336b9e40>
        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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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
    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 0xff666120f470>
__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 0xff666120f470>, 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'>
np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/numpy/__init__.py'>

.../diy/alfred/effector_high_level.py:39: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[alfred-cuvslam]
Stack Traces | 0.026s run time
blueprint_name = 'alfred-cuvslam'

    @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-cuvslam'

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-cuvslam'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'alfred_cuvslam'
        module_path = 'dimos.robot.diy.alfred.blueprints.alfred_cuvslam'
        name       = 'alfred-cuvslam'
.../alfred/blueprints/alfred_cuvslam.py:37: in <module>
    from dimos.robot.diy.alfred.effector_high_level import AlfredHighLevel
        CuvslamOdometry = <class 'dimos.mapping.cuvslam.cuvslam.CuvslamOdometry'>
        MovementManager = <class 'dimos.navigation.movement_manager.movement_manager.MovementManager'>
        RealSenseCamera = <class 'dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/alfred_cuvslam.cpython-312.pyc'
        __doc__    = "Alfred localising from its D455 alone, with cuVSLAM instead of the lidar.\n\n    dimos run alfred-cuvslam\n\n``alfred...ing pace.\n``use_gpu`` is off because Alfred's computer has no GPU; the fork-built libcuvslam\ncarries the CPU path.\n"
        __file__   = '/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_cuvslam.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff87178d8650>
        __name__   = 'dimos.robot.diy.alfred.blueprints.alfred_cuvslam'
        __package__ = 'dimos.robot.diy.alfred.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.diy.alfred.blueprints.alfred_cuvslam', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff87178d8650>, origin='/home/runner/work/dimos/dimos/.../alfred/blueprints/alfred_cuvslam.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff87f9549e40>
        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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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
    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 0xff8717860bc0>
__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 0xff8717860bc0>, 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'>
np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/numpy/__init__.py'>

.../diy/alfred/effector_high_level.py:39: 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.

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