视觉SLAM十四讲之视觉SLAM基础

初识SLAM:
    相机:将三维变为二维,但丢失了距离
    分类:
        单目:只有一个图像的时候无法知道深度,需移动相机产生深度-->近处的物体移动快、远处物体移动慢
        双目:通过左右相机观测的视差估计距离(深度)--->计算量大
        RGB(深度相机):物理方法计算深度-->量程小、易受干扰
        
        
整体SLAM(同时定位与地图构建)流程图:
    传感器数据->前端(视觉里程计)->后端(非线性优化)->建图,及回环检测


    里程计:这步到下步运动,通过两两图像估计局部运动,再将估计的局部运动叠加从而得到整个运动
            不足:但局部环境下的估计使得误差也会累加,产生漂移
                    解决方法:
                        1.后端(非线性优化):全局的非线性优化,从带有噪声的数据中优化轨迹和地图,最大后验概率估计MAP
                        2.回环检测:一旦到了以前经过的位置,调整当前运动轨迹的估计
    视觉里程计方法:
        基于特征点法的视觉里程计
        基于直接法的视觉里程计
    后端优化:状态估计问题
        从带有噪声的数据中优化轨迹和地图,最大后验概率估计MAP
        前期以滤波器为主(梯度下降、高斯牛顿等),后期图优化(g2o)方法
    回环检测:
        检测机器人是否回到原先位置
        识别到达过的场景
        计算图像间相似性
        方法
            词袋模型
        
    建图:可用于导航、规划等
        图像分类:度量地图、拓扑地图、稀疏地图、稠密地图
        单目、双目建立稠密地图

    运动方程和观测方程
    位姿:由平移和旋转描述

三维空间 三个坐标系:世界坐标系、机器人坐标系、图像像素坐标系
    位姿表示:由平移和旋转描述
        1.旋转矩阵
        2.旋转向量
        3.欧拉角:万像锁
        4.四元数
    变换矩阵:包含旋转和平移

相机模型  三个坐标系:世界坐标系、相机坐标系、像素坐标系
    小孔成像模型:相似三角形  相机焦距:成像平面到相机的距离
    相机外参:变换矩阵-->旋转和平移
    相机内参:标定目的确定相机内参
    畸变
        径向畸变:透镜形状引起
        切向畸变:成像平面与光照不垂直

图像特征分析:-->追踪
    1.camshift算法
    2.meanshift算法


后端优化:状态估计问题-->从带有噪声的数据中优化轨迹和地图,最大后验概率估计MAP-->即将估计值代入观测方程,
使得结果与实际值最接近的估计值即为所求-->使得P(z/x)概率值最大的估计,即在位姿为x的条件下得到观测为z的概率
    两个方程
        运动方程(位姿与位姿的关系):相机位姿(旋转和平移)-->定位
        观测方程(位姿与路标的关系):观测点   -->建图
        已知观测到的大量数据来估计相机的运动(由于噪声存在使得估计与实际有偏离)--->利用最小二乘法,
        误差:
            运动误差=当前位姿估计值-(上个时刻位姿与输入结合应该得到的值)
            观测误差=实际观测到的数据-当前位姿代入观测方程得应得到的观测值
            目标函数=大量运动误差的迭代+大量观测误差的迭代,求目标函数最小值
            求最小化的方法(最小二乘法)
                1.最速下降法-->梯度下降法(过于贪婪,直接找)、牛顿法 (迭代次数少,但需要计算复杂的Hessian矩阵)  
                2.高斯牛顿 
            工具:ceres和g2o图优化


