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) :通过这个主题,地图可以被检索
