Nav2中的map_server

又是和ROS1的有所不同

先执行:ros2 run nav2_map_server map_server --ros-args --param yaml_filename:=map/fishbot_map.yaml

再打开rviz2,把设置都改好
截图 2025-08-05 14-42-41.png

再手动激活和配置节点

1
2
ros2 lifecycle set /map_server configure  
ros2 lifecycle set /map_server activate

这样才能正常显示地图
在加载map成功后,如果再加载costmap,对应的Rviz里的 Durability Policy 可以不改为 Transient Local

跟ROS1有所不同,不会一直发布/map话题。而且/map不会显示所有地图数据,会用- '...'表示,估计是开发者觉得显示一大堆地图数据没有意义。

也可以在运行时使用load_map服务更改地图


Map Server是一个可组合的 ROS2 节点。默认情况下,有一个map_server可执行文件来实例化这些节点之一,但如果需要,也可以将多个地图服务器节点组合到一个进程中。

Nav2 使用 ROS2 参数机制来获取要使用的 YAML 文件名。这实际上引入了一个间接层来获取地图 yaml 文件名。例如,对于一个名为“map_server”的节点,参数文件看起来是这样的:

1
2
3
map_server:
ros__parameters:
yaml_filename: "map.yaml"

也可以在一个进程中运行多个地图服务器节点,此时参数文件会按节点名称分隔参数,例如:

1
2
3
4
5
6
7
8
# combined_params.yaml
map_server1:
ros__parameters:
yaml_filename: "some_map.yaml"

map_server2:
ros__parameters:
yaml_filename: "another_map.yaml"

然后,使用包含两个节点参数的参数文件来启动该进程:process_with_multiple_map_servers __params:=combined_params.yaml

保存地图

ros2 run nav2_map_server map_saver_cli [arguments] [--ros-args ROS remapping args]

比如:ros2 run nav2_map_server map_saver_cli -f test

两个 service

1
ros2 service call /map_server/load_map nav2_msgs/srv/LoadMap "{map_url: /ros/maps/map.yaml}"
1
ros2 service call /map_saver/save_map nav2_msgs/srv/SaveMap "{map_topic: map, map_url: my_map, image_format: pgm, map_mode: trinary, free_thresh: 0.25, occupied_thresh: 0.65}"