cartographer栅格地图介绍

我自己编写的栅格地图建立的简单C++示例:
https://github.com/BIT-MJY/occupancy_grid_mapping
结合源码更有助于理解,欢迎点赞和转载~

首先,你需要知道激光slam中的栅格地图的详细含义

使用概率表示的,这一栅格被占据的状态。

真正表示的又不是概率,而是一种状态值,但间接反映了概率。

1.什么是栅格地图

https://zhuanlan.zhihu.com/p/21738718

这个知乎回答已经很清楚地做了解答。

2.Cartographer中的栅格地图是什么形式呢?

就是一种概率栅格地图。
从配置文件/home/mjy/dev/carto_ws/src/cartographer/configuration_files/trajectory_builder_2d.lua
中可以看出一些端倪

  submaps = {
    num_range_data = 90,
    grid_options_2d = {
      grid_type = "PROBABILITY_GRID",
      resolution = 0.05,
    },
    range_data_inserter = {
      range_data_inserter_type = "PROBABILITY_GRID_INSERTER_2D",
      probability_grid_range_data_inserter = {
        insert_free_space = true,
        hit_probability = 0.55,
        miss_probability = 0.49,
      },
    },
  }

下面进行详细介绍

2.1 栅格地图最基本的配置:

地图形式——PROBABILITY_GRID概率栅格地图
分辨率——0.05m
最大范围——30m
0.55和0.49可能是用来计算传感器的odd的:
在这里插入图片描述
在这里插入图片描述
hit概率0.55是指:p(z=1|s=1)
miss概率0.49是指:p(z=0|s=1)

2.2 关于submap子图的其他配置:

一个子图插入的laser数——90

2.3 关于栅格地图的坐标系和原点,以及世界点的坐标系和原点

在mapping/2d/map_limits.h中:

  // Returns the index of the cell containing the 'point' which may be outside
  // the map, i.e., negative or too large indices that will return false for
  // Contains().
  // 通过实际长度point找到cell
  Eigen::Array2i GetCellIndex(const Eigen::Vector2f& point) const {
    // 看到左上角为栅格地图的原点,即栅格(0,0),且栅格地图是行主序
    // 如何理解呢?可以将栅格地图理解为左上角为原点(0,0),向右为x轴,向下为y轴
    // 而对于point点来说,坐标系是正常的如下图所示:
    // 		          	  x^
    //  		           |
    //  	          	   |
    //  		  		   |
    //  		   		   |
    //  		           |
    //   <—————————————————0 
    //   y                  
    // 而对于栅格坐标系为:
    //  0——————————————————> x
    //  |
    //  |
    //  |
    //  |
    //  |
    //  y 
    //   	           x 
    // 所以需要用最大范围减去点的坐标,除以分辨率
    // 只有max_比point大二分之一分辨率的时候代表了栅格地图的原点,而max表示了地图的最大范围,因此我推断:
    // 返回的这个点 是 栅格的中心点,因此,栅格点(grid_point)是一个格子的中心
    // Index values are row major and the top left has Eigen::Array2i::Zero()
    // and contains (centered_max_x, centered_max_y). We need to flip and
    // rotate.
    return Eigen::Array2i(
        common::RoundToInt((max_.y() - point.y()) / resolution_ - 0.5),
        common::RoundToInt((max_.x() - point.x()) / resolution_ - 0.5));
  }

世界坐标是正常的我们认识的坐标,左下角为原点,向右为x,向上为y。

上述函数为,我们给一个真实长度,世界坐标点point (x,y),如何得到网格坐标点cell (x,y)

其中max_表示的是地图最大范围

解释都放在注释里面了。

这里有一个简单的栅格地图更新程序,可以克隆下来并阅读:

git clone https://github.com/BIT-MJY/occupancy_grid_mapping.git 
  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值