vins位姿图优化

2023-05-16

我们 的滑动窗口和边缘化方案限制了计算的复杂性,但也给系统带来了累积漂移。更确切地说,漂移发生在全局三维位置(x,y,z)和围绕重力方向的旋转(yaw)。为了消除漂移,提出了一种与单目VIO无缝集成的紧耦合重定位模块。

论文内容

1. 回环检测

利用DBoW2词袋模型进行回环检测,除了用于单目VIO的角点特征外,另外500个fast角点被检测出来并有brief描述子描述。额外的角点特征用于在回环检测中实现更好的召回率。DBoW2在时间和空间一致性检验后返回回环候选帧。(好像没有)

2. 特征恢复

检测到回环帧后,通过检索特征对应关系建立局部滑动窗口与回环候选帧之间的连接。通过brief描述子匹配找到对应关系(用的暴力匹配,可以考虑用DBoW2中的数据库中的顺序索引,加速匹配)。直接匹配描述子可能会造成大量异常值,为此,论文使用两步进行集合异常值剔除(代码中只用了pnp):
1、2D-2D:RANSAC[31]的基本矩阵检验。我们利用当前图像中检索到的特征的二维观测和回环候选图像进行基本矩阵检验。
2、3D-2D:RANSAC的PNP检验。基于特征在局部滑动窗口中已知的三维位置,以及回环候选图像中的二维观测,进行PNP检验。
当内点超过一定阈值时,我们将该候选帧视为正确的循环检测并执行重定位。

3. 快速重定位

检测出回环帧之后,返回回环帧的信息给vins_estimator节点,在窗口优化后,得到loop_info信息
此时窗口优化的代价函数变为:
min ⁡ x { ∥ r p − H p X ∥ 2 + ∑ k ∈ B ∥ r B ( z ^ b k + 1 ′ b k , X ) ∥ P k + 1 b k + 1 + ∑ ( l , j ) ∈ C ∥ r C ( z ^ l c j , X ) ∥ P l C j 2 + ∑ ( l , v ) ∈ L ∥ r C ( z ^ l v , X , q ^ v w , p ^ v w ) ∥ P l 2 c v } \min _{x}\left\{\left\|r_{p}-H_{p} X\right\|^{2}+\sum_{k \in B}\left\|r_{B}\left(\hat{z}_{b_{k+1}^{\prime}}^{b_{k}}, X\right)\right\|_{P_{k+1}^{b_{k+1}}}+\sum_{(l, j) \in C}\left\|r_{C}\left(\hat{z}_{l}^{c_{j}}, X\right)\right\|_{P_{l}^{C_{j}}}^{2}+\right. \left.\sum_{(l, v) \in \mathcal{L}}\left\|r_{C}\left(\hat{z}_{l}^{v}, X, \hat{q}_{v}^{w}, \hat{p}_{v}^{w}\right)\right\|_{P_{l}}^{2} c_{v}\right\} xminrpHpX2+kBrB(z^bk+1bk,X)Pk+1bk+1+(l,j)CrC(z^lcj,X)PlCj2+(l,v)LrC(z^lv,X,q^vw,p^vw)Pl2cv

4. 四自由度全局优化

当检测到了回环帧后才进行优化
通过最小化以下代价函数,对顺序边和回环边的整个图进行优化:
min ⁡ p , ψ { ∑ ( i , j ) ∈ S ∥ r i , j ∥ 2 + ∑ ( i , j ) ∈ L h ( ∥ r i , j ∥ 2 ) } \min _{p, \psi}\left\{\sum_{(i, j) \in \mathcal{S}}\left\|r_{i, j}\right\|^{2}+\sum_{(i, j) \in \mathcal{L}} h\left(\left\|r_{i, j}\right\|^{2}\right)\right\} p,ψmin(i,j)Sri,j2+(i,j)Lh(ri,j2)

其中,我们将帧i和j之间边的残差定义为:

