- 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>
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
from setuptools import setup
|
|
|
|
package_name = "saltybot_nav2_slam"
|
|
|
|
setup(
|
|
name=package_name,
|
|
version="0.1.0",
|
|
packages=[package_name],
|
|
data_files=[
|
|
("share/ament_index/resource_index/packages", [f"resource/{package_name}"]),
|
|
(f"share/{package_name}", ["package.xml"]),
|
|
(f"share/{package_name}/launch", [
|
|
"launch/nav2_slam_bringup.launch.py",
|
|
"launch/nav2_slam_integrated.launch.py",
|
|
"launch/depth_to_costmap.launch.py",
|
|
"launch/odometry_bridge.launch.py",
|
|
"launch/nav2_amcl_bringup.launch.py",
|
|
"launch/map_persistence.launch.py",
|
|
]),
|
|
(f"share/{package_name}/config", [
|
|
"config/nav2_params.yaml",
|
|
"config/slam_toolbox_params.yaml",
|
|
"config/costmap_common_params.yaml",
|
|
"config/global_costmap_params.yaml",
|
|
"config/local_costmap_params.yaml",
|
|
"config/dwb_local_planner_params.yaml",
|
|
"config/vesc_odometry_params.yaml",
|
|
"config/amcl_nav2_params.yaml",
|
|
"config/map_saver_params.yaml",
|
|
]),
|
|
(f"share/{package_name}/maps", [
|
|
"maps/saltybot_map.yaml",
|
|
"maps/saltybot_map.pgm",
|
|
]),
|
|
],
|
|
install_requires=["setuptools"],
|
|
zip_safe=True,
|
|
maintainer="sl-controls",
|
|
maintainer_email="sl-controls@saltylab.local",
|
|
description="Nav2 SLAM integration with RPLIDAR + RealSense for autonomous navigation",
|
|
license="MIT",
|
|
tests_require=["pytest"],
|
|
entry_points={
|
|
"console_scripts": [
|
|
"vesc_odometry_bridge = saltybot_nav2_slam.vesc_odometry_bridge:main",
|
|
"vesc_can_odometry = saltybot_nav2_slam.vesc_odometry_bridge:main",
|
|
"map_saver_node = saltybot_nav2_slam.map_saver_node:main",
|
|
],
|
|
},
|
|
)
|