KinectFusion: Real-Time Dense Surface Mapping and Tracking 论文解析

1. 概述

Kinect Fusion 是第一个系统利用RGBD相机在房间大小的范围实现具有 real-time, dense volumetric reconstruction特性的三维重建。并且因为具有稠密的深度信息,所以在黑暗的情况下,也可以实现三维重建。本文的创新点是用了tracking的方法来吧整个地图的surface model进行了融合,而不是进行帧与帧之间的融合。同时,他们也使用了并行GPU系统来加速。

2. 实现方法

现在我们详细看一下Kinect Fusion的流程和实现方案,如下图所示。
Fig 1: Overall system workflow
还系统主要分为4个部分,Measurement, Pose Estimation, Update Reconstruction 和 Surface Prediction。我们将在后面详细介绍每一部分的功能以及实现方法。首先我们先来了解一下本文的符号系统。

2.1 Preliminaries

T g , k = [ R g , k t g , k 0 T 1 ] ∈ S E 3 (3) T_{g,k} = \left[ \begin{matrix} R_{g,k} & t_{g,k} \\ \textbf{0}^T & 1 \\ \end{matrix} \right] \tag{3} \in \mathbb{SE_3} Tg,k=[Rg,k0Ttg,k1]SE3(3)
一个在第k帧相机坐标系下的点 p k ∈ R 3 \textbf{p}_k\in \mathbb{R^3} pkR3转到世界坐标系 p g = T g , k p k \textbf{p}_g=T_{g,k}\textbf{p}_k pg=Tg,kpk

π ( ) \pi() π()函数是把齐次坐标系下的坐标转为非齐次坐标。例如: p ∈ R 3 = [ x , y , z ] T p\in \mathbb{R^3} = [x,y,z]^T pR3=[x,y,z]T q ∈ R 2 = [ x / z , y / z ] T q \in \mathbb{R^2} = [x/z,y/z]^T qR2=[x/z,y/z]T

同时,我们把坐标上面有“点”的坐标表示为齐次坐标,例如 u ˙ = [ u T ∣ 1 ] T \dot{\textbf{u}} = [\textbf{u}^T|1]^T u˙=[uT1]T

2.2 Surface Measurement

在第k帧像素包含的深度信息用 R k ( u ) ∈ R R_k(\textbf{u})\in \mathbb{R} Rk(u)R表示,像素坐标则是 u = [ u , v ] T ∈ U ∈ R 2 \textbf{u}=[u,v]^T\in \mathbb{U} \in \mathbb{R^2} u=[u,v]TUR2 K K K为相机calibration matrix,则第k帧像素 u \textbf{u} u所对应的三维空间点在相机坐标系下的坐标为 p k = R k K − 1 u ˙ \textbf{p}_k = R_kK^{-1}\dot{\textbf{u}} pk=RkK1u˙

首先我们先对原始的深度图 R k R_k Rk进行bilateral filter操作 (bilateral filter可以去除噪音并且不会把图像中的边界变得模糊,具体工作原理我还没有研究,有时间的话补上)

D k ( u ) = 1 / W p ∑ q ∈ U N σ s ( ∣ ∣ u − q ∣ ∣ 2 ) N σ s ( ∣ ∣ R k ( u ) − R k ( q ) ∣ ∣ 2 ) R k ( q ) D_k(\textbf{u})=1/\textbf{W}_p\sum_{\textbf{q}\in\mathbb{U}}N_{\sigma_{s}}(||\textbf{u}-\textbf{q}||_{2}) N_{\sigma_{s}}(|| R_k(\textbf{u})-R_k(\textbf{q}) ||_2)R_k(\textbf{q}) Dk(u)=1/WpqUNσs(uq2)Nσs(Rk(u)Rk(q)2)Rk(q)其中 N σ s ( t ) = e x p ( − t 2 σ − 2 ) N_{\sigma_{s}}(t) = exp(-t^2\sigma^{-2}) Nσs(t)=exp(t2σ2) W p \textbf{W}_p Wp是归一化参数。

那么我们利用这个新的深度图可以重新计算像素 u \textbf{u} u所对应的相机坐标系下三维空间坐标是 V k ( u ) = D k ( u ) K − 1 u ˙ \textbf{V}_k(u) = D_k(\textbf{u})K^{-1}\dot{\textbf{u}} Vk(u)=Dk(u)K1u˙

因此,我们可以利用像素 u \textbf{u} u附近的点来计算三维空间中surface在该点的法向量,公式为
N k ( u ) = v [ ( V k ( u + 1 , v ) − V k ( u , v ) ) × ( V k ( u − 1 , v ) − V k ( u , v ) ) ] N_k(\textbf{u})=v[(\textbf{V}_k(\textbf{u}+1,v)-\textbf{V}_k(u,v))\times (\textbf{V}_k(\textbf{u}-1,v)-\textbf{V}_k(u,v))] Nk(u)=v[(Vk(u+1,v)Vk(u,v))×(Vk(u1,v)Vk(u,v))]其中 v [ x ] = x / ∣ ∣ x ∣ ∣ 2 v[\textbf{x}]=\textbf{x}/||x||_2 v[x]=x/x2,对向量进行归一化处理。另外,如果一个像素点有深度信息,我们用 M k ( u ) → 1 M_k(\textbf{u})\rightarrow1 Mk(u)1表示,否则为 M k ( u ) → 0 M_k(\textbf{u})\rightarrow0 Mk(u)0

