Skip to content

ESDF always returns unknown (-1000) values in 3D mode, despite TSDF updating correctly #154

@Alems8

Description

@Alems8

Summary

I am using Isaac ROS NVBlox as part of the Isaac Manipulator stack (pick-and-place workflow). Since in there it was not working i tried testing nvblox alone to verify the issue and I found out that TSDF integration works perfectly, the live depth map is correctly converted into a TSDF voxel layer and visualized in RViz, however ESDF is never populated. Calling EsdfAndGradients always returns only -1000 (unknown/unobserved) even if:

  • I query directly around a clicked point that clearly lies inside TSDF geometry
  • I query the entire workspace bounding box
  • update_esdf_rate_hz > 0, publish_esdf_distance_slice = true
  • I enable debug logging
    The ESDF slice topic does not appear, even with the relevant params set to true, TSDF visualisation and workspace bounds visualisation both look correct. This suggests that ESDF integration in 3D mode is not running at all, even though TSDF is updating normally.

System configuration

Isaac ROS version: Isaac ROS 4.0
NVBlox version: from Isaac ROS distribution
ROS 2 version: Jazzy inside Isaac ROS container
Platform: Ubuntu 24.04
Hardware:
RealSense D435i mounted on UR10e wrist
Depth → TSDF works perfectly
Running mode: 3D ESDF via manipulator configs

Workspace configuration

/**:
  ros__parameters:

    static_mapper:
      # All voxels that are fully or partially contained in the bounding box 
      # defined by the min / max corners are part of the workspace.
      # The corners are defined in the nvblox `global_frame` (set in ../nvblox_manipulator_base.yaml).
      workspace_bounds_type: "bounding_box" # ["unbounded", "height_bounds", "bounding_box"]
      workspace_bounds_min_corner_x_m: -0.45
      workspace_bounds_min_corner_y_m: -0.59
      workspace_bounds_min_height_m: -1.11
      workspace_bounds_max_corner_x_m: 0.53
      workspace_bounds_max_corner_y_m: 1.1
      workspace_bounds_max_height_m: 2.0

global_frame = "base_link".

Camera configuration

/**:
  ros__parameters:
    camera_name: ''
    device_type: ''
    serial_no: ''
    usb_port_id: ''

    rgb_camera:
      color_profile: '640x480x6'
      profile: '640x480x6' # For backwards compatibility
    color_info_qos: "DEFAULT"
    color_qos: "DEFAULT"

    depth_module:
      depth_profile: '640x480x6'
      infra_profile: '640x480x6'
      profile: '640x480x6' # For backwards compatibility
      emitter_enabled: 1
      emitter_on_off: false
    depth_qos: "DEFAULT"
    depth_info_qos: "DEFAULT"

    infra_qos: "DEFAULT"

    enable_accel: false
    enable_color: true
    enable_depth: true
    enable_gyro: false
    enable_infra1: false
    enable_infra2: false

    pointcloud:
      enable: false

    pointcloud_texture_index: 0
    pointcloud_texture_stream: RS2_STREAM_ANY

    enable_sync: false
    align_depth:
      enable: true

RealSense depth is correctly integrated and the topics are published under:

  • /camera_1/aligned_depth_to_color/image_raw
  • /camera_1/color/image_raw
    NVBlox remappings are correct and verified.

NVBlox params

Here I provide the files related to the configuration I'm using:

nvblox_base.yaml
nvblox_manipulator_base.yaml
nvblox_manipulator_realsense.yaml
And by checking via ros2 param get /nvblox_node ...: all of these are correctly applied at runtime.

Reproduction steps

  1. Launch the Realsense camera
  2. Launch NVBlox with this launch file:
    isaac_ros_nvblox_custom.launch.py
  3. Confirm TSDF works
    In RViz I see a correct TSDF layer corresponding to what the camera is viewing.
  4. Confirm workspace bounding box and slice planes
    The red bounding box and ESDF slice planes appear correctly relative to base_link.
Image
  1. Call ESDF service around a visible TSDF point:
  • ros2 run tf2_ros tf2_echo base_link camera_color_optical_frame -> TF OK
  • Click in RViz to get a point ON the TSDF geometry
  • ros2 topic echo /clicked_point (Example: (x≈0.12, y≈-0.05, z≈0.30))
ros2 service call /nvblox_node/get_esdf_and_gradient \
  nvblox_msgs/srv/EsdfAndGradients \
  "{frame_id: 'base_link',
    aabb_min_m: {x: 0.02, y: -0.15, z: 0.20},
    aabb_size_m: {x: 0.20, y: 0.20, z: 0.20},
    use_aabb: true,
    update_esdf: true,
    visualize_esdf: false}"
  1. Actual result
    Every ESDF voxel returns -1000.0, meaning unknown:
    For small AABBs
    For AABBs covering the entire workspace
    For points definitely within observed TSDF geometry

  2. Debug logging
    Debug logging for nvblox_node shows no error when ESDF integration is called.

What I’ve already verified

  • TSDF is correct
  • TF is correct
  • Workspace bounds correct
  • Params are applied at runtime
  • Both small and large AABBs tested
  • Depth and TSDF messages verified at correct rates
    Reproduced both in:
  • standalone NVBlox launch
  • full Isaac Manipulator workflow

Could you please help me confirm whether: ESDF 3D mode has a regression in the current Isaac ROS NVBlox version? Additional steps are needed to activate 3D ESDF integration? There are known issues for RealSense-wrist-mounted setups or manipulator workflows?
I can provide anything else useful for reproducing

Thank you!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions