MonoSLAM:Real-Time Single Camera SLAM全文总结

本文为博主原创博客,转载请注明出处:https://blog.csdn.net/q_z_r_s

机器感知
一个专注于SLAM、三维重建、机器视觉等相关技术文章分享的公众号
公众号:机器感知

MonoSLAM: Real-Time Single Camera SLAM 全文总结

Abstract

我们讲述了一个可以通过单目相机恢复快速通过未知场景时的3D轨迹的实时算法。我们把此系统称为MonoSLAM,这是第一个将SFM方法应用到SLAM中的成功应用。此方法的核心是,在概率框架下在线创建稀疏但persistent的地图。我们的主要贡献包括主动(active)建图和测量、使用针对相机平滑运动的通用运动模型以及单目特征初始化和特征方位估计的解决方法。总之,这些都是一种非常有效和健壮的算法,可以在标准PC和相机上以30Hz运行。这项工作扩展了机器人系统的范围,其中SLAM可以有效地应用,而且开启了新的领域。我们展示了MonoSLAM在仿人机器人实时3D定位和建图以及手持相机的在线增强现实应用。

1. INTRODUCTION
2. RELATED WORK
2.1 Vision-Based SLAM

我们工作的一个重点就是简化SLAM对硬件的要求。

3. METHOD
3.1 Probabilistic 3D Map

我们方法的核心概念是基于特征的概率地图,表示当前相机的状态估计及所有感兴趣的特征的快照,还包括这些估计中的不确定性。地图使用状态向量 x ^ \hat{x} x^和协方差矩阵 P P P表示。状态向量 x ^ \hat{x} x^是有相机和特征的状态堆成的, P P P是一个方阵,分别表示如下:
x ^ = ( x ^ v y ^ 1 y ^ 2 ⋮ ) , P = [ P x x P x y 1 P x y 2 ⋯ P y 1 x P y 1 y 1 P y 1 y 2 ⋯ P y 2 x P y 2 y 1 P y 2 y 2 ⋯ ⋮ ⋮ ⋮ ] (1) \hat{x}=\left(\begin{matrix} \hat{x}_v\\\hat{y}_1\\\hat{y}_2\\\vdots \end{matrix}\right) ,P=\left[\begin{matrix}P_{xx}&P_{xy_1}&P_{xy_2}\cdots\\ P_{y_1x}&P_{y_1y_1}&P_{y_1y_2}\cdots\\ P_{y_2x}&P_{y_2y_1}&P_{y_2y_2}\cdots\\ \vdots&\vdots&\vdots \end{matrix}\right]\tag1 x^= x^vy^1y^2 ,P= PxxPy1xPy2xPxy1Py1y1Py2y1Pxy2Py1y2Py2y2 (1)
相机状态向量 x v x_v xv由3D位置向量 r W r^W rW,四元数 q R W q^{RW} qRW,速度向量 v W v^W vW以及角速度向量 ω R \omega^R ωR组成,共13个参数:
x v = ( r W q R W v W ω R ) (2) x_v=\left(\begin{matrix}r^W\\q^{RW}\\v^W\\\omega^R\end{matrix}\right)\tag2 xv= rWqRWvWωR (2)
本文中,特征状态 y i y_i yi是特征点的3D位置向量。此地图的主要目的是为了能够实时定位,而不作为完整的环境描述,因此我们致力于捕获高质量的稀疏landmarks

3.2 Natural Visual Landmarks

使用image patches来作为landmark features,根据相机位置信息,改善匹配性能。使用Shi and Tomasi算子检测角点,这里是用的是灰度图像。对匹配而言,假设每个路标点的图像块像素点都共面——此假设在大多数情况下都可以都可以很好的工作。本文中不更新以作为特征保存的图像模板。

3.3 System Initialization

我们选择用一些已知目标放在相机前来对相机进行初始化。

3.4 Motion Modeling and Prediction

由于我们并没有任何关于相机运动的先验信息,任何模型都会停止在在某个细节层面,用概率假设表示所建模型和真实模型之间的差异,所以我们选择用常速度,常角速度模型,这并不是说我们认为相机整个过程中是常速运动的,这是针对的是每个time step而言的。

假设每个time step有未知的加速度 a W a^W aW和角加速度 α W \alpha^W αW噪声,其服从0均值高斯分布,对速度和角速度产生冲击:
n = ( V W Ω R ) = ( a W Δ t α R Δ t ) (3) n=\left(\begin{matrix}V^W\\\Omega^R\end{matrix}\right) =\left(\begin{matrix}a^W\Delta t\\\alpha^R\Delta t\end{matrix}\right)\tag3 n=(VWΩR)=(aWΔtαRΔt)(3)
虽然 V W V^W VW Ω R \Omega^R ΩR可能会耦合,但是,现在我们假设 n n n的协方差矩阵是对角阵,这表示它们是不相关的。状态更新如下:

f v = ( r n e w W q n e w W R V n e w W ω n e w R ) = ( r W + ( v W + V W ) Δ t q W R × q ( ( ω R + Ω R ) Δ t ) v W + V W ω R + Ω R ) (4) f_v=\left(\begin{matrix}r^W_{new}\\q^{WR}_{new}\\V^W_{new}\\\omega^R_{new}\end{matrix}\right)=\left(\begin{matrix}r^W+(v^W+V^W)\Delta t\\q^{WR}\times q((\omega^R+\Omega^R)\Delta t)\\v^W+V^W\\\omega^R+\Omega^R\end{matrix}\right)\tag4 fv= rnewWqnewWRVnewWωnewR = rW+(vW+VW)ΔtqWR×q((ωR+ΩR)Δt)vW+VWωR+ΩR (4)

其中,姿态使用四元数来表示,四元数又通过角轴 ( ω R + Ω R ) Δ t (\omega^R+\Omega^R)\Delta t (ωR+ΩR)Δt来计算得到。

在EKF中,相机经过运动方程得到的新的状态估计 f v ( x v , u ) f_v(x_v,u) fv(xv,u)必须伴随着状态不确定性(过程噪声协方差) Q v Q_v Qv的增加。 Q v Q_v Qv通过雅可比计算得到:

Q v = ∂ f v ∂ n P n ∂ f v T ∂ n (5) Q_v=\frac{\partial f_v}{\partial n}P_n\frac{\partial f_v^T}{\partial n}\tag5 Qv=nfvPnnfvT(5)

其中, P n P_n Pn是噪声向量的协方差矩阵。运动方程中的不确定性增长速率由 P n P_n Pn决定,它额大小表示我们期望的运动的平滑性。

3.5 Active Feature Measurement and Map Update

我们的方法的一个关键部分就是在观测之前,预测每个特征在图像中出现的位置。特征匹配使用NCC进行模板匹配,如果将模板与整幅图像进行匹配,这计算量会很大;预测是一个主动的方法,缩小搜索,提高效率。

首先,使用相机位姿的状态估计 x v x_v xv、特征位置 y i y_i yi,所以一个点特征相对于相机的位置预计出现在:

h L R = R R W ( y i W − r W ) (6) h_L^R=R^{RW}(y_i^W-r^W)\tag6 hLR=RRW(yiWrW)(6)

根据立体几何,特征预计出现在图像中的位置 ( u , v ) (u,v) (u,v),使用标准针孔相机模型:

h i = ( u v ) = ( u 0 − f k u h L x R h L z R v 0 − f k u h L y R h L z R ) (7) h_i=\left(\begin{matrix}u\\v\end{matrix}\right)=\left(\begin{matrix}u_0-fk_u\frac{h_{L_x}^R}{h_{L_z}^R}\\v_0-fk_u\frac{h_{L_y}^R}{h_{L_z}^R}\end{matrix}\right)\tag7 hi=(uv)= u0fkuhLzRhLxRv0fkuhLzRhLyR (7)

