Ros

显示地图(类似rviz)

在很多时候,像建图,导航,放置物品,都需要显示地图。Ros实现这功能用的是rviz,但移植到Rose后,技术上不再包含qt、ogre,就要改用自有技术。rviz功能非常强大,移植过程会持续很长时间,可说是要用到什么功能了再加什么功能。目前首要任务是订阅map话题,接收nav_msgs::OccupancyGrid消息。虽然只处理这话题,但功能还是会比rviz弱,像只支持二维。

  • 至少支持50mx50m区域。
  • 能放大、缩小。
  • 显示map、laser坐标系原点,laser位姿。
  • 长按可以设置导航点。

一、使用技术

Rose中的场景(Scene)编程。栅格形状是正方形,栅格坐标不等于单元坐标。在大小上,一个单元包含4个栅格。

要求建图软件在生成nav_msgs::OccupancyGrid时,每米是整数个像素,即1能被map.info.resolution整除。像cartographer的默认值0.05。每个栅格表示1mx1m。

 

二、保存地图

Ros保存地图时会生成两个文件:*.pgm和*.yaml。为方便传输,地图文件将减少到一个,采用rsp(Rose Package)文件格式

2.1 第一部分:文件头

  • Tag3-H4。第一版的值是1。
  • Tag3-L4。值固定是3。
  • Bundle ID。生成该地图app的Bundle ID,像launcher是com.kos.launcher。如果没有Bundle ID,24个字节全置0x00。
  • Manufacture。4字节全置0x00。

2.2 第二部分:zip包

#define RSP_MAP_VER	0
struct trsp_rosmap24bytes {
	uint32_t fourcc;
	uint64_t ts; // time(nullptr)
	uint32_t map;
	uint32_t titles;
	uint32_t reserve0;
};

前20字节用于版本判断,以及表示3个部分的字节数。

  • fourcc。SDL_FOURCC('M', 'A', 'P', CURR_RSP_MAP_VER)。
  • ts。地图创建UTC时间,值来自C api:time(nullptr)。
  • map。map数据部分的字节数。内容是nav_msgs::OccupancyGrid序列化后字节流。
  • titles。器物坐标和名称部分的字节数。名称用utf-8编码。
  • reserve0。置0,保留给将来使用。

 

全部评论: 0

    写评论: