【ROS】map_server 地图的保存和加载
前言
在 ROS 中,想要实现导航功能,首先需要一张已建好的地图。导航系统依赖这张地图进行路径规划、定位和障碍物避让等操作。本文将讲解在使用 gmapping
或 hector_mapping
建图后,如何保存和加载地图。
本章面向 ROS 初学者,系统地讲解地图的保存与加载流程,为后续的定位与导航功能奠定基础。
我的环境:
本教程使用的环境是:实体 ROS 小车,Ubuntu 18.04,ROS1 Melodic
参考资料:
地图的保存
关于地图保存,可参考 map_server 文档 2.2 小节,如下图所示:
地图保存的原理是:将当前发布在 /map
话题中的地图数据保存为本地文件。
因此,只有在建图(如 Gmapping 或 Hector 等)已经完成并且 /map
话题正在发布数据的前提下,才能执行保存操作。
常用命令:
假设我们要把地图保存到主目录下的 map
文件夹中,文件名为 my_map
,命令如下:
rosrun map_server map_saver -f ~/map/my_map
执行后会生成两个文件:
my_map.pgm
(地图图像)my_map.yaml
(地图元数据,包括分辨率、原点等)
地图的加载
关于地图加载,可参考 map_server 文档 2.1 小节,如下图所示:
地图加载的原理:将本地保存的地图配置文件(.yaml 文件)解析,并将静态地图数据发布到 /map 话题,供其他节点(如导航)订阅使用。
单独发布地图:测试地图加载
假设你已经将地图保存到主目录下的 map
文件夹中,地图元数据文件为 my_map.yaml
,可以使用以下命令加载并发布地图:
rosrun map_server map_server ~/map/my_map.yaml
执行该命令后:
map_server
节点会自动读取:my_map.yaml
(地图元数据)my_map.pgm
(地图图像)
- 并持续发布
/map
话题,供导航、定位等模块使用。
集成到 Launch 文件中:一键加载地图
为了将地图加载集成到启动流程中,只需在你的 .launch
文件中添加如下内容:
<node name="map_server" pkg="map_server" type="map_server"
args="$(find your_package)/maps/your_map.yaml" output="screen">
<param name="frame_id" value="map" />
</node>
这样,在运行该 launch
文件时,map_server
节点就会自动加载指定地图,并开始发布 /map
话题,方便与 AMCL、move_base 等模块配合使用,实现自动导航。