VIO在走廊弱纹理环境下的优化——VINS-Mono的点线紧耦合优化

2023-05-16

VIO在走廊弱纹理环境下的优化——VINS-Mono的点线紧耦合优化

  • VIO在走廊弱纹理环境下的优化
    • 0. 前言
    • 1. 思路概述
      • 1.1 Super Pixel SLAM
      • 1.2 Edge SLAM
      • 1.3 PL SLAM
    • 2. 算法实施
      • 2.1 Edge SLAM方案的实施(简述)
      • 2.2 PL SLAM方案的实施
        • 2.2.1 线特征的提取和跟踪
        • 2.2.2 线特征的构建和管理
        • 2.2.3 线特征的非线性优化
        • 2.2.4 线特征的边缘化操作
    • 3. 实验结果
    • 4. 结论
    • 参考文献

VIO在走廊弱纹理环境下的优化

0. 前言

本项目是由我和leeayu共同完成,历时一个半月时间,采用的框架是VINS-mono,开源代码如下:

VINS-Mono-Optimization

运行结果视频

VINS-Mono点线紧耦合优化视频

下面主要从四个方面进行技术报告。

  1. 思路概述:该部分主要总结了我们前期进行的文献调研,对于弱纹理下SLAM的算法优化一共有三种方式,我们进行了对比和分析。
  2. 算法实施:我们通过上述的的分析对其中两种方案(Edge SLAM和PL SLAM)进行了实施,该部分主要详细介绍了这两种方案的算法细节。
  3. 实验结果:我们选取了PL SLAM作为我们的研究重点进行了数据集测试,该部分介绍了实验结果。
  4. 结论:我们对算法的实验结果和存在的不足进行了详细分析。

1. 思路概述

对于课题要求我们先是进行了大量的文献调研,调研结果一共有如下三种方案。

1.1 Super Pixel SLAM

这是2014年的一篇文章[1],框架的思路大致是利用超像素作为前端,采用优化的方式进行匹配。因为超像素是像素的集合,对于低纹理环境拥有较好的描述,因此可以用在低纹理环境下。这是论文的视频链接,我们认为这种思路只是理论上可行,在论文的视频里可以看出来,运行的环境其实是有限的而且非常慢,因此我们首先排除掉了这种方案。

1.2 Edge SLAM

这里主要是2017年的一篇文章[2][3],算法的思路大致是不是角点比较少嘛,但是肯定有边的呀,没有角点我们跟踪边界点就好了嘛,因此文章就采用了一种较为鲁棒的的边界点提取方式,然后采用光流法进行跟踪,看上去合情合理,视频链接看上去效果也不错,因此我们第一步先实施了这种方案,但是效果并不理想,进而我们转战PL-SLAM。

1.3 PL SLAM

点线结合的SLAM相关文章由很多,我们主要参考的是贺博在2018年的PL-VIO[4]和谢晓佳师兄的毕业硕士论文[5],实施的具体细节在后文中进行展开,我们最后提交的就是这个方案实施的代码。

2. 算法实施

上文提到,我们主要对Edge SLAM和PL SLAM两种方案进行了实施,因此我们把两部分的工作都介绍下,其中Edge SLAM的方案因为最后没有采用所以就进行简述

2.1 Edge SLAM方案的实施(简述)

我们刚开始是希望寻找一种简便的方式完成任务,Edge SLAM的方案只需要修改前端,后端完全不用改,工作量相对较小(事实证明我们想多了,移植算法也花了不少时间,关键效果还不好),论文中对于算法是这样描述的:

Our proposed Edge SLAM pipeline detects edge points from images and tracks those using optical flow for point correspondence. We further refine these point correspondences using geometrical relationship among three views.

大致意思就是说先对边界点进行提取,然后采用光流法进行跟踪,采用三视图的方法进行外点的剔除,其中对边界点的提取方法如下:

e find the DoG based edge detector is reliable due to its robustness in illumination and contrast changes. We thin the edges further to generate edges of a single pixel width. We apply an edge filtering process described by Juan and Sol upon the thinned edges to calculate connectivity of the edge points.

采用高斯差分算子进行提取,然后通过滤波的方式进行边缘细化,使得每条边界只有一个像素点宽。
当我们按照论文中的方式实施算法之后发现,进行光流跟踪之后匹配的边界点会沿着边界进行滑移,由于这种滑移会使得边界点在外点剔除后数量急剧减少,因此导致边界点过少而跟踪失败

我们对此进行了原因分析,我们的结论是:因为光流法假设的是光度不变性,而边界上的点都会具有相似的光度,因此光流法跟踪会使得匹配的边界点沿着边界进行滑移,这是光流法的原理导致的问题,我们并不清楚原论文中采用了怎样的trick解决的这个问题,再我们开会讨论之后决定放弃这种方案,转战点线特征结合的SLAM。

2.2 PL SLAM方案的实施

我们整个的方案实施实在VINS-mono上完成的,关于VINS-mono的介绍我就不再赘述了,这里主要说明下线特征是如何添加到VINS-mono中的。

2.2.1 线特征的提取和跟踪

线特征的提取和描述采用的是LSD提取算法+LBD描述子的经典方案,关于这两者的细节也不在此展开,我们调用的是OpenCV库里面的接口。
线特征的更踪和点特征稍由不同的是我们提取的是每一帧图片上的线特征,然后进行前后帧匹配,以达到更踪的效果,而不是像点特征那样采用光流法更踪。
描述线特征的是线段的两个端点,我们通过将这两个端点投影到归一化平面上,然后和点特征一起发布到同一个topic上,在后端进行进一步处理, 下图是线特征跟踪的效果图,其中颜色越红代表更踪的时间越长。


这三张图片是在EROUC数据集中运行截取的图片,从第三张图片中可以看出来在某些低纹理环境下,线特征仍然保留这较好的更踪效果。

2.2.2 线特征的构建和管理

在点特征传到后端之后,首先是将点特征放入FeatureManager类中进行特征管理和三角化,同样的,我们实现了一个LineFeatureManager类,实现的函数和FeatureManager类中基本是一致的,只是采用的方法不同。其中值得说明的是如下两点:

  1. 直线三角化的方法:我们采用的通过匹配线的两端点以及相机坐标系的原点构建一个平面,然后观测到特征线相距最远的两帧下的两个平面相交所获得的直线就是两匹配线段构成的空间直线,原理如下图所示:


    假设两个端点的归一化坐标分别 s c 1 = [ u s , v s , 1 ] ⊤ \mathbf{s}^{c_{1}}=\left[u_{s}, v_{s}, 1\right]^{\top} sc1=[us,vs,1] e c 1 = [ u e , v e , 1 ] ⊤ \mathbf{e}^{c_{1}}=\left[u_{e}, v_{e}, 1\right]^{\top} ec1=[ue,ve,1],相机原点世界坐标系坐标 C = [ x 0 , y 0 , z 0 ] ⊤ \mathbf{C}=\left[x_{0}, y_{0}, z_{0}\right]^{\top} C=[x0,y0,z0],那么对应平面 π \pi π的计算公式为 π x ( x − x 0 ) + π y ( y − y 0 ) + π z ( z − z 0 ) = 0 \pi_{x}\left(x-x_{0}\right)+\pi_{y}\left(y-y_{0}\right)+\pi_{z}\left(z-z_{0}\right)=0 πx(xx0)+πy(yy0)+πz(zz0)=0其中 [ π x π y π z ] = [ s c 1 ] × e c 1 , π w = π x x 0 + π y y 0 + π z z 0 \left[\begin{array}{c}{\pi_{x}} \\ {\pi_{y}} \\ {\pi_{z}}\end{array}\right]=\left[\mathbf{s}^{c_{1}}\right]_{ \times} \mathbf{e}^{c_{1}}, \quad \pi_{w}=\pi_{x} x_{0}+\pi_{y} y_{0}+\pi_{z} z_{0} πxπyπz=[sc1]×ec1,πw=πxx0+πyy0+πzz0而由平面 π 1 \pi_1 π1和平面 π 2 \pi_2 π2可以得到特征直线在世界坐标系下的坐标: L ∗ = [ [ d ] × n − n ⊤ 0 ] = π 1 π 2 ⊤ − π 2 π 1 ⊤ ∈ R 4 × 4 \mathbf{L}^{*}=\left[\begin{array}{cc}{[\mathbf{d}]_{ \times}} & {\mathbf{n}} \\ {-\mathbf{n}^{\top}} & {0}\end{array}\right]=\pi_{1} \boldsymbol{\pi}_{2}^{\top}-\boldsymbol{\pi}_{2} \boldsymbol{\pi}_{1}^{\top} \in \mathbb{R}^{4 \times 4} L=[[d]×nn0]=π1π2π2π1R4×4上述计算公式的代码在void LineFeatureManager::line_triangulate()函数当中。

  2. 直线特征的维护方式,上面通过直线三角化出来的是普吕克矩阵 L ∗ = [ [ d ] × n − n ⊤ 0 ] \mathbf{L}^{*}=\left[\begin{array}{cc}{[\mathbf{d}]_{ \times}} & {\mathbf{n}} \\ {-\mathbf{n}^{\top}} & {0}\end{array}\right] L=[[d]×nn0]我们可以非常方便地从中提取线特征的普吕克坐标 d \mathbf{d} d n \mathbf{n} n。普吕克坐标方便用来进行空间变换,但是不方便用来进行优化后更新,因此我们在程序中采用的维护方式是在LineFeatureManager类中维护线特征的正交表示形式,以一个五维向量进行存储,方便后端优化更新时可以直接进行更新,稍微不方便的是在进行空间变换的时候再将其转化为原始的普吕克坐标形式才进行变换。
    普吕克坐标的原始表示形式为 L = ( n ⊤ , d ⊤ ) ⊤ \mathcal{L}=\left(\mathbf{n}^{\top}, \mathbf{d}^{\top}\right)^{\top} L=(n,d),其中 n \mathbf{n} n d \mathbf{d} d是和空间直线相关的两个向量,可以通过下图理解:


    普吕克坐标 L = ( n ⊤ , d ⊤ ) ⊤ \mathcal{L}=\left(\mathbf{n}^{\top}, \mathbf{d}^{\top}\right)^{\top} L=(n,d)在矩阵 T c w = [ R c w p c w 0 1 ] \mathbf{T}_{c w}=\left[\begin{array}{cc}{\mathbf{R}_{c w}} & {\mathbf{p}_{c w}} \\ {\mathbf{0}} & {\mathbf{1}}\end{array}\right] Tcw=[Rcw0pcw1]作用下的空间变换公式如下,操作起来非常方便: L c = [ n c d c ] = T c w L w = [ R c w [ p c w ] × R c w 0 R c w ] L w \mathcal{L}^{c}=\left[\begin{array}{l}{\mathbf{n}^{c}} \\ {\mathbf{d}^{c}}\end{array}\right]=\mathcal{T}_{c w} \mathcal{L}_{w}=\left[\begin{array}{cc}{\mathbf{R}_{c w}} & {\left[\mathbf{p}_{c w}\right]_{ \times} \mathbf{R}_{c w}} \\ {0} & {\mathbf{R}_{c w}}\end{array}\right] \mathcal{L}^{w} Lc=[ncdc]=TcwLw=[Rcw0[pcw]×RcwRcw]Lw普吕克坐标 L = ( n ⊤ , d ⊤ ) ⊤ \mathcal{L}=\left(\mathbf{n}^{\top}, \mathbf{d}^{\top}\right)^{\top} L=(n,d)转化为正交表示形式的公式如下: U = R ( ψ ) = [ n d ∥ d ∥ n × d ∥ n × d ∥ ] \mathbf{U}=\mathbf{R}(\psi)=\left[\begin{array}{ccc}{\mathbf{n}} & {\frac{\mathbf{d}}{\|\mathbf{d}\|}} & {\frac{\mathbf{n} \times \mathbf{d}}{\|\mathbf{n} \times \mathbf{d}\|}}\end{array}\right] U=R(ψ)=[nddn×dn×d] W = [ cos ⁡ ( ϕ ) − sin ⁡ ( ϕ ) sin ⁡ ( ϕ ) cos ⁡ ( ϕ ) ] = 1 ( ∥ n ∥ 2 + ∥ d ∥ 2 ) [ ∥ n ∥ − ∥ d ∥ ∥ d ∥ ∥ n ∥ ] \mathbf{W}=\left[\begin{array}{cc}{\cos (\phi)} & {-\sin (\phi)} \\ {\sin (\phi)} & {\cos (\phi)}\end{array}\right]=\frac{1}{\sqrt{\left(\|\mathbf{n}\|^{2}+\|\mathbf{d}\|^{2}\right)}}\left[\begin{array}{cc}{\|\mathbf{n}\|} & {-\|\mathbf{d}\|} \\ {\|\mathbf{d}\|} & {\|\mathbf{n}\|}\end{array}\right] W=[cos(ϕ)sin(ϕ)sin(ϕ)cos(ϕ)]=(n2+d2) 1[nddn]其中 U \mathbf{U} U是和直线方向有关旋转矩阵, W \mathbf{W} W是和直线距离有关的矩阵,在我们的程序中,我们将 U \mathbf{U} U表示成四元数的形式,而 U \mathbf{U} U直接通过 ϕ \phi ϕ进行存储,因此我们在LineFeatureManager类中维护线特征是一个五维的向量。和这一部分变换相关的代码在utility类当中。

