在很多时候,像建图,导航,放置物品,都需要显示地图。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,保留给将来使用。