r i , j ( p i w , ψ i , p j w , ψ j ) = [ R ( ϕ ^ i , θ ^ i , ψ i ) − 1 ( p j w − p i w ) − p ^ i j i ψ j − ψ i − ψ ^ i j ] r_{i, j}\left(p_{i}^{w}, \psi_{i}, p_{j}^{w}, \psi_{j}\right)=\left[\begin{array}{c}{R\left(\hat{\phi}_{i}, \hat{\theta}_{i}, \psi_{i}\right)^{-1}\left(p_{j}^{w}-p_{i}^{w}\right)-\hat{p}_{i j}^{i}} \\ {\psi_{j}-\psi_{i}-\hat{\psi}_{i j}}\end{array}\right] ri,j(piw,ψi,pjw,ψj)=[R(ϕ^i,θ^i,ψi)1(pjwpiw)p^ijiψjψiψ^ij]

其中S是所有序列边的集合,L是回环边的集合。尽管紧耦合的重定位已经有助于消除错误的回环,但我们添加了另一个Huber范数 ρ(·),以进一步减少任何可能的错误回环的影响。相反,不对顺序边使用任何鲁棒范数,因为这些边是从VIO中提取出来的,VIO已经包含了足够多的外点排除机制。

序列边的集合包括:从最早回环帧到当前帧中的每一帧,它和之前最近的最多4帧产生的约束边

优化的变量初值为:T_w2_index,优化后为:T_w1_index,最终可以得到drift漂移位姿

5. 位姿图管理

随着行程距离的增加,位姿图的大小可能会无限增长,从而限制了长时间系统的实时性。为此,我们实行了一个下采样过程,将位姿图数据库保持在有限的大小。所有具有回环约束的关键帧都将被保留,而其他与相邻帧过近或方向非常相似的关键帧可能会被删除。关键帧被移除的概率和其相邻帧的空间密度成正比。(这一点在代码中没有体现)

重定位的两种方案

1. 快速重定位(fast_relocalization)

通过回环检测得到回环帧,将回环帧信息发布给vins_estimator节点在窗口中进行局部优化,得到了loop_info(T_i_j)后返回给位姿图节点,然后得到T_w1_j,结合已知的T_w2_j,得到T_w1_w2(shift_t);

2. 全局优化重定位

通过pnp得到loop_info(T_i_j),作为残差信息放在ceres优化中,从最早的回环帧到当前帧均为优化变量,分别添加序列约束块和回环约束块 ,序列约束选取离它最近的前4帧,回环约束就是当前帧跟回环帧,进行全局优化后的位姿为T_w1_index,结合已知的T_w2_index可以得到T_w1_w2(shift_t)

  • 可以看出,重定位就是想计算出世界坐标系和vio坐标的漂移位姿(shift_t),由于快速重定位是在窗口局部优化中得到的,计算快,输出响应快,但精度较低;而全局优化重定位可以得到高精度的位姿估计。

代码解读

在这里插入图片描述

  • ThirdParty文件夹:视觉词袋相关的第三方库
  • utility文件夹:
    • CameraPoseVIsualization:相机可视化化类,用来显示相机位姿和序列边、回环边的
    • tic_toc:时间统计类
    • utility:矩阵转换等一些工具类
  • parmaters:外部全局参数的头文件
  • keyframe:关键帧类
  • pose_graph:位姿图类
  • pose_grap_node:位姿图节点主函数

1. keframe类

  • 关键帧作为位姿图位姿图中重要的数据类型,类代码如下:
  • 代码思维导图:
    在这里插入图片描述

2. pose_graph类

  • 位姿图类主要负责对检测到的回环帧进行全局位姿优化,在添加新创建的关键帧后,需要进行回环检测(并优化),并发布path话题
  • 代码思维导图:
    在这里插入图片描述

3. 节点主函数

  • 主要是创建pose_graph实例,接收话题,发布话题,其中开辟了多个线程执行多任务
  • 代码思维导图:
    在这里插入图片描述
  • 多线程:
    在这里插入图片描述
  • 输出文件:
    在这里插入图片描述
  • 辅助文件:
    在这里插入图片描述