2.2.3 线特征的非线性优化

因为我们维护的线特征在世界坐标系下的普吕克坐标,因此我们想求得线特征的参差的话只需要将线特征的空间坐标投影到某一观测帧的归一化平面上(估计值),然后通过这帧上观测值(线段的两端点),按照下面方式定义线特征的残差 r l ( z L l ′ c i , X ) = [ d ( s l c i , l l c i ) d ( e l c i , l l c i ) ] \mathbf{r}_{l}\left(\mathbf{z}_{\mathcal{L}_{l}^{\prime}}^{c_{i}}, \mathcal{X}\right)=\left[\begin{array}{l}{d\left(\mathbf{s}_{l}^{c_{i}}, \mathbf{l}_{l}^{c_{i}}\right)} \\ {d\left(\mathbf{e}_{l}^{c_{i}}, \mathbf{l}_{l}^{c_{i}}\right)}\end{array}\right] rl(zLlci,X)=[d(slci,llci)d(elci,llci)]其中 d ( s , l ) = s ⊤ 1 l 1 2 + l 2 2 d(\mathbf{s}, \mathbf{l})=\frac{\mathbf{s}^{\top} \mathbf{1}}{\sqrt{l_{1}^{2}+l_{2}^{2}}} d(s,l)=l12+l22 s1其中 l \mathbf{l} l为空间线特征投影到归一化平面的直线, e l c i \mathbf{e}_{l}^{c_{i}} elci e l e i \mathbf{e}_{l}^{e_{i}} elei分别为观测值的两端点。
然后我们定义和线特征相关的优化变量为:世界坐标系下的线特征的普吕克坐标的正交表示形式 O l \mathcal{O}_{l} Ol和对应观测帧的空间位姿 x i \mathcal{x}^{i} xi
雅克比矩阵对优化变量的雅克比矩阵如下: J l = ∂ r l ∂ l c i ∂ l c i ∂ L c i [ ∂ L c i ∂ δ x i ∂ L c i ∂ L w ∂ L w ∂ δ O ] \mathbf{J}_{l}=\frac{\partial \mathbf{r}_{l}}{\partial \mathbf{l}^{c_{i}}} \frac{\partial \mathbf{l}^{c_{i}}}{\partial \mathcal{L}^{c_{i}}}\left[\frac{\partial \mathcal{L}^{c_{i}}}{\partial \delta \mathbf{x}^{i}} \quad \frac{\partial \mathcal{L}^{c_{i}}}{\partial \mathcal{L}^{w}} \frac{\partial \mathcal{L}^{w}}{\partial \delta \mathcal{O}}\right] Jl=lcirlLcilci[δxiLciLwLciδOLw]其中 ∂ r l ∂ l c i = [ − l 1 ( s l c i ) ⊤ 1 ( l 1 2 + l 2 2 ) ( 3 2 ) + u s ( l 1 2 + l 2 2 ) ( 1 2 ) − l 2 ( s l c i ) ⊤ 1 ( l 1 2 + l 2 2 ) ( 3 2 ) + v S ( l 1 2 + l 2 2 ) ( 1 2 ) 1 ( l 1 2 + l 2 2 ) ( 1 2 ) − l 1 ( e l c i ) ⊤ 1 ( l 1 2 + l 2 2 ) ( 3 2 ) + u e ( l 1 2 + l 2 2 ) ( 1 2 ) − l 2 ( e l c i ) ⊤ 1 ( l 1 2 + l 2 2 ) ( 3 2 ) + v e ( l 1 2 + l 2 2 ) ( 1 2 ) 1 ( l 1 2 + l 2 2 ) ( 1 2 ) ] 2 × 3 \frac{\partial \mathbf{r}_{l}}{\partial \mathbf{l}^{c_{i}}}=\left[\begin{array}{ccc}\frac{-l_{1}\left(\mathbf{s}_{l}^{c_{i}}\right)^{\top} 1}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{3}{2}\right)}}+\frac{u_{s}}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{1}{2}\right)}} & \frac{-l_{2}\left(\mathbf{s}_{l}^{c_{i}}\right)^{\top} \mathbf{1}}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{3}{2}\right)}}+\frac{v_{S}}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{1}{2}\right)}} & \frac{1}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{1}{2}\right)}} \\ \frac{-l_{1}\left(\mathbf{e}_{l}^{c_{i}}\right)^{\top} 1}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{3}{2}\right)}}+\frac{u_{e}}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{1}{2}\right)}} & \frac{-l_{2}\left(\mathbf{e}_{l}^{c_{i}}\right)^{\top} 1}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{3}{2}\right)}}+\frac{v_{e}}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{1}{2}\right)}} & \frac{1}{\left(l_{1}^{2}+l_{2}^{2}\right)^{\left(\frac{1}{2}\right)}}\end{array}\right]_{2 \times 3} lcirl=(l12+l22)(23)l1(slci)1+(l12+l22)(21)us(l12+l22)(23)l1(elci)1+(l12+l22)(21)ue(l12+l22)(23)l2(slci)1+(l12+l22)(21)vS(l12+l22)(23)l2(elci)1+(l12+l22)(21)ve(l12+l22)(21)1(l12+l22)(21)12×3 ∂ l c i ∂ L c i = [ I 0 ] 3 × 6 \frac{\partial \mathbf{l}^{c_{i}}}{\partial \mathcal{L}^{c_{i}}}=[\mathcal{I} \quad \mathbf{0}]_{3 \times 6} Lcilci=[I0]3×6 ∂ r l ∂ l c i = [ T b c − 1 [ R w b ⊤ [ d w ] × 0 3 × 3 ] T b c − 1 [ [ R w b ⊤ ( n w + [ d w ] × p w b ) ] × ] [ R w b ⊤ d w ] × ] 0 0 0 ] 6 × 15 \frac{\partial \mathbf{r}_{l}}{\partial \mathbf{l}^{c_{i}}}=\left[\begin{array}{ccc} \mathcal{T}_{b c}^{-1}\left[\begin{array}{c}{\mathbf{R}_{w b}^{\top}\left[\mathbf{d}^{w}\right] \times} \\ {\mathbf{0}_{3 \times 3}}\end{array}\right] & \mathcal{T}_{b c}^{-1}\left[\begin{array}{c}{\left[\mathbf{R}_{w b}^{\top}\left(\mathbf{n}^{w}+\left[\mathbf{d}^{w}\right] \times \mathbf{p}_{w b}\right)\right] \times ]} \\ {\left[\mathbf{R}_{w b}^{\top} \mathbf{d}^{w}\right]_{ \times}}\end{array}\right] & \mathbf{0} & \mathbf{0} & \mathbf{0}\end{array}\right]_{6 \times 15} lcirl=[Tbc1[Rwb[dw]×03×3]Tbc1[[Rwb(nw+[dw]×pwb)]×][Rwbdw]×]000]6×15 ∂ L c i ∂ L w ∂ L w ∂ δ O = T w c − 1 [ 0 − w 1 u 3 w 1 u 2 − w 2 u 1 w 2 u 3 0 − w 2 u 1 w 1 u 2 ] 6 × 4 \frac{\partial \mathcal{L}^{c_{i}}}{\partial \mathcal{L}^{w}} \frac{\partial \mathcal{L}^{w}}{\partial \delta \mathcal{O}}=\mathcal{T}_{w c}^{-1}\left[\begin{array}{cccc}{\mathbf{0}} & {-w_{1} \mathbf{u}_{3}} & {w_{1} \mathbf{u}_{2}} & {-w_{2} \mathbf{u}_{1}} \\ {w_{2} \mathbf{u}_{3}} & {\mathbf{0}} & {-w_{2} \mathbf{u}_{1}} & {w_{1} \mathbf{u}_{2}}\end{array}\right]_{6 \times 4} LwLciδOLw=Twc1[0w2u3w1u30w1u2w2u1w2u1w1u2]6×4其中,因为我们程序中观测值为归一化平面上的坐标点,因此 ∂ l c i ∂ L c i \frac{\partial \mathbf{l}^{c_{i}}}{\partial \mathcal{L}^{c_{i}}} Lcilci中第一项为单位阵,如果是图像平面上的点的话第一项为内参矩阵。在程序中我们写了一个LineProjectionFactor类来玩成这项工作。
在完成非线性优化之后就需要对优化变量进行更新,优化变量的更新方式在贺博的文章中是按照下面方式进行更新的 U ′ ≈ U ( I + [ δ ψ ] x ) W ′ ≈ W ( I + [ 0 − δ ϕ δ ϕ 0 ] ) \begin{aligned} \mathbf{U}^{\prime} & \approx \mathbf{U}\left(\mathbf{I}+[\delta \psi]_{x}\right) \\ \mathbf{W}^{\prime} & \approx \mathbf{W}\left(\mathbf{I}+\left[\begin{array}{cc}{0} & {-\delta \phi} \\ {\delta \phi} & {0}\end{array}\right]\right) \end{aligned} UWU(I+[δψ]x)W(I+[0δϕδϕ0])但是经过我们讨论,和论文中不同的是,我们对于 U \mathbf{U} U采用的是四元数的更新方式,而 W \mathbf{W} W采用的是 ϕ + δ ϕ \phi + \delta\phi ϕ+δϕ的更新方式,这一部分工作在LineLocalParameterization类中。

