Skip to content

NavMap maps manager: local NavMap around the robot - #120

Merged
fmrico merged 1 commit into
rollingfrom
navmap_local_mode
Oct 15, 2026
Merged

fmrico merged 1 commit into
rollingfrom
navmap_local_mode

Conversation

@fmrico

@fmrico fmrico commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #119

With <plugin>.local.enabled, the NavMap maps manager keeps a NavMap around the robot, in its frame, rebuilt continuously from the point perceptions in NavState. Each rebuild:

  1. accumulates the scans in odom over local.accumulate_time (a single 3D scan is sparse rings);
  2. crops them to the window (local.range, local.min_z/max_z) in local.frame and voxelizes them;
  3. meshes them with navmap_ros::from_points (local.resolution, max_dz, max_slope_deg, min_clearance, min_surface_area, max_hole_area);
  4. publishes the NavMap on <plugin>/map and puts it in NavState, where the filters run on it as usual.
Grabacion.de.pantalla.desde.2026-10-15.12-59-24.mp4

The parameters are documented in the package README.

Fixes found on the way

  • A new map now replaces the one in NavState. Before, only the first map ever got there: a map received later on incoming_occ_map / incoming_pc2_map was published but never used.
  • The ObstacleFilter works in the NavMap's own frame, not always in map.
  • The InflationFilter skips an empty NavMap instead of logging an error.

Validation

Summit XL in the URJC excavation (launch in EasyNavigation/easynav_playgrounds, separate PR), headless, driving 15 s with /cmd_vel:

  • Maps: the first one after 8 s, then one every 0.5 s (local.freq: 2), always in base_footprint, following the robot.
  • Coverage: 67–181 m² of the 16 × 16 m window. The rest is the lidar's blind zone near the robot, occlusions and slopes over the mesher's limit.
  • Log: no errors.

Tests

  • New (navmap_local_mode_tests):
    • the NavMap is built in the robot frame, cropped to the window, with the ground at its height;
    • it follows the robot and replaces the map in NavState;
    • the mode is disabled by default;
    • nothing breaks without an odom → robot transform.
  • The whole package suite passes, linters included: 119 tests.

Fixes #119

- Local mode (local.* parameters): the maps manager keeps a NavMap around the
  robot, in its frame, rebuilt at local.freq from the point perceptions in
  NavState (accumulated in odom over local.accumulate_time, cropped to the
  window and meshed with navmap_ros::from_points). Each rebuild is published
  and replaces the map in NavState.
- A new map (received or rebuilt) now replaces the one in NavState; before,
  only the first one ever got there.
- ObstacleFilter works in the NavMap's own frame, not always in map.
- InflationFilter skips an empty NavMap instead of logging an error.

Signed-off-by: Francisco Martín Rico <fmrico@gmail.com>
@fmrico
fmrico merged commit 56fee8b into rolling Oct 15, 2026
1 check passed
@fmrico
fmrico deleted the navmap_local_mode branch October 15, 2026 13:47
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.

NavMap maps manager: local NavMap around the robot, rebuilt from its sensors

1 participant