视觉里程计(VO):--->通过两两图像估计局部运动,再将估计的局部运动叠加从而得到整个运动
    基于特征点法的视觉里程计:
        使用特征点作为路标:
            使用角点作为特征点
            特征点的信息:
                1.关键点-->包括位置、大小、方向(关键点所在块几何中心与质心连接成的向量代表方向)等
                2.描述子-->关键点周围像素信息,最常用的是ORB在保证一定不变性的同时也能满足实时性的要求,而SIFT描述子虽然能很好满足旋转、缩放、平移不变形,但效率不高
            ORB特征点:
                1.旋转FAST关键点:周围连续多个像素点和中心关键点灰度上相差量级 -->角点
                    1.1:旋转不变形:由灰度质心法实现,与图像块的几何中心和质心连接而成的方向向量有关
                    1.2:尺度不变性:由图像金字塔保证-->金字塔每层是不同尺度的图像,在金字塔每层中检测角点
                2.BRIFT描述子:一种二进制描述,需要用汉明距离度量
            特征匹配:计算特征点的BRIFT描述子的汉明距离,该距离描述了像个特征点间的相似程度
                1.暴力匹配
                2.快速近似最近邻


            特征点提取与匹配步骤:
                1.读取图像
                2.检测关键点位置
                3.计算关键点的描述子
                4.对两幅图像的关键点依据描述子进行匹配(使用汉明距离)
                5.匹配筛选,去除匹配有误的匹配对(汉明距离大于最小汉明距离的两倍)
                6.绘制匹配结果
                
            通过若干二维图像匹配对,就可以恢复在两帧之间相机的运动
            计算相机运动:
                两张图像间位姿变换(2D-2D):对极几何  -->根据配对点的像素位置求出基础矩阵E(由R、t组成-->奇异值分解求得R、t)或本质矩阵F(由R、t、K(内参)组成)
                单应矩阵H:适用于所有特征点均在同一平面,如无人机观测图像等
                单目初始化不能只旋转,必须要有一定程度的平移,若没有平移无法初始化-->有平移才能使用三角测量得出对极几何中的P的位置
                一张图片与一张深度图间位姿变换(3D-2D):PnP-->三个点估计相机运动---->先利用n个(最小3个)点估计位姿,构建非线性优化的最小二乘(定义重投影误差,不断迭代,使得重投影误差最小的估计的位姿即为所求)
                两幅深度图片估计运动(3D-3D):ICP-->迭代最近点求解 ,同样可以使用bundle adjustment(最小化重投影误差) 
        特征点法缺点:
            1.关键点及描述子的计算耗时
            2.忽略了除特征点以外的所有信息,也就丢失了大部分可能有用的图像信息
            3.相机有时会运动到特征缺失的地方,如白墙
            
            
    基于光流法的视觉里程计:-->保留特征点,但只计算关键点,不计算描述子;光流描述了像素在图像中的运动
        三个假设:
            1.灰度不变假设  -->得到u、v的超定线形方程,可用最小二乘解,其中u:像素在x方向的速度,v:像素在y方向的速度
            2.关键点周围像素具有和关键点一样的运动
            3.微小运动(若是大的运动,关键点丢失的严重),而描述子(特征点法)能适应较大的运动
        过程
            1.在视频的第一帧仍需提取关键点,但无需计算描述子
            2.在后续的帧中对关键点进行追踪,并且时常重新提取特征点,因为运动使得追踪的旧特征点越来越少
        分类
            1.稀疏光流:计算部分像素的运动  ->LK光流,可以在SLAM中用于追踪特征点位置
            2.稠密光流:计算所有像素的运动
        LK光流:将图像灰度看成关于位置与时间的函数  I(x,y,t)-->表示在t时刻,像素在(x,y)位置的灰度值

回环检测
    目的:消除累积误差(漂移),虽然后端能够估计最大后验误差,但仅根据相邻关键帧数据无法消除累积误差
    方式:词袋模型
    关键
        1.有效检测出相机经过同一个地方
        2.由于回环检测提供了当前数据与所有历史数据的关联,在跟踪算法丢失之后,可以利用回环检测进行重定位


    预计哪处可能出现回环
        1.基于里程计的几何关系:当发现相机运动到了之前的某个位置附近时,检测它们有没有回环关系,但由于累积误差,无法正确发现“运动到了之前的某个位置附近”这件事实
        2.基于外观:仅根据两张图像的相似性确定回环检测关系
            准确率:算法提取的所有回环中,确实是真实回环的概率-->五个水果中,检测出4个是苹果,但实际上这4个中只有3个是苹果,准确率是75%
            召回率:在所有真实回环中,被正确检测出来的概率-->五个水果中,实际有4个是苹果,但只检测出3个是苹果,准确率是75%
            在SLAM中,对准确率要求更高,对召回率要求相对宽容一点
    
    词袋模型(BOW):-->目的是用“图像上有哪几种特征”来描述一个图像,哪几种特征即为“单词”
        度量两个图像相似性:
            1.确定特征,对应于BOW中单词,许多单词放在一起,组成了"字典"  -->定义字典
            2.确定一张图像中,出现了哪些特征(单词),用这些单词描述该图像(按照单词在字典中的顺序,有取1,没有就取0,正好一张图片就是一个向量)
            3.比较2中向量的相似程度(可以汉明距离也可以L1范数)
            
        字典
            由很多单词组成,一个单词与一个单独的特征点不同,它是某一类特征的组合(每个单词可看做局部相邻特征点的集合)
            字典生成方式聚类-->无监督机器学习,让机器自行寻找数据中的规律
            方法
                1.K-均值:-->有N个数据(特征点),想要归成k个类(含有k个单词的字典)
                    步骤:
                        1.随机选取k个中心点:c1,,ck
                        2.对每个样本,计算与每个中心点之间的距离,取最小的作为它的归类
                        3.重新计算每个类的中心点
                        4.如果每个中心点都变化很小,则算法收敛,退出;否则返回1
                    缺点
                        1.需要指定聚类数量
                        2.随机选取中心点使得每次聚类结果都不相同
                2.层次聚类法
                3.k-均值++
            字典表示方法
                k叉树  -->这样查找特征点效率比较快
                构建方法:从上往下构建k叉树
                    1.在根节点,用k-均值把所有样本聚成k类,得到第一层
                    2.对第一层的每个节点,把属于该节点的样本再聚类成k类,得到下一层
                    3.依次类推,最后得到叶子层,叶子层即为所谓的单词(特征点)
            相似性计算:-->给单词赋予权值
                1.TF-IDF=TF*IDF:
                    1.1 TF(Term Frequency):某单词在一个图像中经常出现,它的区分度就高
                    1.2 IDF(Inverse Document Frequency):某个单词在字典中出现额频率越低,则分类图像时区分度越高
                    1.3 TF=某单词在某文章中出现的次数/该文章中单词的总数
                        IDF=log(资料库中文章的总数/包含该单词的文章数量)
            
        
        
    
    
        
        
    


        
        
    
    
        
        
    

你可能感兴趣的:(视觉SLAM)