我自己编写的栅格地图建立的简单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