高程图 GridMap

Grid_map总结

  Gridmap是由苏黎世理工自动驾驶实验室ASL发布的一款地图,Grid_map也是一种高程图,和Octomap等空间占有地图有着明显的区别。其底层的存储和运算使用Eigen。

1 地图的构造、存储和索引

  Grid_map是由多层layer组成的一种复合地图,每一层地图可以表达不同的信息,不同的layer由各自的属性的cell组成,但是所有的cell对应的空间(2D)坐标是统一的。例如A层layer表达地图每个cell在空间中的高度,B层layer表达地图每个cell的颜色,C层layer表达每个cell的可遍历性等等。其多层特性,可以用图1来描述。
Single_layer|center|640*200

图1 Grid Map模型空间结构图

对于多层地图可以简单理解为,cell的位置是固定不变的,只是每一层地图描述了cell的不同特性。
  单层地图的构造。单层地图由许多个cell组成,一般可以认为单层地图有两个坐标系:位置坐标系(以m为单位)和索引坐标系(以cell为单位)。在地图构造完成后,会有索引坐标系到位置坐标系的转换关系,所以在定位某个cell的时候可以使用仁义坐标系,不存在本质性的区别。单张地图的构造,如图2所示。

Mul_layer|center|640*480
图2 单层地图

图2中包含了单层地图的构造形式,以及一些API接口函数。在图1的左上角和右下角也可以清楚地看到地图的连个坐标系。左上角的是索引坐标系,以左上角的cell为原点,一个cell为单位长度,描述了地图中所有cell的二维vector的索引。右下角的地图是位置坐标系,以地图的距离中心为原点,以单个cell的长度 \(l\) 为单位长度,每个cell的位置坐标是其中心的位置。
  具体的代码实现。因为Grid_map的最底层使用的是Eigen,所以在数据存储和基本的运算方面都可以使用库函数。
  • 地图存储
  std::unordered_map<std::string, Matrix> data_;

地图在存储过程中,按照<layer_name,Matrix>形式存储,每一层layer对应一个矩阵,然后将其以c++ unordered_map容器存储,在具体的存储过程中使用到了hash结构。

  • 地图初始化
      地图初始化的过程中,主要要初始化四个量:layer名称、地图的长宽、分辨率(每个cell的大小)以及位置坐标系的原点。
  • cell单元的索引
      地图中的cell单元是地图最基本的元素,对地图的操作就是对cell单元的操作。而对cell单元操作的关键在于对cell单元的索引。Grid_map索引的方式有两种,分别是采用位置(Position)和索引ID(Index)。两种方式的效果是一样的,使用的时候主要看知道什么或者想要得到什么。所以在Index和Position之间就有相应的对应关系。
    • Index—Position
      \[ P = P_{map}+P_{off}-(I_{index}+0.5)* r \tag{1} \]
        其中 \(P_{map}\) 为位置坐标系原点的偏移,\(P_{off}=1/2 L_{map}\) ,其中\(L_{map}\) 为地图的长宽大小。\(I_{index}\) 位cell单元的索引,\(r\) 为地图的分辨率。 Position—Index的转换反之即可。

  Grid_map不是Global map,其属于一种局部的可以移动的地图,在机器人运动的过程中,地图会随着机器人而发生整体移动,如地图是以机器人为中心,长宽各为 \(L\)的局部地图。如图3所示。

Map_move|center|480*360

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值