cartographer 优点

1.可以生成r=5cm的分辨率的2D网格地图
2.使用分枝定界法

cartographer 假设

1.假定短时间内的精度足够准确

2D SLAM

1.将相互=独立的局部方法和全局方法整合到一个2D SLAM中。都优化了位姿,x,y,theta。
2.局部方法中 每个scan 和地图的一小块进行匹配(submap 称为子图M),使用非线性优化将子图对齐。(称为扫描匹配)。

A Scans

将扫描点信息转换到子图中,变换定义为

Android SuperMap显示天地图_学习


B. Submaps

连续扫描帧组成了子图。子图使用概率网格的形式?

根据给定分辨率将离散的网格点映射称数值。这些值可认为是网格点被阻挡的概率。

Android SuperMap显示天地图_子节点_02

有扫描插入概率地图时,分别计算一组击中的点集和不击中的点集。击中的插入到最近的击中集集中。不击中的点插入到每个像素相关联的网格点,此网格点和扫描原点以及每个扫描点之间的一条射线相交。如果未观察到的点位于一个集合,会为其分配概率Phit或者Pmiss。如果是已经观测到的则更新其概率。

Android SuperMap显示天地图_python_03

对于不击中的点执行相同的操作。

Android SuperMap显示天地图_人工智能_04

C.Ceres Scan matching在scan插入submap前,使用ceres对扫描位姿在局部子图的位姿进行优化。扫描匹配器负责从子图的扫描点中寻找最大化扫描点的概率的扫描位姿。作为一个非线性最小二乘问题:

Android SuperMap显示天地图_python_05

其中Msmooth是将局部子图中概率值的平滑处理(使用双三次差值)。

局部优化需要良好的初始估计值;方法1.测量角速度的IMU用于估计扫描匹配间的旋转分量theta。2.也可以在没有IMU的情况下使用更高频率的扫描匹配或者像素级精准的匹配方法。

3.回环检测

采用Sparse Pose Adjustment (SPA)思想优化所有扫描和子图的位姿。

A.优化问题:同样是一个最小二乘问题,每隔几秒用ceres求解一次。

Android SuperMap显示天地图_python_06

其中m表示世界坐标系下的子图,s是扫描得到的位姿。协方差矩阵通过估算得到可以局部使用ceres和(CS)提供的协方差估算特性。

残差E的计算为:

Android SuperMap显示天地图_人工智能_07

损失函数p,例如Huber loss 。是用来减少当扫描匹配为优化问题添加不正确约束可能出现于(SPA)中的外点的影响。这种情景可能发生于局部对称的环境中(如办公室的隔间)。

B.分枝帧间匹配

Android SuperMap显示天地图_学习_08


上面w是搜索窗口大小,Mnearst是将M通过将其参数四舍五入到最近网格点(即将网格点的值转换到相应的像素上)扩展到所有的二维平面R^2。匹配的质量可以通过cs改善。

通过仔细选择步长提高效率。选择角度补偿delt-theta,使得最远处的dmax移动不超过一个像素的距离r。则delt-theta的计算为:

Android SuperMap显示天地图_人工智能_09


文中的步骤计算给定线性和角度搜索窗口大小的整数数值,即Wx=Wy=7m和Wtheta=30度。

Android SuperMap显示天地图_子节点_10


这样就会得到一个有限集合W,形成一个以估计值delta0为中心的搜索窗,

Android SuperMap显示天地图_子节点_11

这样,很容易建立一个找到delta*的算法,具体见下面,由于使用的搜索窗的大小,会比较慢。

Android SuperMap显示天地图_子节点_12

上述流程得到一个最优值和匹配。我们使用分枝定界方法在较大的搜索窗口上高效的计算delta*。这种方法首先在混合整数线性规划的背景下提出。

Android SuperMap显示天地图_子图_13

流程上先判断是否是叶子节点,是的话比较值,不是分离找到叶子节点,之后继续判断值,直到不能分割。

分枝定界主要的思想是将所有的可能的子集表示为树中的节点,其中根节点表示所有可能的解,在我们的例子中为 W 。每个节点的子节点构成父节点的一个划分,以使它们能表示可能性中某个相同的集合。叶节点为单体结构;每个叶子节点代表一个可行解。注意算法是精确的。只要内部节点 c的得分 s c o r e ( c ) 是其元素得分的上界,它就提供了与简单方法相同的解。此时,只要一个节点是有界的,该子树中就不存在比目前已知的解还要好的解。1.节点选择

在没有好的算法下,优先选择深度优先搜索(DFS)作为默认选择:算法的效率取决于被修剪的树的很大一部分。这实际上取决于两件事:一个好的上限和一个对当前问题的较好的解。后一部分由DFS辅助,它可以快速评估很多叶子节点。由于我们不想将较差的匹配作为回环检测的约束,因此我们还引入了一个分数阈值,我们对低于该阈值的最优解不感兴趣。由于在实践中我们的解通常不会超过阈值,因此它降低了节点选择或查找初始启发式解的重要性。对于在DFS期间访问子节点的顺序,我们计算每个子节点的得分上限,优先访问能最大边界、最有希望的子节点。该方法即为算法3。

Android SuperMap显示天地图_人工智能_14

2.分枝法则

树中的每个节点由一个整数元组c(cx,cy,ctheta,ch).表示,高度ch的节点最多2ch*2ch 种可能的变换,此外还表示特定的旋转:

Android SuperMap显示天地图_子图_15

在算法3的公式中,包含所有可行解的根节点,在固定高度h0并没有显式出现和分岔成初始点c0的一个集合并覆盖搜索窗口。

Android SuperMap显示天地图_子节点_16

对于一个给定的高度为 ch>1的节点c,我们将它分岔为4个高度为 c h − 1 的子节点:

Android SuperMap显示天地图_子图_17

3.计算上界

分枝定界法的的其余部分是计算内部节点上边界的一种有效方式,无论是计算效率还是计算出来的边界质量,使用下式计算:

Android SuperMap显示天地图_人工智能_18

Android SuperMap显示天地图_子节点_19

Android SuperMap显示天地图_人工智能_20

剩下的内容就是一些实验和结论。