pose_graph节点主要流程

  • 主线程接受话题消息,并创建pose_graph实例(同时开辟全局优化线程),如果需要则预加载已有位姿图文件到psoe_graph实例中
  • 子线程process根据接收的消息,创建新的keyframe实例,添加进入pose_graph实例中
  • pose_graph对添加的新keyframe进行回环检测,如果发现回环则进行全局优化,得到drift漂移量
  • 根据drift偏移量,更新全局位姿,发布path路径话题信息

部分话题输出(rviz)

  • 回环帧的匹配的调试图像
    在这里插入图片描述
  • 相机可视化
    在这里插入图片描述
  • Odometry输出
    在这里插入图片描述
  • pose_graph_path路径输出
    在这里插入图片描述

文件输出

在这里插入图片描述
在这里插入图片描述

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

vins位姿图优化 的相关文章

  • VINS slam , imu fusion

    VINS 基本介绍 VINS Mono 和 VINS Mobile 是香港科技大学沈劭劼老师开源的单目视觉惯导 SLAM 方案 2017年发表于 IEEE Transactions on Robotics 另外 xff0c VINS 的最新
  • VINS的折腾之路

    一直从事室内定位相关 xff0c 之前的研究方向都是惯性导航和滤波 xff0c 现在发现基于视觉能够和移动端的这些原有方法做很好的结合 xff0c 所以开始研究vins这个方向 xff0c 主要希望能在移动端上和原有技术结合 xff0c 完
  • VINS-Fuison调试笔记

    最近一直在断断续续的调试vins fuison xff0c odometry总是各种飘 xff0c 令人头大 记录一下调试过程 xff0c 供以后学习参考 首先选用一组可靠的视觉惯导传感器 xff0c 如Realsense D435i xf
  • vins-mono(4)重定位以及全局优化

    vins的重定位模块主要包含回环检测 回环候选帧之间的特征匹配 紧耦合重定位三个部分 a 回环检测 采用BRIEF描述子的DBOW2词袋进行闭环检测 对新来的关键帧重新检测500个角点进行闭环检测同时对所有角点进行BRIEF描述 然后计算当
  • 【VINS-Mono】RealsenseD435i运行VINS-Mono,在ubuntu18.04和opencv3和cv_bridge的报错记录

    VINS Mono xff08 A Robust and Versatile Monocular Visual Inertial State Estimator xff09 https github com HKUST Aerial Rob
  • VINS - Fusion GPS/INS/视觉 融合 0、 Kitti数据测试

    放两张图片 至于为什么 xff1f 后面会解释 xff01 程序下载 xff1a https github com HKUST Aerial Robotics VINS Fusion 数据集制作 xff1a https zhuanlan z
  • 【SLAM】VINS-MONO解析——IMU预积分

    4 IMU预积分 IMU预积分主要干了2件事 xff0c 第一个是IMU预积分获得 值 xff0c 另一个是误差传递函数的获取 本部分的流程图如下图所示 各个部分的讲解如下链接 xff1a SLAM VINS MONO解析 综述 SLAM
  • 【学习SLAM】vins笔记

    VINS ROS source catkin ws devel setup bash 3 1 1 Open three terminals launch the vins estimator rviz and play the bag fi
  • vins中imu融合_VINS代码解读

    VINS estimator 摘抄 我们初始化的原因是单目惯性紧耦合系统是一个非线性程度很高的系统 xff0c 首先单目是无法获得空间中的绝对尺度 xff0c 而IMU又必然存在偏置 xff0c 在后面进行求解的时候还需要用到重力加速度 包
  • VINS-Mono代码学习记录(四)---estimator_node

    写在前面的话 终于把feature tracker这一个node给整理好了 xff0c 那些都是之前就已经看过的内容 xff0c 所以整理起来比较快 xff0c 接下来就慢慢边学边整理吧 xff0c 这次先来看estimator node
  • VINS on RealSense D435i

    关于Realsense D435i运行VINS系列 前言 在SLAM中 xff0c 主要是以激光SLAM和视觉SLAM为主 xff0c 激光雷达直接可以获取三维点云坐标信息 xff0c 所以激光SLAM会比视觉SLAM稳定许多 xff0c
  • VINS中陀螺仪零偏的估计

    VINS中关于陀螺仪零偏的初始化估计 对于窗口中得连续两帧 b k b k b k 和 b
  • ubuntu20.04跑PL-VINS

    PL VINS源码 xff1a https github com cnqiangfu PL VINS 编译时报错 catkin make Ceres报错 报错信息 CMake Error at usr local lib cmake Cer
  • Ubuntu 18.04 运行PL-VINS

    代码地址 https span class token operator span span class token comment github com cnqiangfu PL VINS span 安装过程出错参考 PL VINS配置
  • VINS-Fusion跑kitti stereo及stereo+GPS数据

    Stereo source vfusion devel setup bash roslaunch vins vins rviz launch source vfusion devel setup bash rosrun loop fusio
  • TX2上布置vins_fusion_gpu指南

    1 参考链接 如果初次安装 xff0c 新的TX2环境 xff0c 请参考文档 https github com arjunskumar vins fusion gpu tx2 nano 2 问题记录 1 xff0c 自己的环境情况 我的环
  • VINS-mono 位姿图 重利用测试

    在前一篇博文里介绍了VINS mono pose graph reuse功能的使用 xff0c 这里接着贴出一些延伸的测试 xff0c 并进行一些探讨 延伸测试 一般来说 xff0c 加载地图是进行非GPS定位必要的一步 这里根据新的VIN
  • vins中的坐标系变换及g2r函数

    slam中经常会需要表示一个刚体的位姿 例如imu的位姿 xff0c 相机的位姿 首先我们需要在一个刚体上架上一个坐标系 这个坐标系为本体坐标系 怎么架一个坐标系 xff1f imu本身就有规定其本身的x y z轴的方向 相机一般认为 xf
  • D435i运行VINS-mono以及Kalib标定

    D435i运行VINS mono以及Kalib标定 系统说明 xff1a Ubuntu 18 04 内核版本 xff1a 5 4 0 1 运行VINS mono 参考博客VINS xff08 D435i xff09 测试 问题 xff1a
  • 【VINS论文翻译】VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator

    回到目录 写在前面 港科大的VINS Mono作为目前state of the art的开源VIO项目 xff0c 是研究视觉与IMU紧耦合的必读算法 xff0c 网上的论文解读与代码实现也非常丰富 xff08 感谢 xff01 xff09

