提出了一种密集SLAM方法,使用RGBD数据,进行跟踪和建图。
主要贡献:
文章用词和以前看的都不太一样,读起来不太容易。frame-to-model和model-to-model应该分别是相机位姿估计和地图构建的优化。registration可能是做匹配的意思。
文章先提出了registration的方法,用于做跟踪。使用的是几何+光度联合误差优化。但是不知道激活和非激活在匹配中具体是怎么用的?
还提出了两个闭环检测。得到闭环后的优化使用了形变图。
地图使用surfel表示。在做估测时:
几何误差针对深度图,error是在surfel表示中的顶点vertex中计算。
使用point-to-plane error:
E i c p = ∑ k ( ( v k − e x p ( e ) T v t k ) n k ) 2 E_{icp}=\sum_k ((v^k-exp(e)Tv_{t}^{k})n^k)^2 Eicp=k∑((vk−exp(e)Tvtk)nk)2
v t k v_{t}^{k} vtk是当前帧的第 k k k个点, T T T是当前帧和上一帧的变换估测, v k v^k vk和 n k n^k nk是上一帧的匹配顶点和法线。
优化目标是 e x p ( e ) exp(e) exp(e)里的motion parameter e e e,这里不太懂李代数到李群的映射,不过这个point to plane error在很多地方都有用到,之后看看这个论文。
光度误差针对彩色图(强度图),误差是在像素中计算。
E = ∑ u ( I ( u , c t l ) − I ( π ( K e x p ( e ) T p ( u , D t l ) , c t − 1 a ) ) 2 E=\sum _{u}(I(u,c_t^{l})-I(\pi (Kexp(e)Tp(u,D_t^l),c_{t-1}^a))^2 E=u∑(I(u,ctl)−I(π(Kexp(e)Tp(u,Dtl),ct−1a))2
c c c是彩色图, u u u是像素坐标, I ( u , c ) I(u,c) I(u,c)是取彩色图中对应坐标的强度值。 p ( u , d ) p(u,d) p(u,d)是取深度图中对应坐标的3D back projection,即当前帧相机坐标系下的三维坐标,经过T转换到上一帧的相机坐标系下,乘以内参K到像素平面,经过 π \pi π转换成2d坐标。
因此计算的是每一个像素位置,当前帧和根据模型估测位姿,对应上一帧的像素差值。
同一坐标,在这一帧和上一帧中,经估计的位姿转换后的强度差值。
最小化联合cost:
E t r a c k = E i c p + w r g b E r g b E_{track}=E_{icp}+w_{rgb}E_{rgb} Etrack=Eicp+wrgbErgb
求其jacobian,构造最小二乘形式,使用高斯牛顿法优化最小二乘问题。
使用了三层的金字塔结构来迭代求解。
使用surfel级的表面闭环检测来实现局部和全局的一致性。模型表面闭环检测通过对于所有surfel(激活和非激活的)进行非刚体形变来进行,非刚体形变的依据是表面约束(surface constraints)。
具体方法是,基于surfel构造一个形变图(deformation graph),通过优化形变图来进行surfel的调整,从而进行模型表面的形变。
图由节点和边构成:
节点包括:
边:
当前节点和它的邻居之间连边
要优化的就是 g R n g_R^n gRn和 g t n g_t^n gtn,通过这两个转移量,实现模型表面的变。
每一个surfel M s M^s Ms定义了一组受影响的节点 I ( M s , g ) I(M^s,g) I(Ms,g)。通过这些节点计算形变后的surfel位置和法向。
位置形变:
对于与这个surfel相关的所有节点,计算surfel位置和节点位置差值,乘以节点的旋转矩阵,加上节的位置和平移向量,再乘以系数。
前面那个系数代表的是这个surfel的节点权重,节点和surfel位置越相近,权重越大。 d m a x d_max dmax是这个surfel k个最近点的欧几里得距离。
这一节描述了如何在每一帧建一个形变图。
使用systematic sampling采样法,从所有surfel均匀采样 ∣ g ∣ |g| ∣g∣个,形变图的节点数远少于surfel数。初始化时,节点的位置和时间戳与采样来源的surfel相同。节点按照初始时间戳排序,其邻居节点的确定是根据排序结果找左右的K个。
这一节讲了得到形变图后,怎么找出用于更新每个surfel的节点,并且如何更新surfel。
这节将了怎么优化节点的旋转和平移量。
首先定义了一个元组Q,描述的是点在形变过程中的变化,包含点的起始位置、终点位置、起始时间戳、终点时间戳。
优化过程,定义了四个cost:
然后就最小化这四个cost的加权和。
具体cost怎么定义的不太懂。
这部分是进行局部闭环。构建地图模型的surfel有一个标签:激活/非激活。tracking的时候只使用激活的surfel。当一定时间内没有 观测到一个surfel,就把它的标签置为非激活。
在同一视角下看模型,可能存在对于同一个场景,分别设成了激活和非激活,这样就产生了偏移。局部闭环检测就是为了消除这些偏移。
消除闭环的方法是上面说的使用形变图优化,优化的时候,上面提到了所用的限制元组Q,这一节就是讲了怎么在局部闭环中确定Q。
现有当前位姿估计 p t p_t pt(这应该是地图中surfel的估计),要通过闭环检测,得到一个转移矩阵 H ∈ S E 3 H \in {SE}_3 H∈SE3,来对齐激活模型部分和非激活模型部分。
首先对当前帧进行注册(registration process)
根据注册过程中的高斯优化结果,判断是否闭环。判断依据有:
如果满足条件,就生成一组Q。方法是均匀采样一些像素点,根据深度图和时间戳得到相应Q。
最终得到用于对齐模型的转移矩阵H。非激活区域的点再次激活,并用于tracking。
全局闭环检测使用randomised fern encoding方法,是一种基于RGBD图像的识别方法,应该和词袋的思想差不多,在运行过程中同步简历数据库和匹配。
每一帧进行下采样,然后计算得到一个描述串,和一切其他属性共同构成它的帧元素。然后每帧对它和数据库中的帧元素匹配,看这个地方有没有来过。
若匹配到,和局部闭环流程一样。