feat: SLAM map persistence for AMCL (Issue #696) #705

Merged
sl-jetson merged 1 commits from sl-perception/issue-696-slam-map-persistence into main 2026-03-20 17:38:30 -04:00
Collaborator

Summary

  • map_persistence.launch.py: launches map_saver_server lifecycle node (nav2_map_server) + saltybot_map_saver helper + lifecycle_manager. Configurable map_dir (default /mnt/nvme/saltybot/maps) and map_name.
  • map_saver_node.py: /saltybot/save_map Trigger service → calls map_saver_cli. Reports saved map status on startup. Auto-saves on shutdown.
  • config/map_saver_params.yaml: map_saver_server params (timeout, thresholds, transient-local QoS).
  • nav2_slam_bringup.launch.py: adds map_dir/map_name args; includes map_persistence.launch.py so map_saver_server runs during SLAM sessions.
  • nav2_amcl_bringup.launch.py: adds map_dir arg; auto-detects /mnt/nvme/saltybot/maps/saltybot_map.yaml at launch time — uses saved map automatically, falls back to placeholder.
  • setup.py: registers new launch, config, and map_saver_node entry point.
  • test_nav2_amcl.py: 21 new tests (params, launch syntax, node behaviour, auto-detect logic).

Workflow

# 1. Build map with SLAM
ros2 launch saltybot_nav2_slam nav2_slam_bringup.launch.py

# 2. Save map (while SLAM is running)
ros2 service call /saltybot/save_map std_srvs/srv/Trigger {}

# 3. Next boot — AMCL auto-loads saved map
ros2 launch saltybot_nav2_slam nav2_amcl_bringup.launch.py

Test plan

  • 56 unit tests pass (python3 -m pytest test/test_nav2_amcl.py)
  • On Jetson: ros2 launch nav2_slam_bringup.launch.py → verify map_saver_server active
  • ros2 service call /saltybot/save_map → verify .yaml/.pgm written to NVMe
  • Restart with nav2_amcl_bringup.launch.py → verify log shows "saved NVMe map"
  • Override: map:=/path/to/custom.yaml still respected

🤖 Generated with Claude Code

## Summary - **map_persistence.launch.py**: launches `map_saver_server` lifecycle node (nav2_map_server) + `saltybot_map_saver` helper + lifecycle_manager. Configurable `map_dir` (default `/mnt/nvme/saltybot/maps`) and `map_name`. - **map_saver_node.py**: `/saltybot/save_map` Trigger service → calls `map_saver_cli`. Reports saved map status on startup. Auto-saves on shutdown. - **config/map_saver_params.yaml**: `map_saver_server` params (timeout, thresholds, transient-local QoS). - **nav2_slam_bringup.launch.py**: adds `map_dir`/`map_name` args; includes `map_persistence.launch.py` so `map_saver_server` runs during SLAM sessions. - **nav2_amcl_bringup.launch.py**: adds `map_dir` arg; auto-detects `/mnt/nvme/saltybot/maps/saltybot_map.yaml` at launch time — uses saved map automatically, falls back to placeholder. - **setup.py**: registers new launch, config, and `map_saver_node` entry point. - **test_nav2_amcl.py**: 21 new tests (params, launch syntax, node behaviour, auto-detect logic). ## Workflow ``` # 1. Build map with SLAM ros2 launch saltybot_nav2_slam nav2_slam_bringup.launch.py # 2. Save map (while SLAM is running) ros2 service call /saltybot/save_map std_srvs/srv/Trigger {} # 3. Next boot — AMCL auto-loads saved map ros2 launch saltybot_nav2_slam nav2_amcl_bringup.launch.py ``` ## Test plan - [x] 56 unit tests pass (`python3 -m pytest test/test_nav2_amcl.py`) - [ ] On Jetson: `ros2 launch nav2_slam_bringup.launch.py` → verify `map_saver_server` active - [ ] `ros2 service call /saltybot/save_map` → verify `.yaml`/`.pgm` written to NVMe - [ ] Restart with `nav2_amcl_bringup.launch.py` → verify log shows "saved NVMe map" - [ ] Override: `map:=/path/to/custom.yaml` still respected 🤖 Generated with [Claude Code](https://claude.com/claude-code)
sl-perception added 1 commit 2026-03-20 16:28:27 -04:00
- New map_persistence.launch.py: launches map_saver_server lifecycle node
  (nav2_map_server) + saltybot_map_saver helper node + lifecycle_manager.
  Configurable map_dir (default /mnt/nvme/saltybot/maps) and map_name.

- New map_saver_node.py: ROS2 node providing /saltybot/save_map (Trigger
  service) that calls nav2_map_server map_saver_cli. On startup logs whether
  a saved map is present. Auto-saves map on shutdown (auto_save_on_shutdown).

- New config/map_saver_params.yaml: map_saver_server params
  (save_map_timeout=5s, free/occupied thresholds, transient-local QoS).

- nav2_slam_bringup.launch.py: adds map_dir + map_name args; includes
  map_persistence.launch.py so map_saver_server runs during SLAM sessions.

- nav2_amcl_bringup.launch.py: adds map_dir arg; auto-detects saved map at
  /mnt/nvme/saltybot/maps/saltybot_map.yaml at launch time and uses it as
  the AMCL map; falls back to placeholder if not found.

- setup.py: registers map_persistence.launch.py, map_saver_params.yaml,
  map_saver_node console_scripts entry point.

- test_nav2_amcl.py: 21 new tests covering params, launch syntax,
  node service/shutdown behaviour, SLAM bringup inclusion, AMCL auto-detect.

Workflow:
  1. ros2 launch saltybot_nav2_slam nav2_slam_bringup.launch.py   (build map)
  2. ros2 service call /saltybot/save_map std_srvs/srv/Trigger {}  (save)
  3. ros2 launch saltybot_nav2_slam nav2_amcl_bringup.launch.py   (auto-loads)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sl-jetson merged commit d235c414e0 into main 2026-03-20 17:38:30 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#705
No description provided.