其中, f k u , f k v , u 0 , v 0 fk_u, fk_v, u_0, v_0 fku,fkv,u0,v0为相机内参。

在当前的工作中,我们使用的是广角相机,这样就可以同时观测到很多不同视角的特征,它的缺点就是,图像不是透视几何的,例如直线不再是直线。尽管如此,我们在进行特征匹配时使用的还是原始图像,而不是畸变矫正后的图像。值得一提的是,当应用到增强现实的时候,我们使用的是畸变矫正后的图像,因为OpenGL仅支持透视几何相机模型。

因此,我们使用径向畸变来扭曲透视几何投影坐标 u = ( u , v ) u=(u,v) u=(u,v),来获得最终预测的图像位置 u d = ( u d , v d ) u_d=(u_d,v_d) ud=(ud,vd),所采用的可逆的径向畸变模型如下:
u d − u 0 = u − u 0 1 + 2 K 1 r 2 v d − v 0 = v − v 0 1 + 2 K 1 r 2 u_d-u_0=\frac{u-u_0}{\sqrt{1+2K_1r^2}}\\ v_d-v_0=\frac{v-v_0}{\sqrt{1+2K_1r^2}} udu0=1+2K1r2 uu0vdv0=1+2K1r2 vv0
其中, r = ( u − u 0 ) 2 + ( v − v 0 ) 2 r=\sqrt{(u-u_0)^2+(v-v_0)^2} r=(uu0)2+(vv0)2

分别计算这两步的投影函数对相机和特征的雅可比矩阵,这使得我们可以计算预测特征在图像上的位置的不确定性,用 2 × 2 2\times2 2×2对称协方差矩阵 S i S_i Si表示:
S i = ∂ u d i ∂ x v P x x ∂ u d i ∂ x v T + ∂ u d i ∂ x v P x y i ∂ u d i ∂ y i T + ∂ u d i ∂ y i P y i x ∂ u d i ∂ x v T + ∂ u d i ∂ y i P y i y i ∂ u d i ∂ y i T + R (8) S_i=\frac{\partial{u_{di}}}{\partial{x_v}}P_{xx}\frac{\partial{u_{di}}}{\partial{x_v}}^T+\frac{\partial{u_{di}}}{\partial{x_v}}P_{xy_i}\frac{\partial{u_{di}}}{\partial{y_i}}^T+\frac{\partial{u_{di}}}{\partial{y_i}}P_{y_ix}\frac{\partial{u_{di}}}{\partial{x_v}}^T+\frac{\partial{u_{di}}}{\partial{y_i}}P_{y_iy_i}\frac{\partial{u_{di}}}{\partial{y_i}}^T+R\tag8 Si=xvudiPxxxvudiT+xvudiPxyiyiudiT+yiudiPyixxvudiT+yiudiPyiyiyiudiT+R(8)
其中, R R R为观测噪声,与图像分辨率有关。 S i S_i Si允许我们进行主动图像搜索,它表示图像坐标的2D高斯概率密度分布,通过选择一个标准方差阈值,比如 3 σ 3\sigma 3σ来定义一个椭圆搜索窗,特征会在很高的概率下出现在此区域内。

3.6 Feature Initialization

单目相机并不能通过特征的观测直接给出特征的位置,因为特征的深度是未知的。估计特征的深度需要相机运动,并从不同的视角观测特征。然而,我们避免在图像中跟踪若干帧的新特征而不试图估计其3D位置的方法,然后用多视几何三角测量来执行minibatch估计初始化特征的深度。

我们的方法是在地图中初始化一个3D射线,起点为相机的位置,指向特征点。在SLAM地图中表示如下:
y p i = ( r W h ^ i W ) y_{pi}=\left(\begin{matrix}r^W\\\hat{h}_i^W\end{matrix}\right) ypi=(rWh^iW)
其中 r i r_i ri是相机位置, h ^ i W \hat{h}_i^W h^iW是描述方向的单位向量。深度假设可以使用粒子滤波来表示。