2.2.4 线特征的边缘化操作

对于线特征的变换化操作和点特征有所不同的是,因为点特征的深度是建立在起始帧的坐标系上的,点特征边缘化的时候需要将起始帧为最老帧上的点特征的深度从最老帧的坐标系转移到次老帧坐标系,而在线特征中,因为我们建立的线特征是在世界坐标系下,因此不需要进行上述操作,相对来说要简单一些,线特征的相关操作在LineFeatureManager类中。

3. 实验结果

由于我们始终没能拿到官方要求的弱纹理环境测试数据集,因此我们在EUROC数据集上测试了我们的算法,并拿开源版本的VINS-mono在同一台机器上进行了对比,我们使用的评价工具是开源工具evo[6],对比内容是RMSE误差,结果如下:

RMSE
VINS-MonoPL VINS-Mono
MH_01_easy0.2576600.252635
MH_02_easy0.2690830.254644
MH_04_difficult0.5143020.506168
MH_05_difficult0.4532490.478479

其中PL VINS-Mono就是我们实现的算法,从表格对比中可以看出来,在大部分数据集上我们的算法的精度都有所提高,达到了预期的效果,下图分别是我们的算法在MH_01_easy、MH_02_easy、MH_04_difficult、MH_05_difficult在evo工具下画的轨迹图。(另外在我们的附件中由我们的算法在MH-05-difficult数据集上运行的视频)

