一.地图栅格消息nav_msgs/OccupancyGrid
// 栅格地图消息
std_msgs/Header header
nav_msgs/MapMetaData info
time map_load_time
float32 resolution // 分辨率
geometry_msgs/Pose origin // 原点坐标
geometry_msgs/Quaternion orientation
int8[] data // 地图像素信息// 栅格地图参数
grid_map.info.resolution = 0.5; // 分辨率
grid_map.info.origin.x = -20; // 栅格地图原点x
grid_map.info.origin.y = -20; // 栅格地图原点y
grid_map.info.width = 100; // 栅格地图宽,定义尺寸
grid_map.info.height = 100; // 栅格地图高,定义尺寸
1.resolution
在ROS的地图中,地图是以像素标记的,每一个像素(map.info.resolution)代表0.05米/像素,即地图的分辨率为0.05m;
resolution=0.05,代表每个栅格对应“0.05m×0.05m”;
例如,下图上的星星,他的位置在像素层面上的坐标为(400, 150),则x:400像素,y:150像素。这个机器人距离地图原点的实际距离是:横坐标方向为400 * 0.05=20m,纵坐标方向为150 * 0.05=7.5m。
2.X、Y
设置地图原点
// 将栅格地图原点设置在整张图的(-20, -20)位置
grid_map.info.origin.x = -20;
grid_map.info.origin.y = -20;
3.width、height
栅格地图索引保存方式:
4 8 12
3 7 11
2 6 10
1 5 9
实际地图中某点坐标为(x,y)
,对应栅格地图中坐标为:
[x*map.info.width+y]
4.data[ ]
其中整张地图的障碍物信息存放在data数据成员中,data是一个int8类型的vector向量,即一维数组。假设一张pgm的map地图,宽:width,高:height,单位为像素,分辨率为resolution,左下角像素点在世界坐标系下的位置为:(origin_x,origin_y),单位米,那么世界坐标系下一点(x,y)单位米,假设其在地图中,那么该点对应的data中的索引index为:
index = (int)((x - origin_x) / resolution) + ((int)((y - origin_y) / resolution)) * width;
那么该点在地图中的信息即为data[index]
即:data是按照那张地图图片的自底向上,自左至右逐个像素点存储的
例如:栅格地图index保存方式:
4 8 12
3 7 11
2 6 10
1 5 9
map中data存储的格式如下:
0:空白区域
100:障碍物
-1:未知
1-99:根据像素的灰度值转换后的值,代表有障碍物的概率
参考:
ROS中map、costmap数据格式_cjn_的博客-CSDN博客_costmap坐标系和map坐标系
ROS-建图-栅格坐标系_0->oo的博客-CSDN博客_ros修改建图分辨率
world/map坐标系、updateOrigin、footprintCost - C洼
二.costmap
NO_INFORMATION = 255 未知空间
LETHAL_OBSTACLE = 254 说明该单元格中存在一个实际的障碍。若机器人的中心在该单元格中,机器人必然会跟障碍物相撞
INSCRIBED_INFLATED_OBSTACLE = 253 说明该单元格离障碍物的距离小于机器人内切圆半径。若机器人的中心位于等于或高于"Inscribed" cost的单元格,机器人必然会跟障碍物相撞
FREE_SPACE = 0 没有障碍的空间