这次的笔记我把13讲的部分内容总结一下。 虽然slam的名字叫同步定位与构图,但是书中建图的内容却少的可怜。据此高博给出了自己的解释,意为在定位的过程中,我确定了很多特征点的世界坐标,那这个过程其实就是建图了。一个点云中,每个已知世界坐标系的特征点给它的位置塞一个点,那这不就是建图吗?从这角度来说倒也没有太大的问题。但是作为用户,对于地图的要求是不一样的,比如希望地图应该是稠密的。而基于特征点方法的视觉里程计,虽然最后有很多特征点,但相对世界里的全部点来说,毕竟也是稀疏的,一幅图也就那么几个特征点。因此这一章讲解了单目稠密重建的原理和一些零散的知识。(对于这一块我感觉高博是很想提及的,但是不知道是最后赶时间还是写书到最后有些懈怠了,有的东西没有讲明白,需要自己思考很多和查资料才能明白。本着实事求是的原则(没有任何不尊重高博的意思),我个人觉得这章是高博这本接近完美的入门教材的一个败笔。不过本书作为第一本入门教材已经是非常了不起了) 本文主讲理论知识没有代码内容,关于代码的内容,参见:SLAM14讲学习笔记(十四)ch13 建图(代码详述带注释)
极线搜索与块匹配: 做这个是想估计点的深度。值得注意的是,在第7讲的视觉里程计1中已经提到过了估计深度的问题了,那就是先通过对极几何算出了两个2D-2D点的位姿,之后把两个匹配像素点计算到归一化平面上,左边乘以深度s1,右边乘以深度s2,得到相机坐标系下的坐标,再利用算出的位姿外参建立联系。等式建立起来以后,把等式两边都乘以归一化坐标x1的“^”,把左边消成0,那么式子里就没有s1了,解方程求得s2,再恢复出s1。这就是所谓的三角测量。(三角测量的详解见SLAM14讲学习笔记(四)视觉里程计(特征点法)和重难点总结) 那这章为什么又要讲怎么个算深度呢?不是能三角测量吗?统统三角测量不就完事了? 注意:三角测量的前提有两个:第一,特征点已经两两匹配到了;第二,已经求得了两幅图像的位姿。 对于稠密建图而言,求位姿是必须的,通过几个点就能求出位姿;但是有的不是特征点的像素点,如果想利用三角测量求深度,就不是那么容易了。因为不满足三角测量的第一个条件:不知道这个点到下一帧中跑哪去了。当然光流法或者直接法就没有这个问题。极线搜索和块匹配的目的就是找到特定的点在下一帧中的位置。这个目的就是追踪像素点,和光流法和直接法的目的是一样的。这种方式就是基于数学的几何方式:
O1p这条射线在O2对应的那个成像平面会形成一个投影,也就是所谓“极线”,红色的那条实线。物体可能在O1p1这条射线上的任何位置,这个位置是不知道的。但是物体是在射线上的,射线在右边成像平面的投影又是极线,那么物体在右边的成像平面上的投影一定在极线上。一旦确定物体的投影在极线上的位置,连线就能确定物体的空间位置。 ”极线搜索“的含义就是在极线上搜索,找到对应的投影点。”块匹配“的含义就是,不单独匹配点,而是匹配点所在的小块的相似程度。因此这里就又是基于灰度不变性,跟光流和直接法的假设是相同的。这里的灰度不变性是针对”块“的,因此假设性更强了。 块匹配的方式就是书中所述的SAD(差的绝对值之和),SSD(差的平方和),NCC(归一化互相关。这个有些复杂,列出公式)
那么沿着极线搜索下来,得到一个匹配得分沿着距离的分布,会有很多峰值,真实的对应点只有一个:
显然这个分布里面,中间有个凸起的点特别高,那直接选它在图像上的位置当投影点不就完事了? 是这样的,但是,某个像素点的深度分布随着相机的不断运动,也就是不断接收到新的数据以后,是会不断变化的。(当然上面那个图是不会变的,因为那是两张图像顺着极线比较下来得到的。注意一个理解:上面的折线图并不是深度的分布,而是左图的一个点,在右图上沿着极线匹配得分的分布。一旦确定了一个投影点,咔嚓直接连线,就得到一个深度了。但是随着新的数据的到来一个点不可能只被拍摄到两次,根据之后拍摄到的点算出的深度,很有可能不符合这里的情况的。(也就是利用不同的图像算块匹配,得到不同的上面的红色折线图,选最大的地方连线,求出的点的世界坐标,换算到之前的测量结果下,可能深度是不一致的。换言之,A位置算出m点的深度是5,之后根据新的数据算,算出之前在A位置这里m点的深度不应该是5了。所以深度有很多种可能性,这些可能性是应该是满足一个分布的) 设像素的深度满足分布:
新到的数据满足分布:
(高博这里只是假设是高斯分布,就像卡尔曼滤波器那节一样,也有可能不是。不过他只介绍这一种。) 两个概率应该相乘,因为是要同时满足这些数据的测量,那么两个正态分布相乘,结果还是正态分布,均值和方差长这样:
看到这里觉得十分的抽象,不知道这些代表什么含义。我在下面会进行介绍: 高斯分布的深度滤波器: 到这里之前,高博书里讲的还算靠谱的,虽然在深度分布那块可能还有些欠缺,起码是没有错误的。之后他想表示一下位置对于深度不确定性的影响。他画了一个不确定性分析图,基于这个图进行推导:
基于这个图推导的话是有问题的:首先O1p1并不是焦距。这应该只是一个近似。因为焦距的定义应该是光心距离成像平面的垂直距离,不可能光心距离成像平面上的每个点的距离都是焦距f。不过这倒不是大碍,原因有二:第一,它应该是很近似的,实际的成像平面应该是很小的而不是洗出来的照片那么大。第二,就算不是焦距,焦距是知道的,p1的位置也是知道的,根据三角形勾股定理也能算出O1p1的值,因此我倾向于把这个距离值当成是f,并没有说是焦距f的意思。 之后:β’=β+δβ,很显然这里给写反了,应该是β’=β-δβ。(当然加减都是可以的,按书上的图来说应该是减) 此外,咖马γ应该是p’与虚线的夹角。 在δβ的值的推导的时候,用到了焦距的定义,说δβ=arctan1/f,这应该强调是一个近似,换成约等号,两个角都接近90度,那个小角δβ比较小,才能这么近似去算。 因此这块不用深究,因为之后把β和β‘搞混掉了。不过关系不大,咱们自己纠正对就行了: 步骤为: a = p – t α = arccos<p, t> β = arccos<a, -t> δβ=arctan1/f β’= β-δβ γ=π-α -β σobs=||p||-||p’|| 总之意思是,一旦有δβ的像素误差,就会造成p和p‘之间的差异。两个深度向量的1范数之差定义为σobs,作为一个像素误差带来的深度不确定度。(显然这个不确定度σobs是可以直接通过如下方式算出来的:根据前面的红色折线图,找到分值最大的点,连线求出深度,得到一个坐标系下的点;它左右稍微有点误差的情况下连线算出的深度,又得到一个点;两个深度的1范数之差就是σobs。不过这是实际意义上的联系,实际计算方法还是按上面列的几个公式来计算) 再来回顾一下上面的高斯分布的均值和方差:
我个人感觉,高博这章说的有点含糊,对于新入门的人来说不太友好。我参考了一下别人的博客三角化—-深度滤波器—-单目稠密重建(高翔slam—-十三讲)(看了人家的才明白),因此补充一些内容: μobs实际上就是每次我们新三角化出来的深度值,而对于σobs2,就是上面提到的 不确定度σobs。 第一次三角化出来的μ,σ2就可以作为初始值,然后每次新三角化出一个三维点,就去更新深度值的分布。 深度滤波器的现实意义就是不断缩小这个不确定度。缩小不确定度是通过如下方式进行的:不断求出三维点的坐标,更新这个分布,直到这个分布的不确定性小于你希望的阈值,就认为是收敛了,收敛以后的均值,就不再改动了,当做是你确定下来的深度值。 当然实际的分布可能不是高斯分布,因此有了均匀-高斯混合分布。这章书中没有讲。 之后的内容我总结在我的SLAM14讲学习笔记(十)建图与SLAM开源方案对比中。而本节的内容我觉得比较重要,所以单独列出,不和它混在一起。