我们还用一种 L = 3 \textbf{L} = 3 L=3 的multi-scale的表示方法来表示surface的测量结果。首先是深度图, D l ∈ { 1 … L } D^{l\in\{1\dots L\}} Dl{1L} D k 1 D^1_k Dk1 R k R_k Rk经过bilateral filter的结果。而 D l + 1 D^{l+1} Dl+1是通过对 D l D^l Dl进行二次采样,分辨率降为 D l D^l Dl一半的过程。另外,只有像素 D k ( u ) D_k(\textbf{u}) Dk(u)附近的平均深度值在其值的 3 σ r 3\sigma_{r} 3σr以内,才使用其平均值,否则会把原本不平滑的边界也变得平滑。已知 D l ∈ { 1 … L } D^{l\in\{1\dots L\}} Dl{1L}后,我们可以利用之前的公式计算对应的 V l ∈ { 1 … L } \textbf{V}^{l\in\{1\dots L\}} Vl{1L} N l ∈ { 1 … L } \textbf{N}^{l\in\{1\dots L\}} Nl{1L}。同时已知k帧和世界坐标系的transformation matrix T g , k T_{g,k} Tg,k后,则有 V k g ( u ) = T g , k V ˙ k ( u ) \textbf{V}_{k}^{g}(\textbf{u})=T_{g,k}\dot{\textbf{V}}_k(\textbf{u}) Vkg(u)=Tg,kV˙k(u) N k g ( u ) = R g , k N k ( u ) \textbf{N}_{k}^{g}(\textbf{u})=R_{g,k}\textbf{N}_k(\textbf{u}) Nkg(u)=Rg,kNk(u)

至于为什么此处要设置multi-scale我还没有很好的理解,欢迎懂得朋友评论

2.3 Mapping as Surface Reconstruction

本文是通过把连续的深度图和相机位姿不断通过使用volumetric truncated signed distance function (TSDF)来融合成为一个单一的三维重建地图。(本文不会对TSDF过多的展开介绍,想要了解可参考论文 “A volumetric method for building complex models from range images”)

下面两张图可以让我们对TSDF有个较为直观的初步了解。Figure3 表示如果对同一方向进行了2次测量,得到了2个signed distance function,那么我们可以使用其weighted funciton对这两次测量进行融合。

现在我们开始详细介绍一下Kinectic Fusion中如何得到Signed distance function以及对应的weighted function。世界坐标系下的TSDF是由 1 … k 1\dots k 1k帧的深度测量融合起来的。我们用 S k ( p ) \textbf{S}_k(\textbf{p}) Sk(p)表示, p ∈ R 3 \textbf{p}\in \mathbb{R^3} pR3是世界坐标系下的三维点。每个点 p \textbf{p} p在TSDF中有对应的 signed distance value 和 weight:
S k ( p ) → [ F k ( p ) , W k ( p ) ] \textbf{S}_k(\textbf{p}) \rightarrow [F_k(\textbf{p}),W_k(\textbf{p})] Sk(p)[Fk(p),Wk(p)]
为了实现一个dense的surface测量,我们做出了以下2个假设:

  1. 我们要把测量点的不确定性做一个截断(truncate)。如果一个三维空间点到相机中心所在surface的深度测量值为d,那么我们认为这个点一定在 [ d − μ , d + μ ] [d-\mu,d+\mu] [dμ,d+μ]的区间内( d = ∣ ∣ K − 1 u ˙ ∣ ∣ 2 R k ( u ) d=||K^{-1}\dot{\textbf{u}}||_2R_k(\textbf{u}) d=K1u˙2Rk(u))。 r \textbf {r} r是图像平面像素点到该三维点的射线,当 ∣ ∣ r ∣ ∣ 2 < ( d − μ ) ||\textbf {r}||_2<(d-\mu) r2<(dμ)时,是free space。当 ∣ ∣ r ∣ ∣ 2 > ( d + μ ) ||\textbf {r}||_2>(d+\mu) r2>(d+μ)时,是我们不了解的空间范围。
  2. 因此,SDF只存在于这个不确定范围的测量值 ∣ ∣ ∣ r ∣ ∣ 2 − d ∣ < μ |||\textbf {r}||_2-d|<\mu r2d<μ