在作者后续的论文中可以看到,为了将新的特征点即刻加入到状态向量中,采用了现在应用很多的逆深度方法,这样就可以直接将新观测的到的特征添加到状态更新当中了,而不用等到深度初始完成了才加入。

3.7 Map Management

特征提取是使用Shi-Tomasi算子,匹配时使用image patch。在特征提取时,随机选取搜索框,然后在其中寻找特征点,搜索框选取的要求时不能与现有的特征(包括当前帧新提取到的)重叠,因为新产生的一帧图像还不知道上一帧观测到的特征会出现在当前帧的哪个位置,因此这里就是用恒速模型来预测可能出现的位置,这些预测的位置上都不允许再提取特征点。

3.8 Feature Orientation Estimation

在初始化特征的时候,用作特征匹配的不是特征描述子,而是image patch,一旦特征初始化完成,那么这个image patch将不再改变,但是这里有一个问题,当相机运动的时候,从不同的视角观测同一个image patch时,会和最初提取到的不一样,最简单的就是旋转了,如果直接计算patch之间的相似度,很可能就认为这两个是不匹配的,所以为了解决旋转不变性的问题,论文中采用了在匹配之前先预测图像可能会被看到的样子,这样就在一定的程度上修正了由于相机运动所造成的视角问题。特征方向估计的变换方程为:
H = C R [ n T x p I − t n T ] C − 1 (9) H=CR[n^Tx_pI-tn^T]C^{-1}\tag9 H=CR[nTxpItnT]C1(9)
其中, C C C是相机校正矩阵(透视几何投影), R R R t t t为相机的位姿, n n n是法向量, x p x_p xpimage patch中心在图像上的投影。这个公式没看懂,有懂得大神还请不吝赐教~,或者哪天(估计不会再看了:))我懂了再补上来。

4. 总结
  • 恒速模型:很有创意
  • 主动搜索:根据恒速模型预测下一时刻的位置,配合搜索区域使用
  • 利用协方差矩阵预测搜索区域,大大加快匹配速度
  • 根据预测的位姿修正模板图像外貌特征
  • 剩下的就是传统的EKF的知识了,predict–>update
参考文献

[1] Davison A J , Reid I D , Molton N D , et al. MonoSLAM: Real-Time Single Camera SLAM[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2007, 29(6):1052-1067.

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSD-SLAM是一种大规模直接单目SLAM算法,它是在2013年由扬·恩格尔斯等人提出的。该算法的目标是实现在没有任何先验知识或环境特征的情况下,通过单个摄像头从连续的图像序列中建立和跟踪三维地图,并且能够同时确定相机的姿态。 LSD-SLAM的核心思想是利用摄像头的像素强度信息进行定位和建图,而不依赖于传统的特征点提取和匹配。它通过高斯金字塔和灰度差分技术来提取特征,并使用稀疏数据库存储和匹配这些特征,以实现实时的建图和定位。 在LSD-SLAM中,首先需要对图像进行预处理,包括降噪和创建高斯金字塔。然后,通过计算图像中相邻帧之间的灰度差分,得到特征点的深度信息。通过对这些深度信息进行尺度一致性检查和相机姿态估计,可以建立起相机的轨迹和三维地图。 LSD-SLAM的优点之一是其能够在大规模环境下进行建图,且对于纹理较弱的区域也能较好地定位。此外,LSD-SLAM还具有较低的计算复杂度,能够实时运行,适用于移动机器人、增强现实和无人驾驶等领域。 然而,LSD-SLAM也存在一些限制,如对于场景中出现大运动或快速变化的情况,其定位和建图的精度可能会下降。此外,它对于镜头畸变和光照变化也较为敏感。 总结来说,LSD-SLAM是一种利用单个摄像头进行大规模建图和定位的算法。它通过直接使用图像的像素强度信息,不依赖于传统特征点的提取和匹配。尽管LSD-SLAM具有优点和限制,但其在许多实际应用中具有潜在的价值和广阔的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值