线特征SLAM

线特征

线特征: 优点在于具有天然的光照及视角不变性,同时更高级的特征也使追踪的鲁棒性和准确性有所提高。特别是在特定的人造场景(室内,走廊)等场景,能够克服无纹理或者不可靠纹理带来的干扰。

而其缺点也很明显,在于线段的检测及匹配耗时相对特征点更大。同时在后端也没有一个标准且通用的SLAM优化及回环模块。线特征匹配也是较为困难的,如线段易断裂,不具备强有力的几何约束(如极线几何约束),在纹理缺失处不具有较强的辨识度等。

线特征的典型代表是PL-SLAM,这边文章的链接如下:
PL-SLAM: Real-Time Monocular Visual SLAM with Points and Lines
作者有一个是来自莫斯科三星AI实验室现在去了英国一家slam公司的大神: Alexander Vakhitov
该框架是在ORB-SLAM的框架基础之上,添加了一些与线特征有关的模块,从而构建了一套单目SLAM系统。整个系统的框架如下图所示:
线特征SLAM_第1张图片

**

摘要

**——众所周知,低纹理场景是依赖点对应的几何计算机视觉算法的主要致命弱点之一,尤其是对于视觉 SLAM。 然而,在许多环境中,尽管纹理较低,但仍然可以可靠地估计基于线的几何基元,例如在城市和室内场景中,或者在结构化边缘占主导地位的所谓“曼哈顿世界”中。 在本文中,我们提出了一种解决方案来处理这些情况。 具体来说,我们建立在 ORB-SLAM 的基础上,大概是当前最先进的解决方案,无论是在准确性还是效率方面,并扩展其公式以同时处理点和线对应。
我们提出了一种解决方案,即使大多数点从输入图像中消失,它也可以工作,而且有趣的是,它可以仅通过检测三个连续帧中的线对应关系来初始化。 我们在 TUM RGB-D 基准测试中彻底评估了我们的方法和新的初始化策略,并证明了线的使用不仅提高了原始 ORB-SLAM 解决方案在纹理不良帧中的性能,而且在序列帧中系统地改进了它 结合点和线,不影响效率。

**

内容

**

一、基于线的SLAM

对于线的描述,采用了 端点(endpoints) 的方法,毕竟现实中,几乎不不可能碰到无限延伸的直线,几乎都是线段,所以,用端点的方法来描述直线是比较合理的。我们假设 P , Q ∈ R 3 P, Q \in R^3 P,QR3 是空间直线的两个端点, p d , q d ∈ R 2 p_d, q_d \in R^2 pd,qdR2 是其在图像中的投影坐标,另外,记 p d h , q d h ∈ R 3 p_d^h, q_d^h \in R^3 pdh,qdhR3 是对应的齐次坐标。于是,我们可以得到直线的参数:
I = p d h × q d h ∣ p d h × q d h ∣ I=\frac{p_d^h \times q_d^h}{\left|p_d^h \times q_d^h\right|} I=pdh×qdhpdh×qdh

说明:(对于向量(x,y,1),可以在几何意义上理解为是在【第三维为常数的】平面上的一个二维向量。这种用【三】维向量表示【二】维向量,或者一般而言,用一个n+1维的向量表示一个n维向量的方法称为齐次坐标表示法。】)。

这样我们就可以得到线特征所需要的参数。然后是定义线的重投影误差(line reprojection error) ——投影线段的端点与在图像中检测到的直线之间的点到直线距离 之和:
E line  ( P , Q , I , θ , k ) = E p l 2 ( P , I , θ , k ) + E p l 2 ( Q , I , θ , k ) 。 E_{\text {line }}(P, Q, I, \theta, k)=E_{p l}^2(P, I, \theta, k)+E_{p l}^2(Q, I, \theta, k) 。 Eline (P,Q,I,θ,k)=Epl2(P,I,θ,k)+Epl2(Q,I,θ,k) E p l = I T π ( P , θ , K ) E_{p l}=I^T \pi(P, \theta, K) Epl=ITπ(P,θ,K)
E p l = I T π ( P , θ , K ) E_{p l}=I^T \pi(P, \theta, K) Epl=ITπ(P,θ,K)

其中, I I I 为上面提到的直线参数, π ( P , θ , K ) \pi(P, \theta, K) π(P,θ,K) 为空间点 投影到图像平面的坐标,而其中的 分别为相机的外参 和内参。理想情况下,空间点 的投影点是在直线上的,所以点到直线距离 E p l = 0 E_{p l}=0 Epl=0,或者说,点在直线上。

通过这样的计算就可以获取到两条线之间的重投影误差了。

但是,在实际情况中,总会存在线之间有遮挡、误检测等状况,所以,我们在图像中检测到的端点 p d , q d p_d, q_d pd,qd 可能与空间直线端点 P , Q P, Q P,Q 在图像中的投影点不匹配,所以,这里还要定义一个“检测到的线的重投影误差”(detected line reprojection error):

E line  , d ( p d , q d , I ) = E p l , d 2 ( p d , I ) + E p l , d 2 ( q d , I ) E_{\text {line }, d}\left(p_d, q_d, I\right)=E_{p l, d}^2\left(p_d, I\right)+E_{p l, d}^2\left(q_d, I\right) Eline ,d(pd,qd,I)=Epl,d2(pd,I)+Epl,d2(qd,I)
E p l , d = I T p d E_{p l, d}=I^T p_d Epl,d=ITpd