4. 结论

我们通过一个月的课余时间完成了这个项目,但是因为临近七月底之后要开始准备秋招找工作,因此就没有继续再花太多时间在这个上面,我们对这个算法进行一个总结:

  1. 因为还没有在弱纹理环境的数据集上进行测试,实际算法对于弱纹理环境提升了多少现在还并不能下一个定论,但是从我们的实验中来看,轨迹精度是有一定的提升效果的。但是这里也需要说明的是,精度虽然提升了,因为计算量的提升导致系统运行产生了延迟,我们将线段提取的数量限制在100以内,如果超过太多,系统就有能因为太卡而直接崩掉。
  2. 线特征的匹配准确度并不高,通过调试发现,虽然没帧追踪的线段有将近100个,但是通过滤波和三角化之后的剔除,最后LineFeatureManager中管理的线特征的数量通常不到50个,尤其在线特征的三角化的时候会有很大一部分被剔除掉,我们还尝试过不剔除的情况,那样系统会在一开始就飞掉。
  3. 目前仅仅是将线特征加入到了后端优化中,其实如果想完善这个系统的化还要很多工作可以做,比如:(1)将线特征加入到回环检测中,在谢晓佳师兄的论文里提到了线特征的词袋模型,如果能将线特征的回环残差加入到后端优化中可能能使精度进一步提高;(2)系统初始化的时候仅仅使用了点特征,因此在弱纹理的环境下初始化可能仍然会由困难,可以考虑将线特征加入初始化中;(3)我们还有一个特别想完成的工作是建立线特征的稀疏地图并将其可视化,因为实在太忙就暂时还没有实现这个功能。

总而言之,算法虽然取得了一定的效果,但是还是由很大空间可以提升的。

最后想说的是,我们决定将代码和文档开源,有任何问题欢迎大家指正交流,希望和更多学SLAM的朋友一起进步,学SLAM虽然很辛苦,但是也真心很有趣!

参考文献

[1] Concha, A. , & Civera, J. . (2014). Using superpixels in monocular SLAM. IEEE International Conference on Robotics & Automation. IEEE.
[2] Maity, S., Saha, A., & Bhowmick, B. (2017). Edge slam: Edge points based monocular visual slam. In Proceedings of the IEEE International Conference on Computer Vision (pp. 2408-2417).
[3] Tomono, M. (2009, May). Robust 3D SLAM with a stereo camera based on an edge-point ICP algorithm. In 2009 IEEE International Conference on Robotics and Automation (pp. 4306-4311). IEEE.
[4]He, Y., Zhao, J., Guo, Y., He, W., & Yuan, K. (2018). Pl-vio: Tightly-coupled monocular visual–inertial odometry using point and line features. Sensors, 18(4), 1159.
[5] (2017). 基于点线综合特征的双目视觉SLAM方法. (Doctoral dissertation, 浙江大学).
[6] https://github.com/MichaelGrupp/evo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VIO在走廊弱纹理环境下的优化——VINS-Mono的点线紧耦合优化 的相关文章

  • 个人主页(包含项目经历、实习经历、竞赛经历)

    个人主页 注 xff1a 个人主页中主要包含项目经历 实习经历 竞赛经历等方面的照片及文字说明 项目经历 一 基于声源目标识别与定位的微型平台设计 图1 图2 图3 图1 3声源目标识别与定位平台 二 基于STM32的六足仿生机器人设计 图
  • UBUNTU编译运行RTKLIB

    RTKLIB在ubuntu下没有图形用户界面 xff08 GUI xff09 xff01 RTKLIB作为一个功能强大的工具 xff0c 我一直以为它在ubuntu下和win10下是一个样子 xff0c 所以想着用ubuntu下的编译器去编
  • 关于makefile与CMakeList的理解

    为了编译某一工程中的众多 c文件搞出来一个makefile可以批量编译 xff1b Linux下用Cmake也即CMakeLists txt文件 作者写的很清晰易懂
  • c++版本详表

    1 语言标准 版本代目版本号年份第一版c 43 43 981998第二版c 43 43 032003第三版c 43 43 112011第四版c 43 43 142014第五版c 43 43 172017第六版待定待定 2 visual st
  • ffmpeg常用命令

    1 rtsp into mp4 ffmpeg exe i 34 rtsp username password 64 192 168 1 183 554 34 f mp4 r 25 an 640x480 ss 600 t 600 s 34 t
  • http包详解

    位于应用层的http协议 什么也不多说了 xff0c 马上放个图看看 请求方法 xff0c 主要是 xff1a get xff1a 获取 post xff1a 提交 请求头 xff1a User Agent xff1a 产生请求的浏览器类型
  • linux下编译C++项目

    include CheckCXXCompilerFlag CHECK CXX COMPILER FLAG std 61 c 43 43 11 COMPILER SUPPORTS CXX11 CHECK CXX COMPILER FLAG s
  • www总结

    一 www服务器 1 什么是www xff1a www是world wide web的缩写 xff0c 也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息 www可以结合文字 图形 影像以及声音等多媒体 xff0c
  • matlab基础练习作业(1)

    要期末考试了 xff0c 整理一下平时的题 作业 xff11 1 写出完成下列操作的命令 1 将矩阵A第2 5行中第1 3 5列元素赋给矩阵B B 61 A 2 5 1 3 5 或者B 61 A 2 3 4 5 1 3 5 2 删除矩阵A的
  • PHP中使用cURL实现进行Post请求 ssl 双向认证

    span class token comment 64 param string url 接收数据的api 64 param string vars 提交的数据 64 param int second 要求程序必须在 second 秒内完成
  • 大端字节序与小端字节序 (网络字节序与主机字节序)

    大端字节序与小端字节序 1 简介2 判断机器字节序 xff08 C C 43 43 xff09 3 主机字节序与网络字节序的转换4 IP地址与网络字节序的转换 1 简介 字节序分为大端字节序 xff08 big endian xff09 和
  • Noetic安装ros_canopen

    建立workspace mkdir span class token operator span p canopen span class token operator span scr cd canopen catkin make 下载n
  • ROS学习初始化ws下catkin_make必须有src生成devel和build

    安装虚拟机开启intel vt 创建工作空间 first ws src catkin make在ws下生成devel和build 创建package 在src下添加package catkin create pkg hello ros ro
  • Pyhon : 爬虫Requests高级用法--证书

    客户端证书 你也可以指定一个本地证书用作客户端证书 xff0c 可以是单个文件 xff08 包含密钥和证书 xff09 或一个包含两个文件路径的元组 xff1a requests get https kennethreitz org cer
  • 【px4】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • MDF does not reside in a read-only database or filegroup

    错误信息 The file 34 MDF 34 is compressed but does not reside in a read only database or filegroup The file must be decompre
  • Python复习笔记4——文件和目录操作

    一 文件读写 1 1 读文件 xff08 1 xff09 打开文件 使用Python内置的open 函数 xff0c 传入文件名和标示符 xff0c 打开一个文件对象 xff1a span class token operator gt g
  • Python复习笔记5——常用模块

    一 内建模块 1 1 datetime日期时间 xff08 1 xff09 导入模块 span class token keyword from span datetime span class token keyword import s
  • COLMAP+OpenMVS实现物体三维重建mesh模型

    一 环境准备 1 COLMAP 进入COLMAP官网 xff0c 打开下载页面 xff0c 下载COLMAP程序 2 OpenMVS OpenMVS可以自己从源码下载进行编译 如果觉得编译openmvs可能要费点时间 xff0c 那也可以直
  • 解决ubuntu火狐无法上网问题

    之前安装Ubuntu时是可以上网的 xff0c 呆了一个月没怎么用突然不能搜索了 xff0c 记录一下 xff0c 已解决 只需一条命令 打开终端 xff0c 输入 sudo apt get install firefox 问题解决啦 xf

随机推荐

  • C语言基本数据类型int, short int, long int, long long int, unsigned int, signed int等解析

    一 普通int类型 int类型是有符号整型 xff0c 即int类型的值必须是整数 xff0c 可以是正整数 xff0c 负整数 xff0c 零 int类型取值范围因计算机系统而异 早起的16位IBM PC兼容机使用16位来存储一个int值
  • Docker容器内更新apt-get 国内加速

    Docker容器内更新源apt get的方法 由于不使用国内镜像网速缓慢 xff0c 所以使用国内镜像加速就很必要了 xff0c 但是经过博主测试大部分apt get加速都是针对Ubuntu 的 xff0c 根本解决不了Docker 容器内
  • STM32F4 422串口通信

    STM32F429 422串口通信 422串口的硬件原理图如下 xff1a 422串口和232串口不同的是引脚的电平控制 xff0c 还有DE是发送使能 xff0c 置高即可 xff1a RE是接收使能 xff0c 置低即可 422接出来的
  • Java基础学习记录

    一 基础DOS操作 dir xff1a directory 列出当前目录内容 md xff1a make directory 创建目录 rd xff1a remove directory 删除目录 cd xff1a change direc
  • 6、杂项:rtk原理简要说明

    目录 x1f345 点击这里查看所有博文 随着自己工作的进行 xff0c 接触到的技术栈也越来越多 给我一个很直观的感受就是 xff0c 某一项技术 经验在刚开始接触的时候都记得很清楚 往往过了几个月都会忘记的差不多了 xff0c 只有经常
  • 树莓派控制直流电机

    古月金真 1 直流电机 直流电机是一种将直流电能转换为机械能的装置 xff0c 被广泛的用于驱动各种设备 xff0c 如电风扇 遥控小车 电动车窗等 xff0c 在控制设备运转领域中 xff0c 它是不可或缺的一种设备 小型直流电机的的电压
  • SVN创建指定版本号的分支

    SVN创建分支下面三个选择的具体含义 xff1a 最新版本 xff08 HEAD revision in therepository xff09 直接从版本库中最新创建 xff0c 由于不需要从你的工作拷贝中传输数据 xff0c 创建过程会
  • 图像降噪算法——图像降噪算法总结

    图像降噪算法 图像降噪算法总结 图像降噪算法 图像降噪算法总结 图像降噪算法 图像降噪算法总结 前面这段时间我看了几篇和图像降噪相关的Review xff0c 给我的感觉就是SLAM这一研究领域像是一片汪洋 xff0c 而图像降噪领域则是另
  • 图像降噪算法——图像噪声模型

    图像降噪算法 图像噪声模型 图像降噪算法 图像噪声模型1 图像噪声建模2 C 43 43 代码实现3 结论 图像降噪算法 图像噪声模型 1 图像噪声建模 首先 xff0c 我们要区分图像传感器噪声和图像噪声 xff0c 图像传感器噪声我在博
  • 图像降噪算法——维纳滤波

    图像降噪算法 维纳滤波 图像降噪算法 维纳滤波1 基本原理2 C 43 43 代码实现3 结论 图像降噪算法 维纳滤波 维纳滤波是在频域中处理图像的一种算法 xff0c 是一种非常经典的图像增强算法 xff0c 不仅可以进行图像降噪 xff
  • 图像降噪算法——Variance Stabilizing Transform / Generalization Anscombe Transform算法

    图像降噪算法 Variance Stabilizing Transform Generalization Anscombe Transform算法 图像降噪算法 Variance Stabilizing Transform Generali
  • 图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID

    图像降噪算法 DnCNN FFDNet CBDNet RIDNet PMRID SID 图像降噪算法 DnCNN FFDNet CBDNet RIDNet PMRID SID1 基本原理1 1 DnCNN1 2 FFDNet1 3 CBDN
  • SLAM算法总结——经典SLAM算法框架总结

    SLAM算法总结 经典SLAM算法框架总结 SLAM算法总结 经典SLAM算法框架总结 SLAM算法总结 经典SLAM算法框架总结 从研究生接触SLAM算法到现在也有两三年了 xff0c 期间学习了很多经典的SLAM算法框架并写了一些相关的
  • 计算机视觉算法——基于Anchor Free的目标检测网络总结

    计算机视觉算法 基于Anchor Free的目标检测网络总结 计算机视觉算法 基于Anchor Free的目标检测网络总结1 CornerNet1 1 关键知识点 网络结构及特点1 2 关键知识点 正负样本匹配1 3 关键知识点 损失计算
  • 计算机视觉算法——基于Transformer的语义分割(SETR / Segmenter / SegFormer)

    计算机视觉算法 基于Transformer的语义分割 xff08 SETR Segmenter SegFormer xff09 1 SETR1 1 网络结构及特点1 1 1 Decoder 1 2 实验 2 Segmenter2 1 网络结
  • 计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

    计算机视觉算法 基于深度学习的高精地图算法 xff08 HDMapNet VectorMapNet MapTR VectorNet xff09 计算机视觉算法 基于深度学习的高精地图算法 xff08 HDMapNet VectorMapNe
  • VINS-Mono关键知识点总结——前端详解

    VINS Mono关键知识点总结 前端详解 VINS Mono关键知识点总结 前端详解1 VINS Mono的前端流程概述2 setMask 函数的作用3 rejectWithF 函数的作用4 addPoints 函数和 updataID
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • 深蓝学院《从零开始手写VIO》作业五

    深蓝学院 从零开始手写VIO 作业五 1 完成Bundle Adjustment求解器2 完成测试函数3 论文总结 1 完成Bundle Adjustment求解器 完成单目 Bundle Adjustment 求解器 problem cc
  • VIO在走廊弱纹理环境下的优化——VINS-Mono的点线紧耦合优化

    VIO在走廊弱纹理环境下的优化 VINS Mono的点线紧耦合优化 VIO在走廊弱纹理环境下的优化0 前言1 思路概述1 1 Super Pixel SLAM1 2 Edge SLAM1 3 PL SLAM 2 算法实施2 1 Edge S