视觉里程计的重定位问题1——SVO的重定位部分

2023-05-16

SVO的重定位部分代码解析与分析

SVO的重定位功能体现在:运动跟踪丢失后通过与上一关键帧匹配以及地图点投影,找回当前相机位姿。由于没有后端和回环,SVO的重定位并不是回环校正后的重定位。
代码部分被放在运动跟踪线程里,只有寥寥几行,作用效果十分有限。
原文代码部分如下:

FrameHandlerMono::UpdateResult FrameHandlerMono::relocalizeFrame(  const SE3 &T_cur_ref, FramePtr ref_keyframe)
    {
        SVO_WARN_STREAM_THROTTLE(1.0, "Relocalizing frame");
        if (ref_keyframe == nullptr) {              //先判断一下last_kf是否存在,如果上个关键帧是空  就直接返回RESULT_FAILURE   <重定位失败>
            SVO_INFO_STREAM("No reference keyframe.");
            return RESULT_FAILURE;
          }
          //这里类似运动跟踪的第一步: 使用上一关键帧对当前图像进行对齐
        SparseAlign img_align(Config::kltMaxLevel(), Config::kltMinLevel(), 30, true, false);//false false  
        size_t img_align_n_tracked = img_align.run(ref_keyframe, new_frame_);
    //接下来进行判断1:如果跟踪到超过30个点
        if (img_align_n_tracked > 30) {
            SE3 T_f_w_last = last_frame_->T_f_w_; 
            last_frame_ = ref_keyframe;                      //把last_kf作为上一帧
            FrameHandlerMono::UpdateResult res = processFrame();  //进行运动跟踪处理
            //如果跟踪上了,那在下一帧开始恢复正常的图像运动跟踪
            if (res != RESULT_FAILURE) {
                stage_ = STAGE_DEFAULT_FRAME;
                SVO_INFO_STREAM("Relocalization successful.");
            } else{
            //如果跟踪失败 <重定位失败>
                new_frame_->T_f_w_ = T_f_w_last;   //把上一帧的位姿赋给当前帧
                SVO_INFO_STREAM("Relocalization failure.");
            }
            return res;
        }
    //2. 如果跟踪小于30个点   <重定位失败>
        return RESULT_FAILURE;
    }

从上面的代码看来,SVO的重定位成功的条件必要满足:1.上一关键帧存在;2当前帧与上一关键帧的图像对齐,跟踪到>30个特征点;3能够通过processFrame()的重重考验(相邻帧位姿优化、重投影位姿优化后的内点>阈值)

要满足前两点非常容易,但重定位往往在第三点上吊死。
在实际运行过程中发现,重定位在图像对齐环节还是可以跟踪到的点是足够的,但是经过重投影之后剩下的匹配点数太少,以至于重定位失败!!

再来看看启动重定位的条件有哪些:
在整个frame_handler_mono.cpp里面 我只找到了当res== result_faliure 时才会进行下一帧的重定位。因此在运动跟踪过程中,一旦某一步失败——下一帧马上开始重定位,要是重定位又失败呢?——继续下一帧重定位·· 重定位···
~ 如果载体在跟踪丢失点附近小范围慢速运动,由于观测的地图点相差并不太大,即便多次重定位失败,还是有机会跟踪回来的。
~ 但是更真实的情况是,机体运动一下子超出范围,开足马力拍屁股走人,然后重定位再也无法跟踪上,视觉跟踪宣布失败!!!
~ 并且重定位一直假定当前帧位姿为上一个有效跟踪点地位姿,当一直重定位不上时,可以通过可视化看见机体位姿不再移动也不再增加,而是一直在丢失点闪啊闪啊闪···

