map与costmap都是以nav_msgs::OccupancyGrid类型发布其topic。
nav_msgs::OccupancyGrid类型分析看帖子:http://t.zoukankan.com/flyinggod-p-13463249.html
其中整张地图的障碍物信息存放在data数据成员中,data是一个int8类型的vector向量,即一维数组。假设一张pgm的map地图,宽:width(单位像素),高:height(单位像素),分辨率为resolution(单位 meter/pixel)。
左下角像素点在世界坐标系下的位置为:(ox,oy)单位米,那么世界坐标系下一点(x,y)单位米,假设其在地图中,那么该点对应的data中的索引index为:
index = (x-ox)/resolution+(y-oy)/resolution*width
(注:index为int8类型,所以要将结果进行下类型转换),
那么该点在地图中的信息即为data[index]
即:data是按照那张地图图片的自底向上,自左至右逐个像素点存储的(行逆序、列顺序)
map中data存储的格式如下:
0:空白区域
100:障碍物
-1:未知
1-99:根据像素的灰度值转换后的值,代表有障碍物的概率(不确定,猜测是这个含义,实际用的时候把这个值都当作无障碍物)
【打印nav_msgs::OccupancyGrid发现,map的data中只存有0,100,-1,三种信息,没有1-99】
引申:通过像素点值来判断 占用/自由
0为黑(占用),255为白(自由)
像素点占用概率 p= (255 - color_avg) / 255.0
-
如果p > occupied_thresh(0.65),输出值为100,表示被占用
-
如果p < free_thresh(0.196),则输出值为0,表示空闲
-
否则,输出值为 -1,表示单元格未知
costmap中data存储格式如下:
0:空白区域
100:障碍物层
99:膨胀层
1-98:距离障碍物层的远近获得的代价值
-1:未知区域