随机推荐

  • stm32寄存器封装

    文章目录 前言 一 版本一 二 版本二 三 版本三 前言 本文记录的是用stm32开发的时候 一些底层的寄存器封装 固件库是如何帮我们完成这些工作的 一 版本一 代码如下 示例 span class token comment 外设基地址
  • 使用TI的MSP430实现一个单片机与上位机的数传系统。(西安电子科技大学综合应用开发实验)

    题目要求 xff1a 目标 xff1a 智能控制系统 利用单片机 xff08 开发平台任选 xff09 设计并编程实现一个单片机与上位机的数传系统 要求 xff1a 对单片机和PC 手机 单片机之间的通信进行设计 如果大作业没有设计通信部分
  • NVIDIA Jetson Xavier NX 控制GPIO

    NVIDIA Jetson Xavier NX 控制GPIO 文章目录 NVIDIA Jetson Xavier NX 控制GPIO前言一 简介二 代码实例1 gpio h2 gpio cpp 三 拓展 前言 在linux系统中以文件io的
  • NVIDIA Jetson Xavier NX禁用上电自启,使用按键开关机

    NVIDIA Jetson Xavier NX禁用上电自启 xff0c 使用按键开关机 文章目录 NVIDIA Jetson Xavier NX禁用上电自启 xff0c 使用按键开关机前言一 原理二 拓展 前言 NX默认上电自启 xff0c
  • Linux系统设置共享文件夹

    Linux系统设置共享文件夹 文章目录 Linux系统设置共享文件夹一 设置原理二 设置步骤1 安装samba2 创建 设置共享文件夹 三 测试 一 设置原理 基于Ubuntu16 04 xff0c 采用在线安装samba库的方式设置共享文
  • Linux:复位USB设备

    Linux xff1a 复位USB设备 文章目录 Linux xff1a 复位USB设备前言一 基本原理二 代码实例总结 前言 在Ubuntu16 04下开发SDR设备数据处理程序时 xff0c msi sdr设备有时运行几个小时后就会出现
  • Ubuntu Terminal终端默认常用快捷键总结

    Ubuntu Terminal终端默认常用快捷键总结 Ubuntu Terminal终端快捷键默认设置如下 xff0c 不同的发行版本可能有所出入 xff0c 以下快捷键在Ubuntu18 04LTS下可用 1 文件 快捷键说 明Ctrl
  • 基于c++ boost库实现进程管理

    基于c 43 43 boost库实现进程管理 1 前言 基于c 43 43 boost库与Terminator终端 xff0c 实现启动进程 进程运行状态监听 自动重启进程 杀死进程 设置进程环境变量等基础功能 2 原理 启动 杀死进程基于
  • 【RT-Thread】UART 设备源码分析

    官网介绍 I O 设备模型框架如下图 xff1a 但看到官网写道 设备驱动层是一组驱使硬件设备工作的程序 xff0c 实现访问硬件设备的功能 它负责创建和注册 I O 设备 xff0c 对于操作逻辑简单的设备 xff0c 可以不经过设备驱动
  • 基于c++ boost实现阻塞式ping指定IP

    基于c 43 43 boost实现阻塞式ping指定IP 1 前言 在实际业务场景中 xff0c 可能需要阻塞式检测目标IP连通性 xff0c 本程序基于c 43 43 boost库实现了一个简易的阻塞式ping指定IP例子 2 原理 在循
  • ROS_PACKAGE_PATH相关问题

    在ROS进行跨文件调用功能包时遇到报错 Resource not found The following package was not found span class token keyword in span span class t
  • 基于python批量调整图像大小

    前言 在写论文的时候常常因为截图的尺寸大小不一样 xff0c 导致图片排版很难受 xff0c 在word中又不会批量修改 xff0c 用下面的代码可以批量处理修改成一样的尺寸哦 xff01 代码如下 xff1a 在本文中 xff0c 我将向
  • PX4:【启动流程】

  • 线程池和多线程的区别

    线程池的概念 线程池大类总共分为4种 fixThreadPool 正规线程 xff08 传统线程池 xff09 cacheThreadPool 缓存线程池singleThreadPoll 单线程线程池 xff08 单例线程池 xff09 S
  • C++ libcurl Digest Auth

    C 43 43 libcurl Digest Auth postman操作如下 xff1a 附认证原理如下 xff1a MD5 md5 span class token punctuation span string HA1 span cl
  • 如何安装postman(超简单)

    方法一 xff1a xff08 官网下载 xff09 1 打开https www crx4chrome com crx 1058 2 稍微往下微微一拉就出现 Download crx file from Crx4Chrome gt 的选择
  • 转 curl 参数大全

    curl是一个非常实用的 用来与服务器之间传输数据的工具 xff1b 支持的协议包括 DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP LDAPS POP3 POP3S RTMP RT
  • DataX mysql同步到mysql

    使用Datax web 创建同步任务 准备工作 创建数据源 配置数据库相关信息 创建执行器 配置执行器执行地址相关信息 1 构建reade 1 1 SQL语句 xff08 querySql xff09 在json文件中此部分配置就是 que
  • MQTT协议简介

    目录 MQTT协议简介一 MQTT协议特点1 1 发布和订阅1 2 QoS Quality of Service levels 二 MQTT数据包结构2 1 MQTT固定头2 2 MQTT可变长 Variable header 2 3 消息
  • vins位姿图优化

    我们 的滑动窗口和边缘化方案限制了计算的复杂性 xff0c 但也给系统带来了累积漂移 更确切地说 xff0c 漂移发生在全局三维位置 x y z 和围绕重力方向的旋转 yaw 为了消除漂移 xff0c 提出了一种与单目VIO无缝集成的紧耦合