精华内容
下载资源
问答
  • 单目SLAM基础

    千次阅读 2019-05-05 16:15:21
    非滤波单目slam基础 非滤波方法的单目视觉SLAM系统综述 论文 直接法 特征点法 混合法区别与联系 按照 2D−2D 数据关联方式的不同 ,视觉定位方法可以分为直接法、非直接法混合法 1. 直接法假设帧间光度值...

    非滤波单目slam基础

    非滤波方法的单目视觉SLAM系统综述 论文

    直接法 特征点法 混合法区别与联系

        按照 2D−2D 数据关联方式的不同 ,视觉定位方法可以分为直接法、非直接法和混合法
    
        1. 直接法假设帧间光度值具有不变性 , 即相机运动前后特征点的灰度值是相同的 . 
           数据关联时 , 根据灰度值对特征点进行匹配,通过最小化光度误差,来优化匹配.
           直接法使用了简单的成像模型 , 
           适用于帧间运动较小的情形 , 但在场景的照明发生变化时容易失败 .
           直接法中是直接对普通的像素点(DTAM),或者灰度梯度大的点(lsd-slam)进行直接法匹配。
           
           直接法起源是光流法,由于使用了图像中大部分的信息,
           对纹理差的部分鲁棒性比直接法好,但是计算量也加大,要并行化计算。
           
           基本原理是亮度一致性约束,
           J(x,y) = I(x + u(x,y) + v(x,y)) ,x,y是图像的像素坐标,u,v是同一场景下的两幅图像I,J的对应点的像素偏移。
           
        2. 非直接法 , 又称为特征法 , 该方法提取图像中的特征进行匹配 , 
           最小化重投影误差得到位姿 . 图像中的特征点以及对应描述子用于数据关联 , 
           通过特征描述子的匹配 ,完成初始化中 2D−2D 以及之后的 3D−2D 的数据关联 .
           例如 ORB (Oriented FAST and rotatedBRIEF, ORBSLAM中 ) 、
                FAST (Features from accelerated seg-ment test) 、 
                BRISK (Binary robust invariant scalable keypoints) 、 
                SURF (Speeded up robustfeatures) , 
                或者直接的灰度块(PTAM中, 使用fast角点+灰度快匹配)
                可用于完成帧间点匹配。
    
        3. 混合法,又称为半直接法,结合直接法和特征点法
           使用特征点法中的特征点提取部分,而特征点匹配不使用 特征描述子进行匹配,
           而使用直接法进行匹配,利用最小化光度误差,来优化特征点的匹配,
           直接法中是直接对普通的像素点(DTAM),或者灰度梯度大的点(lsd-slam)进行直接法匹配。
    

    1. 单目初始化

        单目系统初始化时完成运动估计常用的方法主要有两种 : 
        1) 将当前场景视为一个平面场景 , 估计单应矩阵并分解得到运动估计 , 
           使用这种方法的有 SVO 、 PTAM 等 . 
        2) 使用极线约束关系 , 估计基础矩阵或者本质矩阵 , 分解得到运动估计 , 
           使用这种方法的有 DT SLAM 等 . 
           初始化中遇到的普遍问题是双视几何中的退化问题 . 
           当特征共面或相机发生纯旋转的时候 , 解出的基础矩阵的自由度下降 , 
           如果继续求解基础矩阵 , 那么多出来的自由度主要由噪声决定 . 
           
        3)根据情况旋转两张中间最好的。
           为了避免退化现象造成的影响 , 一些VO 系统同时估计基础矩阵和单应矩阵 , 
           例如 ORB-SLAM 和 DPPTAM, 
           使用一个惩罚函数 , 判断当前的情形 , 选择重投影误差比较小的一方作为运动估计结果 .
    

    初始化 一般的初始化流程: 

        主要是为找到跟第一幅图像有足够数量的特征匹配点,视差足够大的第二幅图像
        1. PTAM初始化要求用户两次输入,来获取地图中的前2个关键帧;
           需要用户在第一个和第二个关键帧之间,做与场景平行的、缓慢平滑相对明显的平移运动。
        2. SVO使用单应进行初始化,但SVO不需要用户输入,算法使用系统启动时的第一个关键帧;
           提取FAST特征,用图像间的KLT算法跟踪特征,视差足够的时候就选择作为第二幅图像,然后计算单应矩阵,只能是2维平面
        3. SD-SLAM从第1个图像随机初始化场景的深度,通过随后的图像进行优化。
           LSD-SLAM初始化方法不需要使用两视图几何。
           不像其他SLAM系统跟踪两视图特征,LSD-SLAM只用单个图像进行初始化
        4. ORB-SLAM 并行计算基本矩阵和单应矩阵,根据对称转移误差(多视图几何)惩罚不同的模型,最终选择最合适的模型
    

    单目深度估计

        单目系统在初始化中还要完成像素点的深度估计 , 单目系统无法直接从单张图像中恢复深度 , 
        因此需要一个初始估计 . 
        解决该问题的:
        一种办法是跟踪一个已知的结构(先验知识); 
        另外一种方法是初始化点为具有较大误差的逆深度, 
           在之后过程中优化(随机过程优化,多高斯分布(卡尔曼滤波器???),
           高斯分布+均匀分布(贝叶斯滤波器 svo))直到收敛至真值 .
           
       像素点的深度估计方法有滤波器方法和非线性优化方法 . 
       其中 SVO 、 DSO 将深度建模为一 个 类 高 斯 模 型 , 然 后 使 用 滤 波 器 估 计 . 
       另 外 一种 方 法 对 深 度 图 构 建 一 个 能 量 函 数 , 例 如 LSD-SLAM 、DTAM 、 DPPTAM 等 , 
          然后使用非线性优化方法最小化能量函数 . 
          该函数包括一个光度值误差项以及一个正则项 , 用来平滑所得结果.
    

    特征点匹配

        在讲解恢复R,T前,稍微提一下特征点匹配的方法。
        常见的有如下两种方式: 
        1. 计算特征点,然后计算特征描述子,通过描述子来进行匹配,优点准确度高,缺点是描述子计算量大。 
        2. 光流法:在第一幅图中检测特征点,使用光流法(Lucas Kanade method)对这些特征点进行跟踪,
           得到这些特征点在第二幅图像中的位置,得到的位置可能和真实特征点所对应的位置有偏差。
           所以通常的做法是对第二幅图也检测特征点,如果检测到的特征点位置和光流法预测的位置靠近,
           那就认为这个特征点和第一幅图中的对应。
           在相邻时刻光照条件几乎不变的条件下(特别是单目slam的情形),
           光流法匹配是个不错的选择,它不需要计算特征描述子,计算量更小。
    

    2. 位姿估计

    通用的位姿估计流程

        这个先验信息可能是恒速运动模型,可能是假设运动量不大,使用上一时刻的位姿。
        1. 恒速运动模型,使用上帧位姿*速度得到当前帧位姿初始值
           PTAM,DT-SLAM,ORB-SLAM,DPPTAM都假设相机做平滑运动采用恒定速度运动模型,
           用跟踪到的之前两幅图像的位姿变化估计作为当前图像的先验知识(用于数据关联的图像位姿的要求和限制)。
           但是,在相机运动方向上有猛烈移动时,这样的模型就容易失效
    
        2. 静止不动模型,使用上帧位姿作为当前帧位姿的初始值
           LSD-SLAM和SVO都假设在随后的图像,相机位姿没有明显改变,因此,这种情况下都是用高帧率相机。
    
        直接和间接方式都是通过最小化图像间的测量误差,优化估计的相机位姿;
        直接方法测量光度误差(像素值误差), 
        间接方法通过最小化从图像上一位姿的地图中获得的路标的重投影到当前帧的重投影误差(几何位置误差)。
    

    单应矩阵H 恢复变换矩阵 R, t

    单目视觉slam 基础几何知识

            p2   =  H12 * p1  4对点   A*h = 0 奇异值分解 A 得到 单元矩阵 H ,  T =  K 逆 * H21*K 
    
            展开成矩阵形式:
            u2         h1  h2  h3        u1
            v2  =      h4  h5  h6    *   v1
            1          h7  h8  h9        1   
            按矩阵乘法展开:
            u2 = (h1*u1 + h2*v1 + h3) /( h7*u1 + h8*v1 + h9)
            v2 = (h4*u1 + h5*v1 + h6) /( h7*u1 + h8*v1 + h9)   
            将分母移到另一边,两边再做减法
            -((h4*u1 + h5*v1 + h6) - ( h7*u1*v2 + h8*v1*v2 + h9*v2))=0  式子为0  左侧加 - 号不变
            h1*u1 + h2*v1 + h3 - ( h7*u1*u2 + h8*v1*u2 + h9*u2)=0  
            写成关于 H的矩阵形式:
            0   0   0   0   -u1  -v1  -1   u1*v2    v1*v2   v2
            u1  v1  1   0    0    0    0   -u1*u2  -v1*u2  -u2  * (h1 h2 h3 h4 h5 h6 h7 h8 h9)转置  = 0
            h1~h9 9个变量一个尺度因子,相当于8个自由变量
            一对点 2个约束
            4对点  8个约束 求解8个变量
            A*h = 0 奇异值分解 A 得到 单元矩阵 H
    
            cv::SVDecomp(A,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);// 奇异值分解
            H = vt.row(8).reshape(0, 3);// v的最后一列
    
            单应矩阵恢复  旋转矩阵 R 和平移向量t
             p2 =  H21 * p1   = H21 * KP   
             p2 = K( RP + t)  = KTP = H21 * KP  
             T =  K 逆 * H21*K      

    本质矩阵F求解 变换矩阵[R t] p2转置 * F * p1 = 0

    参考

    基本矩阵的获得

            空间点 P  两相机 像素点对  p1  p2 两相机 归一化平面上的点对 x1 x2 与P点对应
            p1 = KP 
            p2 = K( RP + t) 
            x1 =  K逆* p1 = P 
            x2 =  K逆* p2 = ( RP + t) = R * x1  + t 
            消去t(同一个变量和自己叉乘得到0向量)
            t 叉乘 x2 = t 叉乘 R * x1
            再消去等式右边
            x2转置 * t 叉乘 x2 = 0 = x2转置 * t 叉乘 R * x1
            得到 :
            x2转置 * t 叉乘 R * x1 = x2转置 * E * x1 =  0 , E为本质矩阵
            也可以写成:
            p2转置 * K 转置逆 * t 叉乘 R * K逆 * p1   = p2转置 * F * p1 =  0 , F为基本矩阵

    几何知识参考

        对极几何原理:
        两个摄像机的光心C0、C1,三维空间中一点P,在两幅图像中的位置为p0、p1(相当于上面的 x1, x2)。
        像素点 u1,u2
        p0 = inv(K) * u0
        p1 = inv(K) * u1
        
              x0    (u0x - cx) / fx 
        p0 =  y0 =  (u0y - cy) / fy
               1     1
               
              x1    (u1x - cx) / fx 
        p1 =  y1 =  (u1y - cy) / fy
               1     1        
        
        如下图所示:
    

        由于C0、C1、P三点共面,得到: 
    

         这时,由共面得到的向量方程可写成:  
         p0 *(t 叉乘 R * p1)
         其中,
         t是两个摄像机光心的平移量;
         R是从坐标系C1到坐标系C0的旋转变换,
         p1左乘旋转矩阵R的目的是把向量p1从C1坐标系下旋转到C0坐标系下(统一表示)。
         
         一个向量a叉乘一个向量b,
         可以表示为一个反对称矩阵乘以向量b的形式,
         这时由向量a=(a1,a2,a3) 表示的反对称矩阵(skew symmetric matrix)如下: 
         
               0  -a3  a2
         ax =  a3  0  -a1
              -a2  a1   0
    

        所以把括号去掉的话,p0 需要变成 1*3的行向量形式
        才可以与 3*3的 反对称矩阵相乘
        
        p0转置 * t叉乘 * R * P1
        
       我们把  t叉乘 * R  = E 写成
       
       p0转置 * E * P1
    

        本征矩阵E的性质: 
    

       一个3x3的矩阵是本征矩阵的充要条件是对它奇异值分解后, 它有两个相等的奇异值,并且第三个奇异值为0。 牢记这个性质,它在实际求解本征矩阵时有很重要的意义 .

       计算本征矩阵E、尺度scale的来由:
       将上述矩阵相乘的形式拆开得到 :
    

        上面这个方程左边进行任意缩放都不会影响方程的解: 
        
       (x0x1 x0y1 x0 y0x1 y0y1 y0 x1 y1 1)*E33(E11/E33 ... E32/E33 1) = 0
       所以E虽然有9个未知数,但是有一个变量E33可以看做是缩放因子,
       因此实际只有8个未知量,这里就是尺度scale的来由,后面会进一步分析这个尺度。
       
       AX=0,x有8个未知量,需要A的秩等于8,所以至少需要8对匹配点,应为有可能有两个约束是可以变成一个的,
       点可能在同一条线上,或者所有点在同一个面上的情况,这时候就存在多解,得到的值可能不对。
       
       对矩阵A进行奇异值SVD分解,可以得到A
    

    p2转置 * F * p1 = 0 8点对8个约束求解得到F

            *                    f1   f2    f3      u1
            *   (u2 v2 1)    *   f4   f5    f6  *   v1  = 0  
            *                    f7   f8    f9       1
            按照矩阵乘法展开:
            a1 = f1*u2 + f4*v2 + f7;
            b1 = f2*u2 + f5*v2 + f8;
            c1 = f3*u2 + f6*v2 + f9;
            得到:
            a1*u1+ b1*v1 + c1= 0
            展开:
            f1*u2*u1 + f2*u2*v1 + f3*u2 + f4*v2*u1 + f5*v2*v1 + f6*v2 + f7*u1 + f8*v1 + f9*1 = 0
            写成矩阵形式:
            [u1*u2 v1*u2 u2 u1*v2 v1*v2 v2 u1 v1 1]*[f1 f2 f3 f4 f5 f6 f7 f8 f9]转置 = 0
            f 9个变量,1个尺度因子,相当于8个变量
            一个点对,得到一个约束方程
            需要8个点对,得到8个约束方程,来求解8个变量
            A*f = 0
            所以F虽然有9个未知数,但是有一个变量f9可以看做是缩放因子,
            因此实际只有8个未知量,这里就是尺度scale的来由,后面会进一步分析这个尺度。 
            
            上面这个方程的解就是矩阵A进行SVD分解A=UΣV转置 后,V矩阵是最右边那一列的值f。
            另外如果这些匹配点都在一个平面上那就会出现A的秩小于8的情况,这时会出现多解,会让你计算的E/F可能是错误的。    
            
            A * f = 0 求 f   
            奇异值分解F 基础矩阵 且其秩为2 
            需要再奇异值分解 后 取对角矩阵 秩为2 后在合成F
    
            cv::Mat u,w,vt;
            cv::SVDecomp(A,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);// A = w * u * vt
            cv::Mat Fpre = vt.row(8).reshape(0, 3);// F 基础矩阵的秩为2 需要在分解 后 取对角矩阵 秩为2 在合成F
            cv::SVDecomp(Fpre,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);
            w.at<float>(2)=0;//  基础矩阵的秩为2,重要的约束条件
            F =  u * cv::Mat::diag(w)  * vt;// 在合成F
    
            从基本矩阵恢复 旋转矩阵R 和 平移向量t
                    F =  K转置逆 * E * K逆
            本质矩阵 E  =  K转置 * F * K =  t 叉乘 R
    
            从本质矩阵恢复 旋转矩阵R 和 平移向量t
            恢复时有四种假设 并验证得到其中一个可行的解.
            本质矩阵E = t 叉乘 R 恢复变换矩阵R,t的时候,有四种情况,但是只有一种是正确的。
            而判断正确的标准,
            就是按照这个R,t 计算出来的深度值(两个坐标系下的三维坐标的Z值)都是正值,
            因为相机正前方为Z轴正方向。
            三角变换计算三维坐标可按后面的方法计算。
    
            本征矩阵的性质: 
            一个3x3的矩阵是本征矩阵的充要条件是对它奇异值分解后,
            它有两个相等的奇异值,
            并且第三个奇异值为0。
            牢记这个性质,它在实际求解本征矩阵时有很重要的意义。
            
            计算本征矩阵E的八点法,大家也可以去看看wiki的详细说明 

    本征矩阵E的八点法

        有本质矩阵E 恢复 R,t
        从R,T的计算公式中可以看到R,T都有两种情况,
        组合起来R,T有4种组合方式。
        由于一组R,T就决定了摄像机光心坐标系C的位姿,
        所以选择正确R、T的方式就是,把所有特征点的深度计算出来,
        看深度值是不是都大于0,深度都大于0的那组R,T就是正确的。
    

    以上的解法 在 orbslam2中有很好的代码解法

    orbslam2 单目初始化

    3. 地图生成

    地图生成的一般流程

        地图生成模块将世界表示成稠密(直接)或稀疏(间接)的点云。
    
        系统将2D兴趣点三角化成3D路标,并持续跟踪3D坐标,然后定位相机,这就是量度地图(pose + point)。
        但是,相机在大场景运行时,量度地图的大小就会无限增大,最终导致系统失效
    
        拓扑地图(pose-graph)可以减少这一弊端,它尽量将地图中的量度信息最小化,
        减少几何信息(尺度,距离和方向)而采用连接信息。
        视觉SLAM中,拓扑地图是一个无向图,节点通常表示关键帧,关键帧通过边连接,节点之间存在相同的数据关联
    
        拓扑地图与大场景的尺度比较吻合,为了估计相机位姿,也需要量度信息;
        从拓扑地图到量度地图的变化并不是一件容易的事情,因此,最近的视觉 SLAM 系统都采用混合地图,局部量度地图和全局拓扑地图。
    
        地图制作过程会处理新路标将其添加到地图中,还检测和处理离群点。
        图标点的添加可以通过三角化,或者滤波实现的位置估计(一般是逆深度,加上一个概率分布),
        收敛到一定的程度就可以加入到地图中。
    

    单目极线搜索匹配点三角化计算初始深度值

        用单应变换矩阵H或者本质矩阵E 求解得到相邻两帧的变换矩阵R,t后就可是使用类似双目的
        三角测距原理来得到深度。
    

        上图中的物理物理中的点    P =[X,Y,Z,1]
        在两相机归一化平面下的点  x1  x2  [x,y,z]
        在两相机像素平面上的点    p1, p2,匹配点对 [u,v,1]
        p1 = k × [R1 t1] × P   
        左乘 k逆 × p1 =  [R1 t1] × P   
        得到 x1 = T1 × P   
        计算 x1叉乘x1 =  x1叉乘T1 × P = 0
        这里 T1 = [I, 0 0 0] 为单位矩阵。
        p2 = k × [R2 t2]  × P    
        左乘 k逆 × p2 =  [R2 t2] × P    
        得到 x2 = T2 × P   
        消去 x2叉乘x2 =  x2叉乘T2 × P = 0      
        式中:
         x1 = k逆 × p1 ,
         x2 = k逆 × p2 , 
         T2= [R, t]为帧1变换到帧2的 已知
        得到两个方程
        x1叉乘T1 × P = 0
         x2叉乘T2 × P = 0 
         写成矩阵形式 A*P = 0
         A = [x1叉乘T1; x2叉乘T2]
        这又是一个要用最小二乘求解的线性方程方程组 ,和求本征矩阵一样,
        计算矩阵A的SVD分解,然后奇异值最小的那个奇异向量就是三维坐标P的解。
        P是3维齐次坐标,需要除以第四个尺度因子 归一化. 
        [U,D,V] = svd(A);
        P = V[:,4] 最后一列
        P = P/P(4);// 归一化
        以上也是由本质矩阵E = t 叉乘 R 恢复变换矩阵R,t的时候,有四种情况,但是只有一种是正确的。
        而判断正确的标准,就是按照这个R,t 计算出来的深度值都是正值,因为相机正前方为Z轴正方向。
    

    概率方法更新矫正 深度值

        我们知道通过两帧图像的匹配点就可以计算出这一点的深度值,
        如果有多幅匹配的图像,那就能计算出这一点的多个深度值。
        一幅图像对应另外n幅图像,可以看作为n个深度传感器,
        把得到点的深度信息的问题看作是有噪声的多传感器数据融合的问题,
        使用Gaussian Uniform mixture model(高斯均值混合模型)来对这一问题进行建模,
        假设好的测量值符合正态分布,好的测量值的比例为pi,
        噪声符合均匀分布,噪声比例为1-pi 使用贝叶斯方法不断更新这个模型,
        让点的深度(也就是正态分布中的均值参数)和好的测量值的比例pi收敛到真实值。 
    

        好的测量值符合正态分布
        噪声符合均匀分布,
        使用贝叶斯方法(最大后验概率)更新,这是SVO中深度滤波的部分。
    
        好的测量值和噪声均符合高斯分布,使用卡尔曼滤波来进行深度测量值的滤波
        这就像对同一个状态变量我们进行了多次测量,
        因此,可以用贝叶斯估计来对多个测量值进行融合,
        使得估计的不确定性缩小。
        如下图所示:
    

        一开始深度估计的不确定性较大(浅绿色部分),
        通过三角化得到一个深度估计值以后,
        能够极大的缩小这个不确定性(墨绿色部分)。 
    

    深度滤波器详细解读

        1. 记录极大值——统计学滤波-测量值区间累加的方法
           同一幅图像中的一个特征点,在多幅图像同进行匹配,选择直方图统计最多的那个深度值
    

           左图是该特征点在一幅图像上面的匹配,随着Z的变化,对应在极线上的不同投影点位置。
           该特征点图块经过仿射变化之后,与不同的投影点位置的图块进行NCC相似度匹配,获取不同的匹配分数,
           然后记录每个区间内(从Zmin到Zmax分了50段区间)的极大值点(比两边都大),落在哪个Z值区间,对应区间频数+1.
           右图是把60幅图像这样的数组累加,把极大值点累加,记录在每个Z值区间出现的极大值的频数。 
           
           即便能知道累加后最高的那个直方图对应的深度值,但不能知道,根据所有的测量结果所推算出来的深度值,
           也不知道,那个特征点对应的外点(假地图点)的概率。 
        
        2. 记录最大值——穷举法——能推算深度值也能算外点概率的方法
           既可以综合所有的测量结果推算出深度值,也可以推算出这个特征点对应的外点的概率。 
           不再记录单幅图像上的所有极大值,而是只记录单幅图像上的最大值。同样地,也把所有的数组累加起来。
           积累了150幅图像的测量值之后,可以得到下图。 
    

           得到测量数据 (x1,x2,...,xn),
           
           需要获取 深度值Z 以及 内点(真地图点)概率pi,
           
           p(Z,pi|x1,x2,...,xn)
           
           要求出一组 Z和pi,使得上面的最大。但是,直接算,算不出来。
           用贝叶斯公式来转换。 
           
           p(Z,pi|x1,x2,...,xn) = p(Z,pi) * p(x1,x2,...,xn|Z,pi) / p(x1,x2,...,xn|Z,pi)
                                正比于 p(Z,pi) * p(x1,x2,...,xn|Z,pi) 
            深度值Z 和 内点概率pi 独立分布
           p(Z,pi) = p(Z)*p(pi), 且两者的先验分布 认为是相同的(均匀分布),概率为常数。
           p(Z,pi) = p(Z)*p(pi) = const常量。
           
            p(Z,pi|x1,x2,...,xn)  正比于 p(Z,pi) * p(x1,x2,...,xn|Z,pi)  
                                  正比于 p(x1,x2,...,xn|Z,pi) 
            x1,x2,...,xn 独立,所以 
             p(x1,x2,...,xn|Z,pi)  = 累乘(xi|Z,pi)
             
            p(Z,pi|x1,x2,...,xn)  正比于 p(Z,pi) * p(x1,x2,...,xn|Z,pi)  
                                  正比于 p(x1,x2,...,xn|Z,pi) 
                                  正比于 累乘(p(xi|Z,pi))
                                  
           p(xi|Z,pi)  可以认为是,内点的高斯分布概率,加上,外点的均匀分布概率,表示成如下公式。
           p(xi|Z,pi) = pi * N() + (1-pi) * U()
           
           通过穷举所有的Z和pi,得到每个组合对应的累乘结果,选取得到最大结果的Z和pi
    

    4. 地图维护

        地图维护通过捆集调整(Bundle Adjustment)或位姿图优化(Pose-Graph)来优化地图。
        地图扩展的过程中,新的3D路标基于相机位姿估计进行三角化。经过一段时间的运行,由于相
        机累积误差增加,相机位姿错误,系统出现漂移(scale-drift)。
    
        位姿图优化相比全局捆集调整返回较差的结果。
        原因是位姿图优化只用于关键帧位姿优化,
        (要是路标相对于的是关键帧表示,而不是世界下的表示,会相应地调整路标的3D结构);
        全局捆集调整都优化关键帧位姿和3D结构。
    
        地图维护也负责检测和删除地图中的由于噪声和错误特征匹配的离群点。
    

    丢失后闭环检测

        视觉词袋BOVM(orb-slam2)
        或者 高斯小图 块匹配(ptam)
    

    思考

        感觉一般的slam按照上面的8个部分,想一遍要能想通,原理上面一般就算是可以了。就剩下代码实践了。
    
        系统有没有特定的要求,大范围的可以吗,室内还是室外,
        是直接法还是间接法,对应的就是稀疏地图还是(半)稠密地图,优化的是几何误差还是光度误差。
    
        需不需要初始化,需要人工的干预,非2维平面可以吗,对应的就是计算本征矩阵还是单应矩阵。
        还是基于滤波的方法,不需要初始化,后续优化就可以。
    
        然后就是tracking,因为视觉slam是一个非凸函数,需要一个初始值,
        对应的就是你的prior是什么,恒速运动模型还是高速相机,把前一帧的位姿当做初始值。
    
        追踪的过程的优化函数是什么,是光度不变,还是几何误差,就是g2o中边,顶点的构造。
    
        当然还要维护地图,地图中的点是怎么表示,基于逆深度,还是欧式几何表示,camera-anchor的表示。
        地图维护中要进行BA,还是Pose-Graph的优化,还是杂交。
    
        然后就是闭环的检测,基于视觉词带,还是随机取一些帧进行Image Alignment。
    
        当然这其中还有无数细节,运动快,模糊是怎么处理的(加大搜索范围,从金字塔coarse-fine的搜索),
        Tracking lost在什么情况下发生,怎么进行重定位。
    
        最小二乘法要做几次,怎么时候收敛,要不要给他设个时间约束,权重怎么设置等等。
    展开全文
  • ORB_SLAM2系列之二:ORB_SLAM2跑单目SLAM

    千次阅读 2017-11-29 22:33:12
    接上一篇ORB_SLAM2系列之一:Ubuntu 14.04 ROS indigo下编译安装ORB_SLAM2,ORB_SLAM2提供了单目,双目和rgbd接口,这里我们先来尝试运行下最简单的单目SLAM(MonoSLAM)。理论上编译成功之后直接进入到ORB_SLAM2/...

    接上一篇ORB_SLAM2系列之一:Ubuntu 14.04 ROS indigo下编译安装ORB_SLAM2,ORB_SLAM2提供了单目,双目和rgbd接口,这里我们先来尝试运行下最简单的单目SLAM(MonoSLAM)。

    链接库

    首先需要解决个错误:

    error while loading shared libraries: libGLEW.so.2.1: cannot open shared obj

    解决:

    ln -s /usr/lib64/libGLEW.so.2.1 /usr/lib/libGLEW.so.2.1

    准备工作空间

    依次执行以下命令:

    mkdir -p /home/catkin_ws/src
    cd /home/catkin_ws/src/
    catkin_init_workspace
    cd .. && catkin_make
    echo "source /home/catkin_ws/devel/setup.bash" >> ~/.bashrc
    chmod 777 catkin_ws/
    source /home/catkin_ws/devel/setup.bash 
    source ~/.bashrc

    现在/home/catkin_ws目录就是你设定的ROS的工作空间,以后需要其他的库都克隆到/home/catkin_ws/src目录下,然后回退到目录/home/catkin_ws/下,执行catkin_make进行编译。

    编译ORB-SLAM2,DBow2和g2o

    将ORB-SLAM2克隆到ROS的工作路径/home/catkin_ws/下。DBow和g2o这两个库在ORB-SLAM2的Thirdparty目录中,下载ORB-SLAM2源代码后,使用提供的脚本build.sh即可将它们一并编译了。

    cd /home/catkin_ws/src
    
    git clone https://github.com/raulmur/ORB_SLAM2.git
    
    cd ORB_SLAM2
    
    ./build.sh
    
    cd ../..
    
    source devel/setup.bash
    
    rospack profile
    

    其中,build.sh内容如下:

    echo "Configuring and building Thirdparty/DBoW2 ..."
    
    cd Thirdparty/DBoW2
    mkdir build
    cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release
    make -j
    
    cd ../../g2o
    
    echo "Configuring and building Thirdparty/g2o ..."
    
    mkdir build
    cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release
    make -j
    
    cd ../../../
    
    echo "Uncompress vocabulary ..."
    
    cd Vocabulary
    tar -xf ORBvoc.txt.tar.gz
    cd ..
    
    echo "Configuring and building ORB_SLAM2 ..."
    
    mkdir build
    cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release
    make -j

    完成DBow2,g2o,ORB-SLAM的编译,解压DBow2字典文件.ORB-SLAM2启动时,也需要载入这个100多M的文件,比较耗时。

    笔记本摄像头驱动安装

    如果你使用笔记本自带的摄像头,可以使用博世公司的 “usb_cam”:A ROS Driver for V4L USB Cameras。相似地,将usb_cam克隆到ROS的工作路径/home/catkin_ws/下。

    cd /home/catkin_ws/src/
    
    git clone https://github.com/bosch-ros-pkg/usb_cam.git
    
    cd ../..
    
    catkin_make
    
    source devel/setup.bash
    
    rospack profile

    设定相机参数

    #/home/research/ORB_SLAM2/Examples/Monocular/my.yaml
    
    %YAML:1.0
    
    #--------------------------------------------------------------------------------------------
    # Camera Parameters. Adjust them!
    #--------------------------------------------------------------------------------------------
    
    # Camera calibration and distortion parameters (OpenCV)
    Camera.fx: 517.306408
    Camera.fy: 516.469215
    Camera.cx: 318.643040
    Camera.cy: 255.313989
    
    Camera.k1: 0.262383
    Camera.k2: -0.953104
    Camera.p1: -0.005358
    Camera.p2: 0.002628
    Camera.k3: 1.163314
    
    Camera.width: 640
    Camera.height: 480
    
    # Camera frames per second
    Camera.fps: 30.0
    
    # Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
    Camera.RGB: 1
    
    #--------------------------------------------------------------------------------------------
    # ORB Parameters
    #--------------------------------------------------------------------------------------------
    
    # ORB Extractor: Number of features per image
    ORBextractor.nFeatures: 1000
    
    # ORB Extractor: Scale factor between levels in the scale pyramid
    ORBextractor.scaleFactor: 1.2
    
    # ORB Extractor: Number of levels in the scale pyramid
    ORBextractor.nLevels: 8
    
    # ORB Extractor: Fast threshold
    # Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
    # Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
    # You can lower these values if your images have low contrast
    ORBextractor.iniThFAST: 20
    ORBextractor.minThFAST: 7
    
    #--------------------------------------------------------------------------------------------
    # Viewer Parameters
    #--------------------------------------------------------------------------------------------
    Viewer.KeyFrameSize: 0.05
    Viewer.KeyFrameLineWidth: 1
    Viewer.GraphLineWidth: 0.9
    Viewer.PointSize:2
    Viewer.CameraSize: 0.08
    Viewer.CameraLineWidth: 3
    Viewer.ViewpointX: 0
    Viewer.ViewpointY: -0.7
    Viewer.ViewpointZ: -1.8
    Viewer.ViewpointF: 500
    

    运行

    rosrun ORB_SLAM2 Mono /home/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/research/ORB_SLAM2/Examples/Monocular/my.yaml

    参考

    1.使用自己笔记本摄像头运行orbslam2:http://blog.csdn.net/qq_18661939/article/details/51829157
    2.用电脑自带的摄像头跑orb_slam2:https://zhuanlan.zhihu.com/p/29629824
    3.ORB-SLAM跑通笔记本摄像头:http://www.cnblogs.com/shang-slam/p/6733322.html
    4.在ROS中使用usb摄像头跑ORB SLAM2:http://blog.csdn.net/Goding_learning/article/details/52950993

    展开全文
  • ORB-SLAM:精确多功能单目SLAM系统

    万次阅读 2017-04-21 16:58:31
    ORB-SLAM: a Versatile and Accurate Monocular SLAM System Taylor Guo, 2016年3月18日-9:00 原文发表于:IEEE Transactions on Robotics ...本文主要讲了ORB-SLAM,一个基于特征识别的单目slam系统,可以实时运行,

    ORB-SLAM: a Versatile and Accurate Monocular SLAM System

    Taylor Guo, 2016年3月18日-9:00

    原文发表于:IEEE Transactions on Robotics (Impact Factor: 2.43). 10/2015

    摘要:

    本文主要讲了ORB-SLAM,一个基于特征识别的单目slam系统,可以实时运行,适用于各种场合,室内的或者室外的,大场景或小场景。系统具有很强的鲁棒性,可以很好地处理剧烈运动图像、可以有比较大的余地自由处理闭环控制、重定位、甚至全自动位置初始化。基于近年来的优秀算法,我们对系统做了精简,采用了所有SLAM相同功能:追踪,地图构建,重定位和闭环控制。选用了比较适合的策略,地图重构的方法采用云点和关键帧技术,具有很好的鲁棒性,生成了精简的、可追踪的地图,当场景的内容改变时,地图构建可持续工作。我们用最流行的图像数据集测试了27个图像序列。相比最新的单目SLAM,ORB SLAM性能优势明显。我们在网站上公布了源代码。

    一  简介

    由于比较强的匹配网络和初始化位置估计,BA广泛应用于相机位置的准确估计和离散几何重构。在一段比较长的时间里,这种方法被认为不适合实时图像系统,比如vSLAM。vSLAM系统在构建环境的同时需要估计相机的轨迹。基于现有的硬件设备,现在可以获得比较好的计算结果,将BA应用于实时SLAM系统中:

    • 在候选图像帧子集中(关键帧)匹配观测的场景特征(地图云点)。
    • 由于关键帧数量的增长,需要做筛选避免冗余。
    • 关键帧和云点的网络配置可以产生精确的结果,也就是,分布良好的关键帧集合和有明显视差、大量闭环匹配的观测云点。
    • 关键帧和云点位置的初始估计,采用非线性优化的方法。
    • 在构建局部地图的过程中,优化的关键是获得良好的稳定性。
    • 本系统可以实时执行快速全局优化(比如位置地图)闭环回路。

    B A出现于PTAM中,第一次实时应用是视觉里程。尽管受制于小场景的应用,这个算法对关键帧的选择,特征匹配,云点三角化,每帧相机位置估计,追踪失败后的重定位非常有效。不幸的是几个关键因素限制了它的应用:缺少闭环控制和足够的阻塞处理,较差的视图不变特性和在形成地图过程中需要人工干预。

    为了完成这些工作,我们采用的技术来源于,PTAM、place recognization、scale-aware loop closing和大场景的视图关联信息。

    单目ORB SLAM系统包含:

    • 对所有的任务采用相同的特征,追踪、地图构建、重定位和闭环控制。这使得我们的系统更有效率、简单可靠。ORB特征,在没有GPU的情况下可以应用于实时图像系统中,具有很好的旋转不变特性。
    • 可应用于实时户外环境操作。由于其视图内容关联的特性,追踪和地图构建可在局部视图关联中处理,这可以独立于全局视图进行工作。
    • 基于位置优化的实时闭环控制,我们称作Essential Graph。它通过生成树构建,生成树由系统、闭环控制链接和视图内容关联强边缘进行维护。
    • 实时相机重定位具有明显的旋转不变特性。这就使得跟踪丢失可以重做,地图也可以重复使用。
    • 选择不同的模型可以创建不同的平面或者非平面的初始化地图;自动的、具有良好鲁棒性的初始化过程也是基于模型而选择。
    • 大量地图云点和关键帧,需要经过严格的挑选,必须找到一个最合适的办法。好的挑选方法可以增强追踪的鲁棒性,同时去除冗余的关键帧以增强程序的可操作性。

    我们在公共数据集上对程序在室内和室外环境进行了评估,包括手持设备、汽车和机器人。相机的位置比现在最新的方法更精确,它通过像素扩展集进行优化、而不是特征的重映射。我们还讨论了提高基于特征的方法的准确性的原因。

    闭环控制和重定位的方法是基于我们之前的工作论文11。系统最初的版本是论文12。本文中我们添加了初始化的方法,Essential graph 和其他方法。我们详细了描述了系统的各个板块,并且做了实验进行验证。就我们所知,这是目前最完整最可靠的单目SLAM系统。视频演示和源代码放在我们的项目网站上。

    二  相关工作

    A.     位置识别

    论文13比较几种基于图像处理技术的位置识别的方法,其中有图像到图像的匹配,在大环境下比地图到地图或图像到地图方法尺度特性更好。图像方法中,词袋模型的效率更高,比如基于概率论的FAB-MAP。由BRIEF特征描述子和FAST特征检测产生的二进制词袋可以用DBoW2获得。与SURF和SIFT相比,它的特征提取运算时间减小一个数量级。尽管系统运行效率高、鲁棒性好,采用BRIEF不具有旋转不变性和尺度不变性,系统只能运行在平面轨迹中,闭环检测也只能从相似的视角中获得。在我们之前的工作中,我们用DBoW2生成了基于ORB的词袋模型位置识别器。ORB是具有旋转不变和尺度不变特性的二进制特征,它是一种高效的具有良好针对视图不变的识别器。我们在4组不同的数据集上演示了位置识别功能,复用性好,鲁棒性强,从10K图像数据库中提取一个候选闭合回路的运算时间少于39毫秒。在我们的工作中,我们提出了一种改进版本的位置识别方法,采用内容相关的视图,检索数据库时返回几个前提而不是最好的匹配。

    B.     地图初始化

    单目SLAM通过图像序列生成初始化地图,单一图像并不能重建深度图。解决这个问题的一种方法是一开始跟踪一个已知的图像结构。在滤波方法中,用概率论方法从逆深度参数方法得到深度图中,初始化地图云点,与真实的位置信息融合。论文10中,采用类似的方法初始化像素的深度信息得到随机数值。

    通过两个局部平面场景视图进行初始化的方法,从两个相关相机(视图)位姿进行3D重构,相机的位姿关系用单映射表示,或者计算一个基本矩阵,通过5点算法构建平面模型或者一般场景模型。两种方法都不会受到低视差的约束,平面上的所有的点也不需要靠近相机中心。另外,非平面场景可以通过线性8点算法来计算基本矩阵,相机的位姿也可以重构。

    第四章详细讲述了一个全新的自动方法,它基于平面单映射或非平面的基本矩阵。模型选择的统计方法如论文28详细描述。基于相似变换理论,我们开发了初始化算法,选择退化二次曲线例子中基本矩阵,或单映射矩阵。在平面例子中,为了程序稳定性,如果选择情况模糊不清,我们尽量避免做初始化,否则方案可能崩溃。我们会延迟初始化过程,直到所选的方案产生明显的视差。

    C.     Monocular SLAM (单目SLAM)

    Mono-SLAM可以通过滤波方案初始化。在这种方案,每一帧都通过滤波器估计地图特征位置和相机位姿,将其关联。处理连续的图像帧需要进行大量运算,线性误差会累积。由于地图构建并不依赖于帧率,基于关键帧的方法,用筛选的关键帧估计地图,采用精确的BA优化。论文31演示了基于关键帧的地图方法比滤波器方法在相同的运算代价上更精确。

    基于关键帧技术最具代表性的SLAM系统可能是PTAM。它第一次将相机追踪和地图构建分开,并行计算,在小型场合,如增强现实领域非常成功。PTAM中的地图云点通过图像区块与FAST角点匹配。云点适合追踪但不适合位置识别。实际上,PTAM并不适合检测大的闭合回路,重定位基于低分辨率的关键帧小图像块,对视图不变性较差。

    论文6展示了大场景的单目SLAM系统,前端用GPU光流,用FAST特征匹配和运动BA;后端用滑动窗口BA。闭环检测通过7自由度约束的相似变换位姿图优化,能够校正单目系统中的尺度偏移。我们采用这种7自由度的位姿图优化方法,应用到我们的Essential Graph方法中,如第三章D节里面详细描述。

    论文7用,PTAM的前端,通过内容相关的视图提取局部地图执行追踪。他们使用两个窗口优化后端,在内部窗口中采用BA,在外部一个限制大小的窗口做位姿图。只有在外部窗口尺寸足够大可以包含整个闭环回路的情况下,闭环控制才能起作用。我们采用了基于内容相关的视图构建局部地图的方法,并且通过内容相关的视图构建位姿图,同时用它们设计前端和后端。另一个区别是,我们并没有用特别的特征提取方法做闭合回路检测(比如SURF方法),而是在相同的追踪和建图的特征上进行位置识别,获得具有鲁棒性的重定位和闭环检测。

    论文33 提出了CD-SLAM方法,一个非常复杂的系统,包括闭环控制,重定位,动态环境、大场景下运行。但它的地图初始化并没有讲。所以没法做精确性、鲁棒性和大场景下的测试对比。

    论文34的视觉里程计方法使用了ORB特征做追踪,处理BA后端滑动窗口。相比之下,我们的方法更具一般性,他们没有全局重定位,闭环回路控制,地图也不能重用。他们使用了相机到地面的真实距离限制单目尺度漂移。

    论文25与我们之前的工作论文12一样,也采用的相同的特征做追踪,地图构建和闭环检测。由于选择BRIEF,系统受限于平面轨迹。从上一帧追踪云点,访问过的地图不能重用,与视觉里程计很像,因此系统不能扩展。我们在第三章E小节里面定性地做了比较。

    论文10里的LSD-SLAM,可以构建大场景的半稠密地图,特征提取并没有采用BA方法,而是直接方法(优化也是直接通过图像像素)。没有用GPU加速,构建了半稠密地图,可以运行在实时应用中,非常适合机器人应用,比其他基于特征的稀疏地图SLAM效果好。但它们仍然需要特征做闭环检测,相机定位的精度也明显比PTAM和我们的系统慢,我们将在第8章B小节演示实验结果。在IX章B小节进行讨论。

    论文22提出了介于直接方式和基于特征的方法之间的半直接视觉里程SVO方法。不需要每帧都提取特征点,可以运行在较高的帧率下,在四轴飞行器上效果很好。然而,没有闭环检测,而且只使用了视角向下的摄像头。

    最后,我们想讨论关键帧的选择。所有的的视觉SLAM用所有的云点和图像帧运行BA是不可行的。论文31在保留了尽可能多地非冗余关键帧和云点,性价比较高。PTAM方法非常谨慎插入关键帧避免运算量增长过大。这种严格限制关键帧插入策略可能在未知地图追踪使失败。比较好的策略是在不同的场景下快速插入关键帧,然后再移除那些冗余的图像帧,避免额外的运算成本。

    三  系统架构

    A.     特征选择

    我们系统设计的中心思想是对这些功能采用相同的特征,构建地图、追踪、位置识别、基于图像帧率的重定位和闭环回路检测。这使得我们的系统更有效率,没有必要极化特征识别的深度图,如论文6,7里讨论的。我们每张图像的特征提取远少于33毫秒,SIFT(~300ms),SURF(~300ms),A-KAZE(~100ms)。为了获得一般性的位置识别方法,我们需要特征提取的旋转不变性,而BRIEF和LDB不具备这样的特性。

    我们选择了我们选择了ORB,它是旋转多尺度FAST角点检测,具有256位特征描述子。他们计算和匹配的速度非常快,同时对视角具有旋转不变的特性。这样可以在更宽的基准线上匹配他们,增强了BA的精度。我们已经在论文11中演示了ORB位置识别的性能。本文的方案中也采用ORB。

    B.     三个线程:追踪、局部地图构建和闭环控制

    我们的系统如图一所示,整合了三个并行的线程:追踪、局部地图构建和闭环回路控制。追踪线程通过每帧图像定位相机位置,决定什么时候插入一个新的关键帧。我们先通过前一帧图像帧初始化特征匹配,采用运动B A优化位姿。如果追踪丢失,位置识别模块执行全局重定位。一旦获得最初的相机位姿估计和特征匹配,通过内容相似视图的关键帧提取一个局部可视化地图,如图2a,b所示。然后进行映射搜索局部地图云点的匹配,根据匹配优化相机位姿。最后,追踪线程决定是否插入新的关键帧。所有的追踪步骤将在第5章详细解释。创建初始化地图将在第4章进行说明。

    局部地图构建处理新的关键帧,在相机位姿的环境中执行局部BA优化重构。根据交互视图中已经连接的关键帧,搜索新关键帧中未匹配的ORB特征的对应关系,来三角化新的云点。有时尽管已经创建了新的云点,基于追踪线程过程中新收集的信息,为了获得高质量的云点,根据云点筛选策略可能会临时删除一些点。局部地图构建也负责删除冗余关键帧。我们将在第6章详细说明局部地图构建的步骤。

    对每个新的关键帧都要进行闭环搜索,以确认是否形成闭环。如果闭环被侦测到,我们就计算相似变换来查看闭环的累积误差。这样闭环的两端就可以对齐,重复的云点就可以被融合。最后,相似约束的位姿图优化确保全局地图一致性。本文主要通过关键图像(Essential Graph)进行优化,它是一个交互视图中离散的子图像,第三章D小节详细描述。闭环检测和校验步骤将在第7章详细描述。

    我们使用g2o库中的Levenverg-Marquardt算法执行全局优化。我们在附录中描述了每个优化的误差,计算成本和变量。

    A.     地图云点、关键帧和选择标准

    每个地图云点pi保存:

    • 它在世界坐标系中的3D位置Xw,i
    • 视图方向ni,也就是所有视图方向的平均单位向量(这个方向是以观察关键帧的光学中心到云点的方向)
    • ORB特征描述子Di,已经观测到云点的关键帧与它关联的所有其他特征描述子相比,它汉明距离最小
    • 根据ORB特征尺度不变性约束,可观测的云点的最大距离dmax和最小距离dmin

    每个关键帧Ki保存:

    • 相机位姿Tiw,从世界坐标转换成相机坐标
    • 相机内参,包括主点和焦点距离
    • 所有从图像帧提取的ORB特征,不管是否已经关联了地图云点,云点的坐标经过校准模型矫正过

    地图云点和关键帧通过多重策略创建,在稍后挑选机制上将检测冗余的关键帧和错误匹配的云点或不可追踪的地图云点。系统在运行的过程中,地图扩展的弹性就比较好,在比较恶劣的环境下(比如视图旋转,快速移动)还是需要增强鲁棒性,在同一环境的重复访问情况下地图的大小是有限的,可以控制的。另外,与PTAM相比,由于包含的云点比较少,我们的地图包含的无效数据也更少一些。地图云点和关键帧的筛选过程将在第6章B节和E节分别解释。

    B.     内容关联视图和重要视图

    关键帧之间的视图内容相关信息在系统的几个功能上都非常有用,如论文7所述,它表示了一个间接的权重图像。每个节点都是一个关键帧,关键帧之间存在一个边缘,帧上面可以观察到相同的地图云点(至少有15个),对于边缘上相同的云点的数量我们赋予权重θ。

    为了矫正闭环回路,我们像论文6那样做位姿图优化,优化方法将闭环回路的误差分散到图像里。为了排除内容相关视图的边缘,可能非常密集,我们构建了关键图像(Essential Graph)保留所有的节点(关键帧),但是边缘更少,这可以保持一个比较强的网络以获得精确的结果。系统增量式地构建一个生成树,从第一个关键帧开始,它连接了边缘数量最少的内容相关视图的子图像。当新的关键帧插入时,它加入树中连接到老的关键帧上,新旧关键帧具有最多的相同的云点,但一个关键帧通过筛选策略删除时,系统会根据关键帧所在的位置更新链接。关键图像(Essential Graph)包含了一个生成树,具有高视图相关性(θmin=100)的相关视图的边缘子集,闭环回路边缘产生一个相机的强网络。图2是一个相关视图的例子,生成树和关联的关键图像。第8章E节的实验里,运行位姿图优化时,方案效果精确BA优化几乎没有增强系统效果。关键图像的效果和θmin的效果如第8章E节所示。

    C.     基于图像词袋模型的位置识别

    采用DBoW2,系统嵌入了图像词袋位置识别模块,执行闭环检测和重定位。视觉单词离散分布于特征描述子空间,视觉单词组成视觉字典。视觉字典是离线创建的,用ORB特征描述子从大量图像中提取。如果图像都比较多,相同的视觉字典在不同的环境下也能获得很好的性能,如论文11那样。系统增量式地构建一个数据库,包括一个逆序指针,存储每个视觉字典里的视觉单词,关键帧可以通过视觉字典查看,所以检索数据库效率比较高。当关键帧通过筛选程序删除时,数据库也会更新。

    关键帧在视图上可能会存在重叠,检索数据库时,可能不止一个高分值的关键帧。DBoW2认为是图像重叠的问题,就将时间上接近的所有图像的分值相加。但这并没有包括同一地点不同时间的关键帧。我们将这些与内容相关视图的关键帧进行分类。另外,我们的数据库返回的是分值高于最好分值75%的所有关键帧。

    词袋模型表示的特征匹配的另外一个优势在论文5里详细介绍。如果我们想计算两个ORB特征的对应关系,我们可以通过暴力匹配视觉字典树上某一层(6层里面选第2层)的相同节点(关键帧)里的特征,这可以加快搜索。在闭环回路检测和重定位中,我们通过这个方法搜索匹配用作三角化新的云点。我们还通过方向一致性测试改进对应关系,具体如论文11,这可以去掉无效数据,保证所有对应关系的内在方向性。

    四全自动地图初始化

    地图初始化的目的是计算两帧之间的相关位姿来三角化一组初始地图云点。这个方法与场景图像不相关(平面的或一般的)而且不需要人工干预去选择一个好的两个视图对应关系,比如具有明显视差。我们建议并行计算两个几何模型,平面视图的单映射和非平面视图的基本矩阵。我们用启发式的方法选择模型,并从相关位姿中进行重构。当个视图之间的关系比较确定时,我们才发挥作用,检测低视差的情况或已知两部分平面模糊的情况(如论文27所示),避免生成一个有缺陷的地图。这个算法的步骤是:

    1. 查找最初的对应关系:

    从当前帧Fc提取ORB特征(只在最好的尺度上),与参考帧Fr搜索匹配Xc<-->Xr。如果找不到足够的匹配,就重置参考帧。

    1. 并行计算两个模型:

    在两个线程上并行计算单映射Hcr和基本矩阵Fcr:

    Xc=HcrXr                                 XcTFcrXr=0                             (1)

    在《多视图几何》里详细解释了分别使用归一化直接线性变换DLT和8点算法计算原理,通过RANSAC计算。为了使两个模型的计算流程尽量一样,将两个模型的迭代循环次数预先设置成一样,每次迭代的云点也一样,8个基本矩阵,4个单映射。每次迭代我们给每一个模型M(H表示单映射,F表示基本矩阵)计算一个数值SM

    其中,dcr2和drc2是帧和帧之间对称的传递误差。TM是无效数据的排除阈值,它的依据是X2的95%(TH=5.99, TF=3.84,假设在测量误差上有1个像素的标准偏差)。τ等于TH,两个模型在有效数据上对于同一误差d的分值相同,同样使得运算流程保持一致。

    单映射和基本矩阵的分值最高。如果没有足够的有效数据,模型没有找到,算法流程重启,从第一步开始重新寻找。

    1. 模型的选择:

    如果场景是平面的,靠近平面有一个低视差,可以通过单映射来描述。同样地,我们也可以找到一个基本矩阵,但问题不能很好地约束表示,从基本矩阵重构运动场景可能会导致错误的结果。我们应该选择单映射作为重构的方法,它可以从二维图像正确初始化或者检测到的低视差的情况而不进行初始化工作。另外一方面,非平面场景有足够的视差可以通过基本矩阵来表示,但单映射可以用来表示二维平面或者低视差的匹配子集。在这种情况下我们应该选择基本矩阵。我们用如下公式进行计算:

    如果RH>0.45 , 这表示二维平面和低视差的情况。其他的情况,我们选择基本矩阵。

    1. 运动和运动结构重构

    一旦选择好模型,我们就可以获得运动状态。在单映射的例子中,我们通过论文23的方法,提取8种运动假设。这个方法通过测试选择有效的方案。如果在低视差的情况下,云点跑到相机的前面或后面,测试就会出现错误从而选择一个错的方案。我们建议直接三角化8种方案,检查两个相机前面具有较少的重投影误差情况下,在视图低视差情况下是否大部分云点都可以看到。如果没有一个明确的方案胜出,我们就不执行初始化,重新从第一步开始。这种方法就提供了一个清晰的方案,在低视差和两个交叉的视图情况下,初始化程序更具鲁棒性,这是我们方案鲁棒性的关键所在。在基本矩阵的情况下,我们用校准矩阵和本证矩阵进行转换:

    我们通过论文2中的单值分解方法提取四种运动假设。针对单映射,我们三角化四种方案进行重构。

    1. 捆集调整

    最后我们执行一个全局捆集调整,如附录所示,用来优化初始化重构。

    图3所示的论文39,室外环境下初始化工作具有很大挑战。PTAM和LSD-SLAM初始化二维平面所有云点,我们的方法是有足够视差才进行初始化,从基本矩阵正确地初始化。

     

    五追踪

    这章我们详细介绍追踪线程通过相机图像每一帧执行的具体步骤。相机的位置优化,如前几步提到的,由局部捆集调整构成,如附录中详细描述。

    A.     ORB特征提取

    我们在8层图像金字塔,提取FAST角点,尺度因子为1.2。如果图像分辨率从512*384到752*480,我们发现提取1000个角点比较合适,如果分辨率提高,如KITTI数据集,论文40,我们提取2000个角点。为了确保单映射分布,我们将每层分成网格,每格提取至少5个角点。检测每格角点的时候,如果角点数量不够,就提高阈值。角点的数量根据单元格变化,即使单元格检测不出角点(没有纹理或对比度低的情况)。再根据保留FAST的角点计算方向和ORB特征描述子。ORB特征描述子用于所有的特征匹配,而不是像P T A M那样根据图像区块关联性进行搜索。

    B.     前一图像帧作初始位姿估计

    如果上一帧的追踪成功,我们就用同样的速率运动模型计算相机位置,搜索上一帧观测到的地图云点。如果没有找到足够的匹配(比如,运动模型失效),我们就加大搜索范围搜索上一帧地图云点附近的点。通过寻找到的对应关系优化相机位姿。

    C.     初始化位姿估计与全局重定位

    如果跟踪丢失,我们把当前帧转换成图像词袋,检索图像数据库,为全局重定位查找关键帧。我们计算ORB特征和每个关键帧的地图云点的对应关系,如第三章E节描述。接着,我们对每个关键帧执行RANSAC迭代计算,用PnP算法找出相机位置。如果通过足够的有效数据找到相机位姿,我们优化它的位姿,搜索候选关键帧的地图云点的更多的匹配。最后,相机位置被进一步优化,如果有足够的有效数据,跟踪程序将持续执行。

    D.    局部地图追踪

    一旦我们获得了相机位姿和一组初始特征匹配的估计,我们可以将地图和图像帧对应起来,搜索更多地图云点的对应关系。为了减少大地图的复杂性,我们只映射局部地图。局部地图包含一组关键帧K1,它们和当前关键帧有相同的地图云点,与相邻的关键帧组K2图像内容相关。局部地图有一个参考关键帧Kref∈K1,它与当前帧具有最多相同的地图云点。针对K1, K2可见的每个地图云点,我们通过如下步骤,在当前帧中进行搜索:

    1. 计算当前帧中的地图云点映射集x。如果位于图像边缘外面的点,就丢掉。
    2. 计算当前视图射线v和地图云点平均视图方向n的夹角。如果n< cos(60o),就丢掉。
    3. 计算地图云点到相机中心的距离d。如果它不在地图云点的尺度不变区间,即d∉[dmin,dmax],就丢掉。
    4. 计算每帧图像的尺度因子,比值为d/dmin
    5. 对比地图云点的特征描述子D和当前帧中还未匹配的ORB特征,在尺度因子,和靠近x的云点作最优匹配。

    相机位姿最后通过当前帧中获得所有的地图云点进行优化。

    E.      新关键帧的判断标准

    最后一步是决定当前帧是否可以作为关键帧。局部地图构建的过程中有一个机制去筛选冗余的关键帧,我们尽可能快地插入关键帧,这可以使跟踪线程对相机的运动更具鲁棒性,尤其是旋转。我们根据以下要求插入新的关键帧:

    1. 每次全局重定位过程需要超过20个图像帧。
    2. 局部地图构建处于空闲状态,或者上一个关键帧插入时,已经有超过20个关键帧。
    3. 当前帧跟踪至少50个地图云点。
    4. 当前帧跟踪少于参考关键帧云点的90%。

    与PTAM中用关键帧的距离作为判断标准不同,我们加入一个最小的视图变换,如条件4要求。条件1 确保一个好的重定位,条件3保证好的跟踪。当局部地图构建处于忙状态(条件2的后半部分)的同时插入关键帧的时候,就会发信号去暂停局部捆集调整,这样就可以尽可能快地去处理新的关键帧。

    六局部地图构建

    这章我们将描述根据每个新的关键帧Ki构建局部地图的步骤。

    A.关键帧插入

    我们先更新内容相关的视图,添加节点Ki,更新关键帧间具有相同地图云点产生的边缘。我们还要更新生成树上Ki和其他关键帧的链接。然后,计算表示关键帧的词袋,用于数据关联来三角化新的云点。

    B.地图云点筛选

    保留在地图里的地图云点,在最初创建的3个关键帧上,需要经过严格的检测,保证它们可以被跟踪,不会由于错误的数据被错误地被三角化。一个云点必须满足如下条件:

    1. 跟踪线程必须要找到超过25%的关键帧。
    2. 如果超过一个关键帧完成地图云点创建过程,它必须至少是能够被其他3个关键帧可被观测到。

    一旦一个地图云点通过测试,它只能在被少于3个关键帧观测到的情况下移除。在局部捆集调整删除无效观测数据的情况下,关键帧才能被筛除掉。这个策略使得我们的地图包含很少的无效数据。

    C.新地图云点标准

    在内容相关的视图Kc之间三角化ORB特征向量,可以创建新的地图云点。对Ki中每个未匹配的ORB特征,和其他关键帧中没有匹配的云点,我们查找一个匹配。这个匹配过程在第三章E节详细解释,丢掉那些不满足极对约束的匹配。ORB特征对三角化后,将要获得新的云点,这时要检查两个相机视图的景深,视差,重映射误差,和尺度一致性。起初,一个地图云点通过2个关键帧进行观测,但它却是和其他关键帧匹配,所以它可以映射到其他相连的关键帧,按照第5章D节的方法搜索对应关系。

    A.     局部捆集调整

    局部捆集调整优化当前处理的关键帧Ki, 在交互视图集Kc中所有连接到它的关键帧,和所有被这些关键帧观测到的地图云点。所有其他能够观测到这些云点的关键帧但没有连接到当前处理的关键帧的这些关键帧会被保留在优化线程中,但会被修复。被标记为无效数据的观测将在优化中间阶段和最后阶段被丢弃。附录有详细的优化细节。

    B.     局部关键帧筛选

    为了使重构保持简洁,局部地图构建尽量检测冗余的关键帧,删除它们。这会大有帮助,随着关键帧数量的增加,捆集调整的复杂度增加,但关键帧的数量也不会无限制地增加,因为它要在同一环境下在整个运行执行操作,除非场景内容发生变化。我们会删除Kc中所有90%的地图云点可以至少被其他3个关键帧在同一或更好的尺度上观测到的关键帧。

    七闭环控制

    闭环控制线程获取Ki,上一个局部地图构建的关键帧,用于检测和闭合回环。具体步骤如下所示:

    A.        候选回环检测

    我们先计算Ki的词袋向量和它在视图内容相关的所有邻近图像(θmin=30)中计算相似度,保留最低分值Smin。然后,我们检索图像识别数据库,丢掉那些分值低于Smin的关键帧。这和DBoW2中均值化分值的操作类似,可以获得好的鲁棒性,它计算的是前一帧图像,而我们是使用的内容相关信息。另外,所有连接到Ki的关键帧都会从结果中删除。为了获得候选回环,我们必须检测3个一致的候选回环(内容相关图像中的关键帧)。如果对Ki来说环境样子都差不多,就可能有几个候选回环。

    B.        计算相似变换

    单目SLAM系统有7个自由度,3个平移,3个旋转,1个尺度因子,如论文6。因此,闭合回环,我们需要计算从当前关键帧Ki到回环关键帧Kl的相似变换,以获得回环的累积误差。计算相似变换也可以作为回环的几何验证。

    我们先计算ORB特征关联的当前关键帧的地图云点和回环候选关键帧的对应关系,具体步骤如第3章E节所示。此时,对每个候选回环,我们有了一个3D到3D的对应关系。我们对每个候选回环执行RANSAC迭代,通过Horn方法(如论文42)找到相似变换。如果我们用足够的有效数据找到相似变换Sil,我们就可以优化它,并搜索更多的对应关系。如果Sil有足够的有效数据,我们再优化它,直到Kl回环被接受。

    C.       回环融合

    回环矫正的第一步是融合重复的地图云点,插入与回环闭合相关的相似视图的新边缘。先通过相似变换Sil矫正当前关键帧位姿Tiw,这种矫正方法应用于所有Ki相邻的关键帧,执行相似变换,这样回环两端就可以对齐。回环关键帧所有的地图云点和它的近邻映射到Ki,通过映射在较小的区域内搜索它的近邻和匹配,如第5章D节所述。所有匹配的地图云点和计算Sil过程中的有效数据进行融合。融合过程中所有的关键帧将会更新它们的边缘,这些视图内容相关的图像创建的边缘用于回环控制。

    D.      本征图像优化

    为了有效地闭合回环,我们通过本征矩阵优化位姿图,如第三章D节所示,这样可以将回环闭合的误差分散到图像中去。优化程序通过相似变换校正尺度偏移,如论文6。误差和成本计算如附录所示。优化过后,每一个地图云点都根据关键帧的校正进行变换。

    八实验

    我们对实验进行了系统的评估,用Newcollege大场景机器图像序列,评估整个系统性能;用TUM RGB-D的16个手持式室内图像序列,评估定位精度,重定位和程序运行能力;用KITTI的10个汽车户外图像数据集,评估实时大场景操作,定位精度和位姿图优化效率。

    我们的电脑配置为Intel Core i7-4700MQ (4核@2.40GHz)和8GB RAM,用于实时处理图像。ORB-SLAM有3个主线程,它和其他ROS线程并行处理。

    A.     Newcollege

    Newcollege是一个2.2公里的校园和相邻的公园的机器人图像序列。它是双目相机,帧率20fps,分辨率512x38。它包含几个回环和快速的旋转,这对单目视觉非常具有挑战性。据我们所知,没有单目系统可以处理整个图像序列。例如论文7,可以形成回环,也可以应用于大场景环境,但对单目结果只能显示序列的一小部分。

    图4显示的回环闭合线程通过有效数据支持相似变换。图5对比了回环闭合前后的重构状况。红色是局部地图,回环闭合延伸回环的两端后的状况。图6是实时帧率状态下处理图像序列的整个地图。后边的大回环并没有完全闭合,它从另外一个方向穿过,位置识别程序没能发现闭合回环。

    我们统计了每个线程所用时间。表1显示了追踪和局部地图构建所用的时间。跟踪的帧率大概在25-30Hz,在做局部地图跟踪时的要求最高。如有必要,这个时间可以减少,需要限制局部地图关键帧的数量。局部地图构建线程中要求最高的是局部捆集调整。局部捆集调整的时间根据机器人的状态变动,向未知环境运动或在一个已经建好地图的区域运动是不同的,因为在未知环境中如果跟踪线程插入一个新的关键帧,捆集调整会被中断,如第5章E节所示。如果不需要插入新的关键帧,局部捆集调整会执行大量已经设置的迭代程序。

    表2显示了6个闭合回路的结果。可以看到回环检测是如何亚线性地增加关键帧的数量。主要是由于检索数据库的效率高,它值比较了具有相同图像单词的图像子集,由此可见用于位置识别的词袋模型的作用。我们的本征图像包含的边缘是关键帧数量的5倍,它是一个稀疏图。

    B.     TUM RGB-D定位精度对比

    论文38里,评测的TUM RGB-D数据集,用于评估相机定位精度,它通过外部运动捕捉系统提供了具有精确基准的几个图像序列。我们去掉那些不适合纯单目SLAM系统的图像序列,这些序列包含强烈的旋转,没有纹理或没有运动。

    为了方便比较,我们还运行了直接的半稠密LSD-SLAM(论文10)和PTAM(论文4)作为对比。我们还比较了RGBD-SLAM(论文43)轨迹作为对比。为了在相同的基准下比较ORB-SLAM,LSD-SLAM和PTAM,我们用相似变换对齐关键帧轨迹,在尺度未知的情况下,检测轨迹的绝对误差(论文38)。对RGBD-SLAM我们通过相机坐标变换对齐轨迹,同样的方法检测尺度是否覆盖良好。LSD-SLAM从随机深度值进行初始化,执行聚类,因此与基准对比的时候,我们会丢掉前10个关键帧。对于PTAM,我们从一个好的初始化中,手动选择两个关键帧。表3 是对16个图像序列运行5次的中等结果。

    ORB-SLAM可以运行所有的图像序列,除了fr3 nostructure texture far (fr3 nstr tex far)以外。这是一个平面的场景,相机的轨迹可能有两种解释,比如论文20中的描述。我们的初始化方法检测到模糊的视图,为了安全而不进行初始化。PTAM初始化有时会选择对的方案,有些可能会选择错的方案,但导致的错误可能不能接受。我们没有注意到LSD-SLAM的2种不同的重构方案,但在这个图像序列出现的错误非常多。其他的图像序列,PTAM和LSD-SLAM的鲁棒性比我们的方法差,容易跟踪丢失。

    关于精度问题,ORB-SLAM和PTAM非常相似,ORB-SLAM在图像序列fr3 nostructure texture near withloop (fr3 nstr tex near)中检测大的闭环时,可以获得更高精度。非常意外的一个结果是PTAM和ORB-SLAM都非常明显地表现出精度高于LSD-SLAM和RGBD-SLAM。一个可能的原因是它们没有用传感器的测量优化位姿图从而减少了对地图的优化,但我们采用捆集调整,同时通过传感器测量优化相机和地图,通过运动结构的经典算法来解决传感器测量,如论文2所示。我们在第9章B节进一步讨论了这个结果。另一个有趣的结果是在图像序列fr2 desk with person  fr3 walking xyz中,LSD-SLAM对动态物体的鲁棒性相比ORB-SLAM差一些。

    我们注意到RGBD-SLAM在图像序列fr2上尺度上有偏差,可以用7个自由度对齐轨迹明显减少误差。最后我们注意到论文10提到在f2_xyz上PTAM的精度比LSD-SLAM低,RMSE是24.28cm。然而,论文没有给出足够的细节说明如何获得这些结果的,我们没有办法复现它。

     

    C.     TUM RGB-D重定位性能比较

    我们在TUM RGB-D数据集上进行了重定位性能的对比实验。在第一个实验中,我们通过fr2_xyz的前30秒构建了一个地图,执行了全局重定位,评估了位姿精度。对PTAM进行了相同的实验。图7是创建初始地图的关键帧,重定位的图像帧位姿和这些帧的基准。可以看出PTAM由于重定位方法较少的不变性而只重定位关键帧附件的图像帧。表4显示了相对基准的调用和误差。ORB-SLAM比PTAM可以更精准地多定位2倍的图像帧。在第2个实验中,我们采用fr3_sitting_xyz初始化地图,从fr3_walking_xyz重定位所有的图像帧。这是一个颇具挑战性的实验,由于图像中有人移动造成了阻塞。这里,PTAM并没有重定位,而ORB-SLAM重定位78%的图像帧,如表4所示。图8显示了ORB-SLAM重定位的一些挑战。

    D.     TUM RGB-D系统运行实验对比

    之前的重定位实验表明我们的系统可以从不同的视角定位地图,在中等动态环境中的鲁棒性也较好。这个特性和关键帧筛选程序可以在不同的视角和局部动态环境中一直运行到程序结束。

    在全静态场景情况下,即使相机从不同视角观测场景,ORB-SLAM也可以使关键帧数量保持在一个有限的水平内。我们演示了一个图像序列,相机93秒以内都在拍摄同一张桌子,但视角一直变换,形成一个轨迹。我们对比了我们地图的关键帧数量和PTAM生成的关键帧,如图9所示。可以看到PTAM一直插入关键帧,ORB-SLAM会删除冗余的关键帧。

    当然,在整个程序运行过程中,静态环境下的正常操作是任何SLAM系统的一个基本要求,更引人注意的是动态环境下的状况。我们在几个fr3的图像序列中分析了ORB-SLAM系统的状况,图像序列有:sitting xyz, sitting halfsphere, sitting rpy, walking xyz, walking halfspehere walking rpy。所有的视频中,相机都对着桌子,但运动轨迹不同,有人在移动,椅子也被移动了。图10(a)是地图中所有关键帧的总数量,图10(b)显示从图像帧中创建或删除关键帧,从关键帧到地图构建需要多久时间。可以看到前2个图像序列中新看到(增加)场景时地图的大小一直在增加。图10(b)是前2个视频中创建的关键帧。在视频sitting_rpy和walking_xyz中,地图没有增加,地图是通过已有场景创建。相反,在最后两个视频中,有更多的关键帧插入但没有在场景中表示出来,可能由于场景的动态变化。图10(C)关键帧的柱状图,它们是从视频中挑选出来的。大部分的关键帧被筛选程序删除了,只有一小部分留下来了。ORB-SLAM有大量关键帧的生成策略,在未知环境下非常有用;后面系统会生成一个小的子集来代表这些关键帧。

    在整个实验中,我们系统的地图根据场景上内容来增加,而不是根据时间,它可以存储场景的动态变化,对场景的理解非常有用。

    E.     KITTI大场景大回环行性能对比

    里程计通过KITTI数据集的11个视频对比,它是在住宅区驾驶汽车,基准精度非常高,有一个GPS和一个Velodyne Laser Scanner。对单目系统非常有调整性,它里面有快速旋转,区域内有大量树叶,这使数据关联变得更困难,车速比较快,视频的帧率只有10fps。除了视频01外,ORB-SLAM可以处理其他所有的视频,01是高速路上的视频,可追踪的物体非常少。视频00,02,05,06,07,09,有闭环回路,系统可以检测到,并使它闭合。视频09的闭环只能在视频的最后几个图像帧里检测到,并不是每次都能成功检测到。

    对于轨迹和基准的定性比较如图11和12所示。在TUMRGB-D对比中,我们可以通过相似变换对齐轨迹的关键帧和基准。图11是定性比较的结果,图12是论文25中的最新单目SLAM在视频00,05,06,07和08上执行的结果。除了08有一些偏移以外,ORB-SLAM在这些视频上的轨迹都很精准。

    表5显示了每个视频的关键帧轨迹的中等RMSE误差。我们基于地图尺寸提供了轨迹的误差。结果表明我们的轨迹误差吃地图尺寸的1%左右。大致范围低的是视频03的0.3%高的是视频08的5%。视频08中没有闭环,漂移也没办法纠正,因为闭环控制需要获得更精确的重构。

    我们还确认了全局捆集调整的20层迭代如何增强地图重构,在每个视频的最后,细节如附录所示。我们还注意到全局捆集调整可以稍微增加闭环轨迹的精度,但这对开环轨迹有负面影响,这意味着我们的系统已经非常精确了。在有些应用中,如果需要非常精确的结果我们的算法会提供一组匹配,需要定义一个比较强的相机网络,一个初始估计,这样全局捆集调整迭代次数就会变少。

    最后讲一下闭环控制和用于本征图像的边缘的θmin的效率。视频09是个闭环,时间长。我们评估的不同的闭环策略。表6是关键帧轨迹RMSE和不同情况下没有闭环控制优化所用的时间,如果直接采用全局捆集调整(20层或100层迭代),如果只用位姿图优化(10层迭代不同数量的边缘),如果先用位姿图优化再执行全局捆集调整。结果表明,在闭环控制之前,方案就比较糟糕,以至于捆集调整会有融合问题。100层迭代后误差就非常大。本征图像优化融合速度更快,结果也更精确。θmin对精度影响并不大,减少边缘的数量会明显降低精度。位姿图优化后再执行一个捆集调整可以增加精度,但时间也增加了。

    九结论和讨论

    A.     结论

    通过实验,我们的系统可以应用于室内和室外场景,用在汽车、机器人和手持设备上。室内小场景的精度在1厘米,室外大场景的应用是几个厘米。

    PTAM被认为是目前最精准的单目SLAM。根据离线运动结构问题,PTAM后端捆集调整不能同时加载。PTAM的主要贡献是给机器人SLAM的研究带来了新的技术,具有良好的实时性。我们的主要贡献是扩张了PTAM对于应用环境的多样性和对系统的交互性。因此,我们挑选了新的方法和算法,整合了前人优秀的地方,如论文5的闭环检测,论文6,7的闭环控制程序和内容关联视图,论文37的g2o优化框架,论文9的ORB特征。目前所知,我们的精度最高,是最可靠最完整的单目SLAM系统。我们的生成和挑选关键帧策略可以创建较少的关键帧。弹性的地图探测在条件较差的轨迹上非常有用,比如旋转和快速移动。在相同场景的情况下,地图在只有新内容的情况下才会增长,保存了不同的视图外观。

    最后,ORB特征可识别剧烈的视角变换的位置。也可以快速提取特征和匹配特征,使得实时追踪和地图构建更精确。

    B.     基于离散/特征方法与稠密/直接方法对比

    论文44的DTAM和论文10的LSD-SLAM可以进行环境的稠密或半稠密重构,相机位姿可以通过图像像素的亮度直接优化。直接方法不需要特征提取,可以避免人工匹配。他们对图像模糊,低纹理环境和论文45的高频纹理的鲁棒性更好。稠密的重构,对比稀疏的地图云点,比如ORB-SLAM或PTAM,对相机定位更有效。

    然而,直接方法有他们自己的局限。首先,这些方法采用一个表面反馈模型。光电描记法的一致性要求限制了匹配的基准,这要比其他特征窄得多。这对重构的精度影响很大,需要更宽的观测减少深度的不确定。直接方法,如果准确的建模,可能会受到快门,自动增益和自动曝光的影响(如TUM RGB-D 的对比测试)。最后,由于直接方法计算要求较高,像DTAM中地图增量式地扩张,或像LSD-SLAM丢掉传感器测量,根据位姿图优化地图。

    相反,基于特征的方法可以在更宽的基准上匹配特征,主要得益于其较好地视图不变特性。捆集调整和相机位姿优化,地图云点通过传感器测量进行融合。在运动结构估计中,论文46已经指出了基于特征的方法相比直接方法的优势。在我们的实验中,直接提供了证据,第8章B节,表明精度更高。未来单目SLAM应该会整合两种最好的方法。

    C.     后续工作

    系统精度可以进一步增强。这些云点,如果没有足够的视差是不放入地图中的,但对相机的旋转非常有用。

    另外一种方法是将稀疏地图更新到稠密地图,重构更有作用。由于我们关键帧的选择机制,关键帧有高精度位姿和更多的内容相关视图信息。所以,ORB-SLAM稀疏地图是一个非常优秀的初始估计框架,比稠密地图更好。论文47有详细描述。

    附录: 非线性优化

    捆集调整

    地图云点3D位置 Xw,j∈R3,关键帧位姿Tiw∈SE(3)

    W表示世界坐标,通过匹配的关键点Xi,j∈R2减少重投影误差。

    地图云点j在关键帧i中的误差是:

    其中πi是影射函数:

    其中,Riw∈SO(3),tiw∈R3,分别表示Tiw的旋转和平移部分

    (fi,u , fi,v),(ci,u , ci,v)分别是相机i的焦点距离和主点。

    代价函数:

    ρh是Huber鲁棒代价函数,Ωi,ji,j2I2x2是协方差矩阵,与检测关键点的尺度有关。在全局捆集调整中(在初始化地图中),我们优化了所有云点和关键帧。

    鼓励译者

    你的鼓励是我写作的动力,欢迎光临,谢谢鼓励。:)

    参考文献

    [1] B. Triggs, P. F. McLauchlan, R. I. Hartley, and A. W. Fitzgibbon,“Bundle adjustment a modern synthesis,” in Vision algorithms: theoryand practice, 2000, pp. 298–372.

    [2] R. Hartley and A. Zisserman, Multiple View Geometry in ComputerVision, 2nd ed. Cambridge University Press, 2004.

    [3] E. Mouragnon, M. Lhuillier, M. Dhome, F. Dekeyser, and P. Sayd, “Realtime localization and 3d reconstruction,” in Computer Vision and PatternRecognition, 2006 IEEE Computer Society Conference on, vol. 1, 2006,pp. 363–370.

    [4] G. Klein and D. Murray, “Parallel tracking and mapping for small ARworkspaces,” in IEEE and ACM International Symposium on Mixed andAugmented Reality (ISMAR), Nara, Japan, November 2007, pp. 225–234.

    [5] D. G´alvez-L´opez and J. D. Tard´os, “Bags of binary words for fastplace recognition in image sequences,” IEEE Transactions on Robotics,vol. 28, no. 5, pp. 1188–1197, 2012.

    [6] H. Strasdat, J. M. M. Montiel, and A. J. Davison, “Scale drift-awarelarge scale monocular SLAM.” in Robotics: Science and Systems (RSS),Zaragoza, Spain, June 2010.

    [7] H. Strasdat, A. J. Davison, J. M. M. Montiel, and K. Konolige,“Double window optimisation for constant time visual SLAM,” in IEEEInternational Conference on Computer Vision (ICCV), Barcelona, Spain,November 2011, pp. 2352–2359.

    [8] C. Mei, G. Sibley, and P. Newman, “Closing loops without places,” inIEEE/RSJ International Conference on Intelligent Robots and Systems(IROS), Taipei, Taiwan, October 2010, pp. 3738–3744.

    [9] E. Rublee, V. Rabaud, K. Konolige, and G. Bradski, “ORB: an efficientalternative to SIFT or SURF,” in IEEE International Conference onComputer Vision (ICCV), Barcelona, Spain, November 2011, pp. 2564–2571.

    [10] J. Engel, T. Sch¨ops, and D. Cremers, “LSD-SLAM: Large-scale directmonocular SLAM,” in European Conference on Computer Vision(ECCV), Zurich, Switzerland, September 2014, pp. 834–849.

    [11] R. Mur-Artal and J. D. Tard´os, “Fast relocalisation and loop closing inkeyframe-based SLAM,” in IEEE International Conference on Roboticsand Automation (ICRA), Hong Kong, China, June 2014, pp. 846–853.

    [12] ——, “ORB-SLAM: Tracking and mapping recognizable features,” inMVIGRO Workshop at Robotics Science and Systems (RSS), Berkeley,USA, July 2014.

    [13] B. Williams, M. Cummins, J. Neira, P. Newman, I. Reid, and J. D.Tard´os, “A comparison of loop closing techniques in monocular SLAM,”Robotics and Autonomous Systems, vol. 57, no. 12, pp. 1188–1197, 2009.

    [14] D. Nister and H. Stewenius, “Scalable recognition with a vocabularytree,” in IEEE Computer Society Conference on Computer Vision andPattern Recognition (CVPR), vol. 2, New York City, USA, June 2006,pp. 2161–2168.

    [15] M. Cummins and P. Newman, “Appearance-only SLAM at large scalewith FAB-MAP 2.0,” The International Journal of Robotics Research,vol. 30, no. 9, pp. 1100–1123, 2011.

    [16] M. Calonder, V. Lepetit, C. Strecha, and P. Fua, “BRIEF: BinaryRobust Independent Elementary Features,” in European Conference onComputer Vision (ECCV), Hersonissos, Greece, September 2010, pp.778–792.

    [17] E. Rosten and T. Drummond, “Machine learning for high-speed cornerdetection,” in European Conference on Computer Vision (ECCV), Graz,Austria, May 2006, pp. 430–443.

    [18] H. Bay, T. Tuytelaars, and L. Van Gool, “SURF: Speeded Up RobustFeatures,” in European Conference on Computer Vision (ECCV), Graz,Austria, May 2006, pp. 404–417.

    [19] D. G. Lowe, “Distinctive image features from scale-invariant keypoints,”International Journal of Computer Vision, vol. 60, no. 2, pp. 91–110,2004.

    [20] A. J. Davison, I. D. Reid, N. D. Molton, and O. Stasse, “MonoSLAM:Real-time single camera SLAM,” IEEE Transactions on Pattern Analysisand Machine Intelligence, vol. 29, no. 6, pp. 1052–1067, 2007.

    [21] J. Civera, A. J. Davison, and J. M. M. Montiel, “Inverse depthparametrization for monocular SLAM,” IEEE Transactions on Robotics,vol. 24, no. 5, pp. 932–945, 2008.

    [22] C. Forster, M. Pizzoli, and D. Scaramuzza, “SVO: Fast semi-directmonocular visual odometry,” in Proc. IEEE Intl. Conf. on Robotics andAutomation, Hong Kong, China, June 2014, pp. 15–22.

    [23] O. D. Faugeras and F. Lustman, “Motion and structure from motionin a piecewise planar environment,” International Journal of PatternRecognition and Artificial Intelligence, vol. 2, no. 03, pp. 485–508, 1988.

    [24] W. Tan, H. Liu, Z. Dong, G. Zhang, and H. Bao, “Robust monocularSLAM in dynamic environments,” in IEEE International Symposium onMixed and Augmented Reality (ISMAR), Adelaide, Australia, October2013, pp. 209–218.

    [25] H. Lim, J. Lim, and H. J. Kim, “Real-time 6-DOF monocular visualSLAM in a large-scale environment,” in IEEE International Conferenceon Robotics and Automation (ICRA), Hong Kong, China, June 2014, pp.1532–1539.

    [26] D. Nist´er, “An efficient solution to the five-point relative pose problem,”IEEE Transactions on Pattern Analysis and Machine Intelligence,vol. 26, no. 6, pp. 756–770, 2004.

    [27] H. Longuet-Higgins, “The reconstruction of a plane surface from twoperspective projections,” Proceedings of the Royal Society of London.Series B. Biological Sciences, vol. 227, no. 1249, pp. 399–410, 1986.

    [28] P. H. Torr, A. W. Fitzgibbon, and A. Zisserman, “The problem ofdegeneracy in structure and motion recovery from uncalibrated imagesequences,” International Journal of Computer Vision, vol. 32, no. 1,pp. 27–44, 1999.

    [29] A. Chiuso, P. Favaro, H. Jin, and S. Soatto, “Structure from motioncausally integrated over time,” IEEE Transactions on Pattern Analysisand Machine Intelligence, vol. 24, no. 4, pp. 523–535, 2002.

    [30] E. Eade and T. Drummond, “Scalable monocular SLAM,” in IEEE ComputerSociety Conference on Computer Vision and Pattern Recognition(CVPR), vol. 1, New York City, USA, June 2006, pp. 469–476.

    [31] H. Strasdat, J. M. M. Montiel, and A. J. Davison, “Visual SLAM: Whyfilter?” Image and Vision Computing, vol. 30, no. 2, pp. 65–77, 2012.

    [32] G. Klein and D. Murray, “Improving the agility of keyframe-basedslam,” in European Conference on Computer Vision (ECCV), Marseille,France, October 2008, pp. 802–815.

    [33] K. Pirker, M. Ruther, and H. Bischof, “CD SLAM-continuous localizationand mapping in a dynamic world,” in IEEE/RSJ InternationalConference on Intelligent Robots and Systems (IROS), San Francisco,USA, September 2011, pp. 3990–3997.

    [34] S. Song, M. Chandraker, and C. C. Guest, “Parallel, real-time monocularvisual odometry,” in IEEE International Conference on Robotics andAutomation (ICRA), 2013, pp. 4698–4705.

    [35] P. F. Alcantarilla, J. Nuevo, and A. Bartoli, “Fast explicit diffusion foraccelerated features in nonlinear scale spaces,” in British Machine VisionConference (BMVC), Bristol, UK, 2013.

    [36] X. Yang and K.-T. Cheng, “LDB: An ultra-fast feature for scalableaugmented reality on mobile devices,” in IEEE International Symposiumon Mixed and Augmented Reality (ISMAR), 2012, pp. 49–57.

    [37] R. Kuemmerle, G. Grisetti, H. Strasdat, K. Konolige, and W. Burgard,“g2o: A general framework for graph optimization,” in IEEE InternationalConference on Robotics and Automation (ICRA), Shanghai, China,May 2011, pp. 3607–3613.

    [38] J. Sturm, N. Engelhard, F. Endres, W. Burgard, and D. Cremers, “Abenchmark for the evaluation of RGB-D SLAM systems,” in IEEE/RSJInternational Conference on Intelligent Robots and Systems (IROS),Vilamoura, Portugal, October 2012, pp. 573–580.

    [39] M. Smith, I. Baldwin, W. Churchill, R. Paul, and P. Newman, “The newcollege vision and laser data set,” The International Journal of RoboticsResearch, vol. 28, no. 5, pp. 595–599, 2009.[40] A. Geiger, P. Lenz, C. Stiller, and R. Urtasun, “Vision meets robotics:The KITTI dataset,” The International Journal of Robotics Research,vol. 32, no. 11, pp. 1231–1237, 2013.

    [41] V. Lepetit, F. Moreno-Noguer, and P. Fua, “EPnP: An accurate O(n)solution to the PnP problem,” International Journal of Computer Vision,vol. 81, no. 2, pp. 155–166, 2009.

    [42] B. K. P. Horn, “Closed-form solution of absolute orientation using unitquaternions,” Journal of the Optical Society of America A, vol. 4, no. 4,pp. 629–642, 1987.

    [43] F. Endres, J. Hess, J. Sturm, D. Cremers, and W. Burgard, “3-d mappingwith an rgb-d camera,” IEEE Transactions on Robotics, vol. 30, no. 1,pp. 177–187, 2014.

    [44] R. A. Newcombe, S. J. Lovegrove, and A. J. Davison, “DTAM: Densetracking and mapping in real-time,” in IEEE International Conference onComputer Vision (ICCV), Barcelona, Spain, November 2011, pp. 2320–2327.

    [45] S. Lovegrove, A. J. Davison, and J. Ibanez-Guzm´an, “Accurate visualodometry from a rear parking camera,” in IEEE Intelligent VehiclesSymposium (IV), 2011, pp. 788–793.

    [46] P. H. Torr and A. Zisserman, “Feature based methods for structureand motion estimation,” in Vision Algorithms: Theory and Practice.Springer, 2000, pp. 278–294.

    [47] R. Mur-Artal and J. D. Tardos, “Probabilistic semi-dense mapping fromhighly accurate feature-based monocular SLAM,” in Robotics: Scienceand Systems (RSS), Rome, Italy, July 2015.

    [48] H. Strasdat, “Local Accuracy and Global Consistency for EfficientVisual SLAM,” Ph.D. dissertation, Imperial College, London, October2012.

    展开全文
  • 单目SLAM尺度问题

    2021-04-14 10:16:16
    以ORB_SLAM2的单目初始化为例。 流程:(只介绍初始化时的跟踪) 在system.ccTracking::Tracking()创建一个tracking线程,传入词典向量、传感器类型、相机设置文件,以及绑定地图、关键帧数据库、地图绘制、帧绘制。...

    双目通过基线(单位mm)和特征点在两个像素平面上坐标的视差来确定空间点坐标(x,y,z),单目就不行了。

    以ORB_SLAM2的单目初始化为例。

    流程:(只介绍初始化时的跟踪)

    在system.ccTracking::Tracking()创建一个tracking线程,传入词典向量、传感器类型、相机设置文件,以及绑定地图、关键帧数据库、地图绘制、帧绘制。

    然后Tracking::GrabImageMonocular()将图片转为灰度图,根据系统状态mState是未被初始化还是别的,创建当前帧(初始帧的特征点提取数量比一般帧的数量多一倍)。

    然后调用Tracking::Track():未初始化,则调用Tracking::MonocularInitialization(),初始化成功后mState=OK.

    Tracking::MonocularInitialization():单目初始化需要连续的两帧,这两帧提取的特征点都要>100,且匹配的点数要>100,否则就接着读取下一帧。然后调用Initialize::Initialize(),判断能否初始化以及计算R,t(创建两个线程并行计算H和F矩阵,根据得分判断用哪个模型,然后用该模型进行三角化,验证模型是否合适)。经过这些操作,终于到靠题的一个函数了:Tracking::CreateInitialMapMonocular()。

    Tracking::CreateInitialMapMonocular()创建初始关键帧pKFini和当前关键帧pKFcur,创建地图点并进行局部BA。然后就可以认为初始化结果是正确的,这个时候,尺度怎样确定呢?根据高博的SLAM14讲第152页的内容,单目尺度不确定性可以通过对初始两帧的平移向量t归一化作为后续的单位;也可以通过令初始化时所有特征点的平均深度为1固定一个尺度,这种方式可以控制场景规模大小,使计算在数值上更稳定。那么ORB-SLAM2单目初始化使用的是第二种固定尺度的方法(与书上略有不同):

        // step1:获取初始关键帧的地图点的深度中值Z
        float medianDepth = pKFini->ComputeSceneMedianDepth(2);
        float invMedianDepth = 1.0f/medianDepth;
    
        if(medianDepth<0 || pKFcur->TrackedMapPoints(1)<100)
        {
            cout << "Wrong initialization, reseting..." << endl;
            Reset();
            return;
        }
    
        //step2:相机位姿归一化x'/z,y'/z,z'/z
        cv::Mat Tc2w = pKFcur->GetPose();
        Tc2w.col(3).rowRange(0,3) = Tc2w.col(3).rowRange(0,3)*invMedianDepth;
        pKFcur->SetPose(Tc2w);
    
        //step3:地图点归一化
        vector<MapPoint*> vpAllMapPoints = pKFini->GetMapPointMatches();
        for(size_t iMP=0; iMP<vpAllMapPoints.size(); iMP++)
        {
            if(vpAllMapPoints[iMP])
            {
                MapPoint* pMP = vpAllMapPoints[iMP];
                pMP->SetWorldPos(pMP->GetWorldPos()*invMedianDepth);
            }
        }

    综上,尺度固定是对于平移向量来说的,即一个形象表达式为c*t(c是尺度变换因子,即代码段中的invMedianDepth),和旋转矩阵R没有关系(常识也是这样,沿着方向,走的距离不同(1m还是1cm),造成的轨迹尺度也不一样,但是形状是一样的)。用ORB_SLAM2单目跑标准数据集,与gt比较,需要先进行尺度对齐,在SLAM评估软件evo中,通过指令--align --correct-scale实现,对应的代码段的原理论文《Least-SSquares Estimation of Transmation Parameters Between Two Point Patterns》中:

    X,Y是两组对应的点(两组尺度、方向、不一致的轨迹),c、R、t分别对应尺度、旋转、平移变换参数。

    以一个简单的2维,3点对齐问题为例,用该论文提出的最小化上述方差方法得到的变换参数,进行变换,效果如下:-[

    ——>

    展开全文
  • ORB-SLAM是一个基于特征点的实时单目SLAM系统,在大规模的、小规模的、室内室外的环境都可以运行。 该系统对剧烈运动也很鲁棒,支持宽基线的闭环检测重定位,包括全自动初始化。 该系统包含了所有SLAM系统共有的...
  • 双目相机标定orbslam2双目参数详解

    千次阅读 多人点赞 2019-07-12 16:39:11
    为什么要写这篇博客? 因为网上的博客都是错误的,是不适合当下的ORB_SLAM2双目标定的,特别是针对广角相机标定的暂无发现可用教程,对orbslam2参数讲解的文档,全部...1,orb_slam2 双目摄像机的标定程序 2,orb_s...
  • ORB-SLAM于2015年提出,其具有基于特征点的视觉里程计、基于非线性优化的后端、基于词袋的回环检测功能,采用的三线程的SLAM框架非常经典,同时支持单目双目、RGBD,具有良好的泛用性。因此成为SLAM初学者必学的...
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达标题:DeepFusion: Real-Time Dense 3D Reconstruction for Monocular SLAM...
  • 与基于双目或者RGB-D的技术相比,单目SLAM算法[1]-[4]依赖更廉价的硬件,更容易标定并且在深度范围上没有限制,使得它们对于同时专注室内室外场景的移动应用中特别地受欢迎。 单目SLAM方法可以被划分为两类。基于...
  • 松耦合半直接单目SLAM

    2020-11-30 07:00:00
    点击上方“3D视觉工坊”,选择“星标”干货第一时间送达代码地址:在公众号「3D视觉工坊」,后台回复「半直接单目」,即可直接下载。【摘要】论文提出了一个创新的用于SLAM的半直接算法,结合...
  • ORB-SLAM2中mono_euroc.cc是保存关键帧,但不可以保存单目所有帧数的位姿;...但在map_slam中的system.cc中的SaveTrajectoryTUM函数可以保存双目单目轨迹(平移向量+旋转向量),全部帧的位姿。 ...
  • 无论单目双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧。 (1) 单目 mCurrentFrame = Frame(mImGray, timestamp, ...
  • ORB-SLAM2的最大贡献就是把原来的系统扩展到了...单目SLAM的优缺点: 优点:成本更低,传感器配置更简单 缺点:由于无法直接获得深度信息,所以就需要利用多视图或者滤波来生成初始地图(在最开始无法进行三角化);
  • 单目SLAM中的尺度漂移是什么 在使用单目相机估计相机姿态3D坐标时,需要对极几何、三角化估计,这个过程中会产生累积误差,进而导致尺度的不一致,产生尺度漂移。 单目SLAM产生尺度漂移的根本原因是单目相机无法...
  • 用自己的双目相机在ROS 下实现双目ORB_SLAM2参考博客ROS下单目SLAMhttps://blog.csdn.net/goding_learning/article/details/52950993 配置ROS下的ORB_SLAM2第一步、先准备好基本依赖 1.1安装pangolin1....
  • ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统 原文链接:https://blog.csdn.net/weixin_42905141/article/details/102857958 原文作者翻译的非常好,我在原文作者文章的基础上加入了自己的一些阅读...
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达1摘要本文提出了一种将单目视觉SLAM与基于深度学习的语义分割相结合的新方法.为了稳定运行,vSLAM需要静态对象上的特征点.在传统...
  • ORBSLAM3 用ROS接口运行双目IMU和单目IMU模式

    千次阅读 热门讨论 2020-07-28 12:25:02
    我花了两天时间写了两个ROS接口双目IMU和单目IMU,通过修改DBow2的源码将词典的加载方式改为二进制,加载词典的时候就速不用等待了。实现方法也不难,把时间戳在当前帧之前的IMU帧(包括时间戳相同的)以这样ORB_SLAM3...
  • 摘要----我们提出的ORB-SLAM2是一个完整的SLAM系统,它支持单目双目和RGB-D相机。它包括地图重用、闭环重定位功能。这个系统可以实时运行在标准版的CPU上,适应于各种场景,从小的便携设备拍摄的室内环境到工业...
  • 主要参考这位大佬的,但是那个ros的topic我这里他不一样。 https://blog.csdn.net/hhhhpanda/article/details/85037463 1.先说说自己遇到的问题吧,因为我开始根据网上的博主使用opencv2.4.13,编译都没问题, ...
  • 适用于单目双目、rgb-d摄像机视觉slam代码orb-slam2
  • 非滤波单目slam基础 非滤波方法的单目视觉SLAM系统综述 论文 直接法 特征点法 混合法区别与联系 按照 2D−2D 数据关联方式的不同 ,视觉定位方法可以分为直接法、非直接法混合法 1. 直接法假设帧间光度值...
  • 视觉SLAM ORB-SLAM2 双目相机实时实验 双目相机矫正 配置文件 博文末尾支持二维码赞赏哦_ 一 ORB-SLAM2 安装 ORBSLAM2在Ubuntu14.04上详细配置流程 参考安装 1 安装必要工具 首先,有两个工具是需要提前安装...
  • /imsee/imu#imu信息 这样我们就可以直接改变ORBSLAM2ROS的话题来读取相机内容 ORBSLAM2ROS读取相机内容 cd ~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src ros_mono.cc #单目ros源文件 ros_rgbd.cc #深度...
  • ORB_SLAM2在gazebo中跑RGBD 参考博客https://blog.csdn.net/li528405176/article/details/81164637搭建的ROS-Academy-for-Beginners的gazebo仿真环境,但opencv使用的自带版本2.4.9.1,编译运行orb都没问题,就没按...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,426
精华内容 1,370
关键字:

单目slam和双目slam