机器人的地图表示方式有多种,如拓扑地图、特征地图、直接表征法、栅格地图等。其中,栅格地图应用广泛,方便用于机器人的导航规划中。下面就是一个占用栅格地图的例子:
一般有一个地图和一个.yaml文件。 map_server是一个ROS node,可以从磁盘读取地图并使用ROS service提供地图。 目前实现的map_server可将地图中的颜色值转化成三种占用值:free (0), occupied (100), and unknown (-1). 未来可用0~100之间的不同值指示占用度。map_server使得地图的数据变成 ros 的service 可以被调用,其中以两种方式存储。一个是yaml文件,他存储了数据的元数据。一个是image file 他编码了地图的占据性情况。其中 image file 中白色像素是空的,黑色像素是被占据的。色彩或者灰色的是被接受的。
问题1:如何将orgin转换成实际地图中的位置?
1.确定地图的坐标系,为最右上角的像素为坐标(0,0)
整副地图都处于坐标系的第三像限
2.解析origin x=-2.5m y=-1.6m,将x,y的值除以分辨率resolution(米/像素)
得出x=-50个像素,y为-32个像素
从地图的最右上角像素数,往左数第50个像素,再往下数第32个像素,就是orgin所代表的机器人初始位置。
问题2:如何在导航中实时显示机器人的位置
1.确定机器人本身的坐标系,一般是base_footprint或者base_link,在2d的地图上这两者基本没有区别,可选取其中一个
2.获取从map到base_footprint的tf变换,代表机器人以orgin位置为原点的坐标系上位置。
3.orgin中的x,y(减去/加上)tf变换中的x,y,就是当前机器人的当前位置,再除以resolution,就是地图中机器人位置所在的像素。
map_server是一个ROS node,可以从磁盘读取地图并使用ROS service提供地图。 目前实现的map_server可将地图中的颜色值转化成三种占用值:free (0), occupied (100), and unknown (-1). 未来可用0~100之间的不同值指示占用度。
1.命令语法
map_server
2. 示例
rosrun map_server map_server mymap.yaml
注意:map data可以通过指定topic或者 service来提取。service的方式最后可能要被废弃。
3 .发布的主题
map_metadata (nav_msgs/MapMetaData)
map (nav_msgs/OccupancyGrid)
4. 服务
static_map (nav_msgs/GetMap)
5. 参数
~frame_id (string, default: "map")
The frame to set in the header of the published map.
map_saver可以把地图保存到磁盘。 例如:from a SLAM mapping service.
1 .命令语法
rosrun map_server map_saver [-f mapname]
map_saver retrieves map data and writes it out to map.pgm and map.yaml. Use the -f option to provide a different base name for the output files.
2. 命令示例
rosrun map_server map_saver -f mymap
3. 订阅的主题
map (nav_msgs/OccupancyGrid) Map will be retrieved via this latched topic
更多的ROS中nav_msgs消息类型在这里,和这里。