ros中的map_server package分析

map_server package有两个节点:

1.map_server node:读取地图信息,并作为ROS service 为其余节点提供地图数据

2.map_saver node:保存现有扫描到的地图信息

启动map_server节点:

<!-- Map server -->
  <arg name="map_file" default="$(env TURTLEBOT_MAP_FILE)"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />

如果现有地图,则需要配置环境变量TURTLEBOT_MAP_FILE,这样打开rviz就可以看到配置的地图信息。地图文件指的不是图片pgm文件,而是yaml的配置文件。

注意:map_server是一个node,非nodelete

或者使用命令:

rosrun map_server map_server mymap.yaml

启动map_saver节点:

rosrun map_server map_saver -f ~/map/hokuyo_gmapping

地图文件:

从上面的地图可以看出,黑色的网格是障碍区域,白色的网格是无障碍区域,灰色的网格是未知区域。

map_server从图片中读取信息然后将每个网格都赋值[-1,100],灰色是-1,白色是0,黑色是100。未来可能会有更深层的分析使得赋值为(0,100)。

地图配置文件
保存下的地图都有一个yaml的配置文件,和地图pgm文件名字相同

yaml文件里面的内容

image: /home/ubuntu/map/hokuyo_kinco_gmapping_1011_1720.pgm
resolution: 0.050000
origin: [-13.800000, -13.800000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

image: 地图路径,可以是全路径或者是yaml文件所在的相对路径

resolution: 地图分辨率,米/像素

origin: 最左下角像素在地图中的2d位置(x,y,yaw),yaw为偏转(逆时针),当yaw=0时没有片转。许多系统的其余部分忽略yaw

negate:是否对white/black free/occupied定于的语义进行翻转,对occupied_thresh/free_thresh无影响。

occupied_thresh:大于这个阀值的占用率的像素被认为occupied。

free_thresh:小于这个阀值的占用率的像素被认为是free。

map_server API

1.订阅的主题:

map_metadata (nav_msgs/MapMetaData):接收地图的元数据
map (nav_msgs/OccupancyGrid):接受以地图
2. 服务
static_map (nav_msgs/GetMap):提供检索地图服务
3. 参数
~frame_id (string, default: "map"):地图坐标系的名称

map_saver API

1.发布的主题:

map (nav_msgs/OccupancyGrid) :通过这个主题,地图可以被检索

经验分享 程序员 微信小程序 职场和发展