cartographer的doc中给出了这个图。
现在我还没看过源码,所以只能猜测一些内容。
待看完源码后,再详细介绍这个图。
直观地说,左侧的是输入的数据,包括测距数据、码盘里程计和IMU数据。左下方的固定的姿态应该是作为整个sparse pose的锚点。
pose extrapolator的输入包括:里程计姿态、imu估计的姿态和扫描匹配输出的姿态。既然有三种关于姿态的信息(实际中可以配置,如没有IMU),那么可以通过滤波方法获得更准确的位姿估计。这里我的感觉还应该有其他的功能,如作为扫描匹配的初值。
这里的一个问题是:scan-matching是采用哪种方式?图中就有距离数据和位姿进入scan matching,感觉少一部分内容。
扫描匹配的姿态传递给运动滤波蒸馏(位姿变化或时间变化),也就是如果机器人一直静止不动的话,新来的数据是没有太大意义的,所以把这些数据扔掉。
如果运动了或者经过了一段时间,则把姿态和滤波后的激光数据加入到sub map中。
并插入结果(时间、姿态、数据和submaps)
然后传递给后端线程,创建位姿图。这里包括回环检测。
大体上从这个图中,若没有看过源码,很多细节还是不清楚。
由于我的下一步工作是做相关内容,所以我将重点关注:
采用里程计和2D激光雷达传感器,构建栅格地图。所以在后续的文章中,主要分析与之相关的源码内容。
这里我的问题:
1 扫描匹配采用何种方式?scan-scan,scan-map,map-map?
2 位姿图是如何构建的?
3 如何进行的回环检测?
4 里程计和扫描匹配的姿态融合采用何种方法?
5 …
cartographer 用到的库:
Boost:准标准的C++库。
Eigen3: 准标准的线性代数库。
Lua:非常轻量的脚本