跟踪质量不佳的判定
在运动跟踪过程中,若不满足给定指标要求,则会判定tracking_quality_ = TRACKING_INSUFFICIENT
出现以下几种情况都将被判定为跟踪质量不佳:
1.num_observation < Config::qualityMinFts()
[num_observations实为位姿优化后保留下来的特征点数]
2.feature_drop / init_match_number >0.6
[feature_drop = init_match_number -num_observation ]
重投影后当前帧与地图的匹配点数 - 优化后剩下的特征点数 = 优化过程中特征丢失的数量
即:位姿优化后丢失的特征点数不能超过优化前的3/5,不然就认为跟踪质量不佳
3.repr_n_new_references <Config::qualityMinFts()
此处为重投影之后,若投影成功的地图点数量小于阈值,也判定为跟踪效果不佳。这里有点小疑问,此处的repr_n_new_references 应该就是第二个条件里的init_match_number,个人认为这里的阈值应该要比条件1的阈值要高才行,否则丢特征前后的特征点数量指标相同,这有点不太合理??
4. if( dropout == RESULT_FAILURE && (stage_ == STAGE_DEFAULT_FRAME || stage_ == STAGE_RELOCALIZING))
{stage_ = STAGE_RELOCALIZING;
tracking_quality_ = TRACKING_INSUFFICIENT }

在每一帧结束处理的时候,也会进行一次判断:如果处理默认帧或处理重定位帧的结果为 res 等于 RESULT_FAILURE ;那么判定跟踪质量不好,并在下一帧进行重定位。
在判定当前跟踪质量不好之后,为了避免位姿出现较大跳变,一般会令当前帧位姿为上一帧位姿
并且在下一帧的时候开启重定位!!

总结起来,SVO 的重定位部分问题比较多,丢失之后基本无法重定位回来,有很多地方值得修改

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

视觉里程计的重定位问题1——SVO的重定位部分 的相关文章

