又是和ROS1的有所不同
先执行:ros2 run nav2_map_server map_server --ros-args --param yaml_filename:=map/fishbot_map.yaml
再打开rviz2,把设置都改好
再手动激活和配置节点1
2ros2 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 | map_server: |
也可以在一个进程中运行多个地图服务器节点,此时参数文件会按节点名称分隔参数,例如: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}" |