线特征SLAM_第2张图片
左图: P , Q ∈ R 3 \mathbf{P}, \mathbf{Q} \in \mathbb{R}^3 P,QR3 表示3D线特征上的两个3D点, p ~ , q ~ ∈ R 2 \widetilde{\mathbf{p}}, \widetilde{\mathbf{q}} \in \mathbb{R}^2 p ,q R2 是他们在image 图像平面上的投影点, l ~ \tilde{l} l~ 是投影的线的系数。

p d , q d ∈ R 2 \mathbf{p}_{\mathrm{d}}, \mathbf{q}_{\mathrm{d}} \in \mathbb{R}^2 pd,qdR2 是提取出的线特征(线段)的两个端点,也就是我们所说的measurements 测量值, P d , Q d ∈ R 3 \mathbf{P}_{\mathrm{d}}, \mathbf{Q}_{\mathrm{d}} \in \mathbb{R}^3 Pd,QdR3就是这两个端点反投影回到3D空间中对应的3D点, I 是检测到的线的系数。
红色那条线是一个点特征的投影模型, X ∈ R 3 \mathbf{X} \in \mathbb{R}^3 XR3 是一个3D点, 对应的 x ~ ∈ R 2 \widetilde{\mathbf{x}} \in \mathbb{R}^2 x R2

二、基于线和点的BA

我们定义 X j ∈ R 3 X_j \in R^3 XjR3 为地图上的第 j j j个点。对于第 i i i个关键帧, X j X_j Xj 在该图像平面中的投影点为:
x ~ i , j = π ( X j , θ i , K ) \tilde{x}_{i, j}=\pi\left(X_j, \theta_i, K\right) x~i,j=π(Xj,θi,K)

其中, θ i \theta_i θi 为第 i i i个关键帧的外参。对于给定的观测点 x i , j x_{i, j} xi,j ,我们可以定义如下的3D误差: e i , j = x i , j − x ~ i , j e_{i, j}=x_{i, j}-\tilde{x}_{i, j} ei,j=xi,jx~i,j
类似的,我们可以定义第j个地图中的线段的端点 P j , Q j P_j, Q_j Pj,Qj 。其在第i个关键帧中的投影坐标(采用齐次坐标形式)记为:
p ~ i , j h = π ( P j , θ i , K ) \tilde{p}_{i, j}^h=\pi\left(P_j, \theta_i, K\right) p~i,jh=π(Pj,θi,K)
q ~ i , j h = π ( Q j , θ i , K ) \tilde{q}_{i, j}^h=\pi\left(Q_j, \theta_i, K\right) q~i,jh=π(Qj,θi,K)

然后,对于给定的所观测到的第 j j j个直线端点 p i , j , q i , j p_{i, j}, q_{i, j} pi,j,qi,j ,然后计算出观测到直线的参数 I ~ i , j \tilde{I}_{i, j} I~i,j ,则误差向量可以定义为:
e i , j ′ = ( I ~ i , j ) T ( K − 1 p i , j h ) e_{i, j}^{\prime}=\left(\tilde{I}_{i, j}\right)^T\left(K^{-1} p_{i, j}^h\right) ei,j=(I~i,j)T(K1pi,jh)
e i , j ′ ′ = ( I ~ i , j ) T ( K − 1 q i , j h ) e_{i, j}^{\prime \prime}=\left(\tilde{I}_{i, j}\right)^T\left(K^{-1} q_{i, j}^h\right) ei,j′′=(I~i,j)T(K1qi,jh)

(PS:这个 e i , j ′ , e i , j ′ ′ e_{i, j}^{\prime}, e_{i, j}^{\prime \prime} ei,j,ei,j′′ 的定义我个人认为是不对的,因为 p i , j h p_{i, j}^h pi,jh 既然是图像坐标,那么乘以 K − 1 K^{-1} K1 的结果就是相机坐标系归一化平面中的坐标,而不再是图像平面中的了,所以,这就和在图像平面中的直线参数 I ~ i , j \tilde{I}_{i, j} I~i,j 的乘积的物理意义就不对了,所以,个人认为,不应该有这个 K − 1 K^{-1} K1)

关于这一点,在后面的雅克比求解过程中也会体现出来。

于是,我们最终的误差目标函数就可以写成:
C = ∑ i , j ρ ( e i , j ⊤ Ω i , j − 1 e i , j + e i , j ′ ⊤ Ω i , j ′ − 1 e i , j ′ + e i , j ′ ′ Ω i , j ′ ′ − 1 e i , j ′ ′ ) C=\sum_{i, j} \rho\left(\mathbf{e}_{i, j}^{\top} \Omega_{i, j}^{-1} \mathbf{e}_{i, j}+\mathbf{e}_{i, j}^{\prime}{ }^{\top} \Omega_{i, j}^{\prime}{ }^{-1} \mathbf{e}_{i, j}^{\prime}+\mathbf{e}_{i, j}^{\prime \prime} \Omega_{i, j}^{\prime \prime}{ }^{-1} \mathbf{e}_{i, j}^{\prime \prime}\right) C=i,jρ(ei,jΩi,j1ei,j+ei,jΩi,j1ei,j+ei,j′′Ωi,j′′1ei,j′′)

其中, ρ ( ⋅ ) \rho(\cdot) ρ() 为鲁棒代价函数,文中使用的是Huber。 Ω i , j , Ω i , j ′ , Ω i , j ′ ′ \Omega_{i, j}, \Omega_{i, j}^{\prime}, \Omega_{i, j}^{\prime \prime} Ωi,j,Ωi,j,Ωi,j′′ 为关键点和线段端点在不同尺度下的协方差矩阵。

线特征SLAM_第3张图片

你可能感兴趣的:(slam,ROS,计算机视觉,opencv,slam)