随机推荐

  • 图文教学读懂can报文

    can报文协议是汽车工程最基础的知识点 DBC协议 can有两种定义 Intel格式与Motorola格式 xff0c 主要的区别是能不能跨字节 xff0c 我们用主流的摩托摩拉格式 以一个报文ID 0x121为例 xff0c 他的解析如下
  • 四旋翼无人机数学模型推导

    本周开始进行四旋翼无人机的学习工作 xff0c 首先来进行四旋翼无人机的数学模型推导工作 四旋翼动力学数学模型 坐标变换 介绍四旋翼数学模型之前 xff0c 首先引入坐标变换的概念 xff0c 定义两个坐标系惯性坐标系 E xff0c 以及
  • NVIDIA Jetson Xavier NX 计算GPIO编号

    NVIDIA Jetson Xavier NX 计算GPIO编号 前言准备工作计算步骤计算示例注意 xff1a 附件 xff1a tegra gpio h参考链接 前言 公司产品使用了自主设计的载板 xff0c 需要使用指定的GPIO引脚
  • 深度学习人脸表情识别中,需要比较数据集中的文件名和train_list.txt中的文件名是否相一致的java代码实现

    如下图所示 xff0c 现有一个人脸表情数据集RAF DB xff0c 其train文件中的每一个图片的文件名称为 train 00001 aligned jpg 另外 xff0c 有train list txt文件标记了上图文件夹每一张数
  • git拉取后,代码被覆盖怎么办?

    1 File gt Local History gt Show History 2 右击 xff0c Revert找回本地历史版本
  • 【面试】C/C++面试宝典一

    1 const 修饰变量 xff0c 说明该变量不可以被改变 xff1b 修饰指针 xff0c 分为指向常量的指针 xff08 pointer to const xff09 和自身是常量的指针 xff08 常量指针 xff0c const
  • Docker安装Xfce桌面环境(轻量可视化操作系统)

    0 Xfce是什么 xff1f Xfce是一个适用于类UNIX操作系统的轻量级桌面环境 它的目标是快速而低廉的系统资源 xff0c 同时仍然具有视觉吸引力和用户友好性 具体参考官网 https www xfce org 项目地址 xff1a
  • Linux系统常用快捷键及VNC基本使用命令

    Linux系统常用快捷键及VNC基本使用命令 文章目录 Linux系统常用快捷键及VNC基本使用命令Linux系统的特点Linux树型目录结构Linux系统常用命令VNC常用命令 Linux系统的特点 多任务系统 在linux系统中可以同时
  • 【docker】docker学习(3)——Dockerfile的常用语法和编写实战

    大家好 xff0c 我是好学的小师弟 xff0c 今天和大家分享下Dockerfile的常用语法和编写实战 插曲 xff1a 在学习Dockerfile之前 xff0c 我们先讲解下docker save 和docker load 这两个命
  • 1.2 安装 docker 容器并配置镜像加速器

    1 2 1 实验环境准备 实验环境 xff1a CENTOS7 9 64 位 主机名 xff1a hou 主机 ip 10 0 8 120 xff08 这个 ip 大家可以根据自己所在环境去配置 xff0c 配置成静态 IP xff09 4
  • 弯管参数计算及编程实现

    船舶软件建立三维管道模型后 xff0c 需要自动生成管子加工信息 xff0c 这样就提高了设计效率 其中弯管参数主要是下料长度 xff0c 弯角和转角 下料长度是由各管段实长 xff0c 即管子中心线长度 xff0c 减去弯管部分切线长再加
  • 完整版数据库系统概论(第五版)-课后答案-免费网盘自提

    包含全部的课后答案与复习笔记 xff01 大家伙不挂科不被刷 xff0c 一起冲 xff01 虽然这个我也是找的别人的 xff0c 但是真的好用 xff01 百度网盘 https pan baidu com s 1Ux07PWvPb k3l
  • 踩坑笔记:安装Gazebo11

    安装环境 xff1a ubuntu18 04 在我上一篇博客中 xff0c 我们安装了ROS Melodic amp amp Ros2 Dashing 在我想要安装Gazebo11时候出现了错误 一 依赖错误 安装Gazebo11 xff1
  • 在keil5中调试串口遇到的问题

    1 问题 在keil5中调试stm32串口实验时 xff0c 向单片机的串口1发送数据 xff0c 观察串口1的寄存器 xff0c 此时串口1的中断服务函数会遇到无法进入下图if 的情况 xff0c 此时观察串口1寄存器 RXEN 的值 由
  • 树莓派在上电后一直重启进入不了系统桌面

    问题描述 树莓派在上电后一直重启进入不了系统桌面 xff0c 在检查了各种接口没问题后解决办法 原因分析与解决方案 xff1a 用了键盘 鼠标 显示器后5v 1A的插头不行 xff0c 换了ipad用的5V 2A的充电器后就可以开启了 xf
  • 树莓派连接“手机热点“或“WiFi“ 后无法上网,以及连接“手机热点“或“WiFi“时VNC连接失败问题

    问题描述 之前一直在开热点 xff0c 通过电脑端VNC控制树莓派拍摄照片 xff0c 今天突然发现树莓派上不去网 xff0c 所以就试着尝试解决了一下 xff0c 心路历程如下 xff1a 要么就是树莓派连不上网 xff0c 要么就是连上
  • 相机标定和双目相机标定标定原理推导及效果展示

    文章目录 前言一 相机标定1 相机的四个坐标系2 相机的畸变 二 张正友标定法1 求解内参矩阵与外参矩阵的积2 求解内参矩阵3 求解外参矩阵4 标定相机的畸变参数5 双目标定6 极线矫正 xff08 立体校正 xff09 三 视差图与深度图
  • keras:tensor从全连接层输出到卷积层

    一 tensor从卷积层输出到全连接层 用过keras的都知道 xff0c 想从卷积层输出tensor到全连接层 xff0c 只需加一层 xff1a model add Flatten shape就不会出现错误 二 但是如果从全连接层输出t
  • 保研面试复习之数据结构篇

    数据项 数据元素和数据结构的概念 数据项是组成数据元素的 xff0c 有独立含义的 xff0c 不可分割的最小单位 数据元素是数据的基本单位 数据结构是带结构的数据元素的集合 数据结构包括逻辑结构和存储结构两个层次 数据结构的三要素是逻辑结
  • 视觉里程计的重定位问题1——SVO的重定位部分

    SVO的重定位部分代码解析与分析 SVO的重定位功能体现在 xff1a 运动跟踪丢失后通过与上一关键帧匹配以及地图点投影 xff0c 找回当前相机位姿 由于没有后端和回环 xff0c SVO的重定位并不是回环校正后的重定位 代码部分被放在运