一般来说,gmapping是一种增量式的建图方法,一般用于小场景的地图构建,而大场景的地图构建方法一般选择基于图优化的方法,代表有cartographer,通过开源的算法得到地图后,但是对于移动机器人在大场景下的定位有一个问题:启动定位,一次性加载地图并完成代价计算相当耗时,这时就需要作地图分割,根据里程计推算或者GPS的定位完成分块加载地图。
1.将.pgm地图转为.png格式
这里用了Ubuntu下的KolourPaint软件进行转换,理想的方式还是需要自己用代码实现。这里先展示一下由.pgm转换后的.png图片,看不出变化,只是编码方式不同而已。
对应的yaml文件如下:
image: map_2020307.png
resolution: 0.025000
origin: [-27.400000, -27.400000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196
2.分割的目标
由gmapping生成的地图包含一张.png
格式的栅格地图及对应的.yaml
配置文件,将全局栅格地图划分成边长为10m
的正方形,按列优顺序生成子图。每个子图命名为"i_j.png“,其中i表示列数,j表示行数。
3.需要注意的几点
1)分割的边长(m)/地图分辨率(m/pixel)=子图边长对应像素(pixel)
行/列方向上子图的个数=地图的大小(pixel)/子图边长对应的像素(pixel)
3)原全局地图(.png)要想转换为多个子图,必须有一个中间地图。因为在完成行列方向上子图个数计算时时这样的:
width_num_=ceil(map_.cols/double(submap_size_));
height_num_=ceil(map_.cols/double(submap_size_));
也即是取整计算,那么按照这个方式还原回原来的栅格地图,大小是不一样的,因此需要重新考虑地图占据、空闲以及未知状态的定义。方法可以参考map_server。
4)如3)所说,地图的大小变化了,那么相应的地图原点也需要重新计算。