1.相关博客
https://zhuanlan.zhihu.com/c_1040559544505704448
2.关于grid_2d 与 probability_grid
probability_grid是 grid_2d的继承,主要实现的函数是
bool ProbabilityGrid::ApplyLookupTable(const Eigen::Array2i& cell_index, const std::vector<uint16>& table)
float ProbabilityGrid::GetProbability(const Eigen::Array2i& cell_index) const
void ProbabilityGrid::SetProbability(const Eigen::Array2i& cell_index, const float probability)
ApplyLookupTable可以通过第一个知乎专栏的cartographer源码解读附一中关于probability_value文件的解释弄懂。
其第二个参数就是预先填好的两张表中的一个(一个叫hit_table,另一个叫 miss_table)。
hit_table表示 假设已知当前某个格子的被占据的概率为p1,那么如果新来一个测量数据m,如果m表示该格子被占据了,那么hit_table[p1]即是这个格子更新之后的被占据概率值,miss_table[p1]表示如果m是不被占据的情况下,这个格子对应的更新值。
不过实际上cartographer使用的不是被占据的概率,而是不被占据的概率,因此把上面的理解反一反就理解了cartographer的意思。cartographer主要使用的是CorrespondenceCost来表示地图每个格子不被占据的概率。
同时预先生成了查找表。
需要注意的是:
- 更新一个格子之后,需要执行FinishUpdate()函数才可以对这个格子再次更新
- 栅格有一个最大概率,一般设置为为0.9,表示当一个格子的概率为0.9的时候,这个格子一定是被占据了,如果一个观测的可信度刚好是最大值0.9,(测试代码中可以调整可信度,实际代码我记得是0.7<0.9),或者是最小值0.1,那么就是说观测到的就一定是正确的,那每次格子更新后的概率值就是观测的值,也就是0.1(一定没有物体,即miss)或者0.9(一定有物体,即hit)。
- 如果观测的可信度是介于最大最小的中间的话,那么就会使格子的概率值向最大概率靠拢
- 如果一个格子刚开始没有概率值,那它的概率值就是第一次的观测值的概率,之后再更新
- 通过调试probability_grid_test.cc文件可以帮助自己更好理解这部分的内容。
- 这个文件的可执行程序在
catkin_ws/build_isolated/cartographer/install/cartographer.mapping.2d.probability_grid_test