虽然可以具体的计算真正的离散SDF值,但是为了提高计算效率,本文用了一个别的方案来计算,公式如下:
在这里插入图片描述
概括来说,该公式(6)计算的是一个三维点 p \textbf{p} p在投影到第k帧图像后的SDF value。其中公式(8)的那个最外层括号里面计算的是 p \textbf{p} p在k帧对应的真是像素点,但因为计算结果是连续的值,我们需要在k帧图像的离散像素点中找到与其最近的位置作为 p \textbf{p} p的对应像素,最外层括号即表示这个查找操作。公式(9)是截断函数,保证了点 p \textbf{p} p的深度与 R k ( x ) R_k(\textbf{x}) Rk(x)的距离不超过 μ \mu μ p \textbf{p} p点在第k帧深度图对应的weight W R k ( p ) W_{R_k}(\textbf{p}) WRk(p) c o s ( θ ) / R k ( x ) cos(\theta)/R_k(\textbf{x}) cos(θ)/Rk(x)呈正相关, θ \theta θ是前面 r \textbf{r} r的方向与surface在 p \textbf{p} p点的法向量夹角。

获得每帧的SDF的值后,我们把每帧融合在一起用最小二乘法表示的形式为:
min ⁡ F ∈ F ∑ k ∣ ∣ W R k F R k − F ∣ ∣ 2 \min_{F\in\mathbb{F}}\sum_{k}||W_{R_k}F_{R_k}-F||_2 FFminkWRkFRkF2
它的解可以用迭代的方式表示,定义每个在世界坐标系下的三维点 { p ∣ F R k ( p ) ≠ n u l l } \{\textbf{p}|F_{R_k}(\textbf{p})\neq null\} {pFRk(p)=null}

F k ( p ) = W k − 1 ( p ) F k − 1 ( p ) + W R k ( p ) F R k ( p ) W k − 1 ( p ) + W R k ( p ) F_k(\textbf{p})=\frac{W_{k-1}(\textbf{p})F_{k-1}(\textbf{p})+W_{R_k}(\textbf{p})F_{R_k}(\textbf{p})}{W_{k-1}(\textbf{p})+W_{R_k}(\textbf{p})} Fk(p)=Wk1(p)+WRk(p)Wk1(p)Fk1(p)+WRk(p)FRk(p)
W k ( p ) = W k − 1 ( p ) + W R k ( p ) W_k(\textbf{p})=W_{k-1}(\textbf{p})+W_{R_k}(\textbf{p}) Wk(p)=Wk1(p)+WRk(p)

另外,使用 W η W_{\eta} Wη对weight进行一个截断操作,移动平均表面重建可以在具有动态物体运动的场景中进行重建。(我并不明白这句话什么意思,原文是:“While W k ( p ) W_k(\textbf{p}) Wk(p) provides weighting of the TSDF proportional to the uncertainty of surface measurement, we have also found that in practice simply letting W R k ( p ) = 1 W_{R_k}(\textbf{p})=1 WRk(p)=1, resulting in a simple average, provides good results. Moreover, by truncating the updated weight over some value W η W_{\eta} Wη, a moving average surface reconstruction can be obtained enabling reconstruction in scenes with dynamic object motion.”)
W k ( p ) ← m i n ( W k − 1 ( p ) + W R k ( p ) , W η ) W_k(\textbf{p})\leftarrow min(W_{k-1}(\textbf{p})+W_{R_k}(\textbf{p}), W_{\eta}) Wk(p)min(Wk1(p)+WRk(p),Wη)

2.4 Surface Prediction form Ray Casting the TSDF

因为之前所获得的点 p \textbf{p} p的SDF值 F k ( p ) F_k(\textbf{p}) Fk(p)不一定为0,而表面上的点的SDF值应当为0。所以我们要利用已有的 p \textbf{p} p F k ( p ) F_k(\textbf{p}) Fk(p),把SDF为0的点 V ^ k \hat{\textbf{V}}_k V^k以及对应的法向量 N ^ k \hat{\textbf{N}}_k N^k求出来。如何求解 V ^ k \hat{\textbf{V}}_k V^k可以查看论文“Interactive ray tracing for isosurface rendering”。如果已知一个在世界坐标系下的点 p \textbf{p} p使得 F k ( p ) = 0 F_k(\textbf{p})=0 Fk(p)=0,则 p \textbf{p} p点的法向量为
在这里插入图片描述
详细证明可参考论文"Interactive ray tracing for isosurface rendering"。

2.5 Sensor Pose Estimation

利用了类似于ICP的算法来求解位姿,此处不再赘述。值得注意的是,此处会检查求解是是否有充足的约束条件以及设置阈值来防止求解失败,如果失败,则会启动重定位程序。重定位过程中,使用丢失前的位姿来对当前帧初始化,然后通过优化器求解位姿,再判断该解是否有效,如果有效则完成重定位。

总结

Kinect在 ≤ 7 m 3 \le7m^3 7m3的范围表现不错,但是在大场景下,目前使用的dense volumetric representation会占用大量内存,同时不可避免地产生累积误差。所以要使用submaps和改进储存方式来优化内存占用。2020年的一篇论文刚好对这些方面做出了改进,实现了大场景应用:“Elastic and Efficient LiDAR Reconstruction for Large-Scale Exploration Tasks”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值