ROS-建图-栅格坐标系
一、栅格地图参数
1.1 像素坐标系
下图是一个机器人在实际环境中绘制的二维地图,图片中左下角是地图原点(map.info.origin),在原点上已经标明了这个地图的三维坐标轴,其中红色的代表x轴方向,绿色代表y轴方向。
// 此时栅格地图原点为(0, 0)
grid_map.info.origin.x = 0;
grid_map.info.origin.y = 0;
在ROS的地图中,地图是以像素标记的,每一个像素(map.info.resolution)代表0.05m,即地图的分辨率为0.05m。
例如,下图上的星星,他的位置在像素层面上的坐标为(400, 150),则x:400像素,y:150像素。这个机器人距离地图原点的实际距离是:横坐标方向为400 * 0.05=20m,纵坐标方向为150 * 0.05=7.5m。
1.2 地图原点
我们在设置栅格地图原点时,地图的原点并不一定在左下角,可以将栅格地图原点设置在所建栅格地图中间任一位置上。
// 将栅格地图原点设置在整张图的(-20, -20)位置
grid_map.info.origin.x = -20;
grid_map.info.origin.y = -20;
此时,这张图的地图原点就跑到了地图图片里,如果车辆处在原点左下角的位置,那么车辆的X和Y像素坐标就会为负值。
1.3 栅格地图消息格式
在ROS中,地图的类型是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; // 栅格地图高,定义尺寸