讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下:
(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885
文末正下方中心提供了本人
联系方式,
点击本人照片即可显示
W
X
→
官方认证
{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证}
文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证
一、前言
在上一篇博客中,解答了如下两个疑问:
疑问
1
\color{red} 疑问1
疑问1→ 为什么Grid2D::FinishUpdate()函数中,栅格值为什么需要减去 kUpdateMarker?
疑问
3
\color{red} 疑问3
疑问3 → ProbabilityGrid::ApplyLookupTable() 函数中对于cell的更新比较奇怪,代码为:*cell = table[*cell]。
但是在分析 ProbabilityGridRangeDataInserter2D::Insert() 函数的时候,其调用了一个十分重要的函数 CastRays(),对于该函数并没有进行具体的分析,接下来就是对该函数进行讲解了。不过在这之前,需要了解一下贝汉明(Bresenham)算法。
需要提前理解的是,把点云数据插入到栅格地图,其本质上就是对栅格地图的更新。更新步骤为:根据最新采集到的雷达点,在与地图匹配后,把雷达点插入到当前地图中,其本质是对栅格地图概率的更新。这里的更新包括两部分,其一是对hit点的概率更新,其二是对CastRay完成激光射线状地图更新,即对一条直线所经过的栅格进行概率值更新。 |
对于上述过程应该还是很好理解的,hit 表示激光发射光子打中的点,说明其是障碍物,那么源码中使用 hit_table_ 表格对 cell 进行更新。从雷达传感器原点到 hit 点连接的射线其经过的区域记为 miss,对应的 cell 栅格表示其没有障碍物,所以需要使用 miss_table_ 表格对 cell 进行更新。下图是雷达扫描的模型仿真:
红色部分表示之前探索过的区域,灰色部分表示目前正在探索的区域。可以看到一条条由机器人(雷达原点)发射而出的一条条射线。这些射线经过的区域为miss,其终点位置为hit。对于一种特殊情况,那就是大范围区域没有障碍物,但是雷达只能探索到有限距离,该情况后续我们再进行具体分析。
那么显然,对于 hit 点的更新十分简单,直接调用 ProbabilityGrid::ApplyLookupTable() 函数更新即可。但是对于hit 射线经过经过区域 miss 所对应的 cell 都要进行更新,显然会复杂一些。
对与 miss 区域 cell 的更新,主要解决的问题,就是一条由雷达原点发射出来的点云射线,其会经过那些 cell 或者说栅格,如下图所示:
若机器上处于上图绿色圆圈Robot栅格位置,打出一个光子,即一个点云数据为上图红色圆圈hit栅格位置,那么要求得,就是这两个栅格中心连接的直线,所经过的栅格区域,也就是上图的 miss。
二、贝汉明(Bresenham)算法
这里说的贝汉明(Bresenham)算法,并非原版的贝汉明(Bresenham)算法,而是Cartographer中改版过后的贝汉明(Bresenham)算法。Cartographer 中为了让地图地图更加精细,