VIO的图优化模型

2023-05-16

因子图结构

VIO在纯视觉的基础上添加了IMU约束,因子图如下:在这里插入图片描述

状态变量

VIO中,待估计的状态变量 θ i = ( R W B i , W p B i , W v B i , b i g , b i a ) \theta^i=(R_{WB}^i,_Wp_B^i,_Wv_B^i,b_i^g,b_i^a) θi=(RWBi,WpBi,WvBi,big,bia)*注意不是 T W C T_{WC} TWC
观测量 z i l ∈ C i z_{il}\in C_i zilCi,表示第i帧看到的第j个路标点,输入 ( ω i ~ , a i ~ ) ∈ I i j (\tilde{\omega_i},\tilde{a_i})\in I_{ij} (ωi~,ai~)Iij,第i、j准帧间惯导信息,其中 ( i , j ) ∈ K k (i,j)\in K_k (i,j)Kk,为关键帧的集合。

误差优化函数

θ ∗ = arg ⁡ min ⁡ θ ∑ k [ E p r o j ( k , j ) + E I M U ( i , j ) ] , k ∈ K k \theta^*=\arg\min_\theta \sum_k[E_{proj}(k,j)+E_{IMU}(i,j)],k\in K_k θ=argθmink[Eproj(k,j)+EIMU(i,j)],kKk包括重投影误差项及IMU误差项。
重投影误差项: E p r o j ( k , j ) = ρ ( ( x k − π ( X c k ) ) T Σ k ( x k − π ( X c k ) ) ) π ( X c ) = [ f u X c Z c + c u f v Y c Z c + c v ] , X c = [ X c Y c Z c ] T X c = T C W P W = ( T W B T B C ) T P W = T C B T W B T P W , T W B T = [ R W B T − R W B T W p B 0 T 1 ] X c k = R C B R W B T ( X W k − W p B j ) + c p B E_{proj}(k,j)=\rho((x^k-\pi(X_c^k))^T\Sigma_k(x^k-\pi(X_c^k))) \\ \pi(X_c)=\left[ \begin{matrix} f_u \frac{X_c}{Z_c}+c_u \\ f_v \frac{Y_c}{Z_c}+c_v \end{matrix} \right],X_c=\left[ \begin{matrix}X_c&Y_c&Z_c \end{matrix} \right]^T \\ Xc=T_{CW}P_W=(T_{WB}T_{BC})^TP_W=T_{CB}T_{WB}^TP_W,T_{WB}^T=\left[ \begin{matrix} R_{WB}^T &-R_{WB}^T {_Wp_B} \\ 0^T&1 \end{matrix} \right] \\ X_c^k=R_{CB}R_{WB}^T(X_W^k-_Wp_B^j)+_cp_B Eproj(k,j)=ρ((xkπ(Xck))TΣk(xkπ(Xck)))π(Xc)=[fuZcXc+cufvZcYc+cv],Xc=[XcYcZc]TXc=TCWPW=(TWBTBC)TPW=TCBTWBTPW,TWBT=[RWBT0TRWBTWpB1]Xck=RCBRWBT(XWkWpBj)+cpBIMU误差 E I M U ( i , j ) = ρ ( [ e R e v e p ] T Σ I [ e R e v e p ] ) + ρ ( e b T Σ R e b ) e R = L o g ( Δ R i j E x p ( J Δ R g δ b i g ) R B W i R W B j ) e v = R B W i ( W v B j − W v B i − g W Δ t i j ) − ( Δ v i j + J Δ v g δ b i g + J Δ v a δ b i a ) e p = R B W i ( W p B j − W p B i − W v B i Δ t i j − 1 2 g W Δ t i j 2 ) − ( Δ p i j + J Δ p g δ b i g + J Δ p a δ b i a ) e b = [ b j g − b i g b j a − b i a ] E_{IMU}(i,j)=\rho(\left[\begin{matrix}e_R&e_v&e_p\end{matrix}\right]^T\Sigma_I\left[\begin{matrix}e_R&e_v&e_p\end{matrix} \right])+\rho(e_b^T\Sigma_Re_b) \\ e_R=Log(\Delta R_{ij}Exp(J_{\Delta R}^g\delta b_i^g)R_{BW}^iR_{WB}^j) \\ e_v=R_{BW}^i(_Wv_B^j-_Wv_B^i-g_W\Delta t_{ij})-(\Delta v_{ij}+J_{\Delta v}^g\delta b_i^g+J_{\Delta v}^a\delta b_i^a) \\ e_p=R_{BW}^i(_Wp_B^j-_Wp_B^i-_Wv_B^i\Delta t_{ij}-\frac12g_W\Delta t_{ij}^2)-(\Delta p_{ij}+J_{\Delta p}^g\delta b_i^g+J_{\Delta p}^a\delta b_i^a) \\ e_b=\left[ \begin{matrix}b_j^g-b_i^g \\ b_j^a-b_i^a \end{matrix} \right] EIMU(i,j)=ρ([eRevep]TΣI[eRevep])+ρ(ebTΣReb)eR=Log(ΔRijExp(JΔRgδbig)RBWiRWBj)ev=RBWi(WvBjWvBigWΔtij)(Δvij+JΔvgδbig+JΔvaδbia)ep=RBWi(WpBjWpBiWvBiΔtij21gWΔtij2)(Δpij+JΔpgδbig+JΔpaδbia)eb=[bjgbigbjabia]

图优化模型节点及边

在ORB-SLAM2中,图优化存在于三个线程:Tracking、Local Mapping、Loop Closing。分别处理局部共视区域中的非线性优化,地图更新时的优化、位姿图优化检测闭环。

Tracking

在这里插入图片描述

  1. 地图更新后第j个帧到达时(非关键帧),将其与最近的一个关键帧i建立联系,第i帧作为先验且固定,优化重投影及IMU误差估计第j帧状态
  2. 优化结束,将得到的第j帧状态变量及Hessian矩阵传递至下次优化作为先验
  3. 第j+1帧到达,使用第j帧的优化结果作为第j帧的初值和此次优化先验,联合优化第j、j+1帧,此时待优化的状态变量为 θ = ( R W B j , W p B j , W v B j , b j g , b j a , R W B j + 1 , W p B j + 1 , W v B j + 1 , b j + 1 g , b j + 1 a ) \theta=(R_{WB}^j,_Wp_B^j,_Wv_B^j,b_j^g,b_j^a,R_{WB}^{j+1},_Wp_B^{j+1},_Wv_B^{j+1},b_{j+1}^g,b_{j+1}^a) θ=(RWBj,WpBj,WvBj,bjg,bja,RWBj+1,WpBj+1,WvBj+1,bj+1g,bj+1a),误差函数为 θ ∗ = arg ⁡ min ⁡ θ ∑ k [ E p r o j ( k , j + 1 ) + E I M U ( j , j + 1 ) + E p r i o r ( j ) ] \theta^*=\arg\min_\theta \sum_k[E_{proj}(k,j+1)+E_{IMU}(j,j+1)+E_{prior}(j)] θ=argminθk[Eproj(k,j+1)+EIMU(j,j+1)+Eprior(j)],增加了先验误差项. E p r i o r ( j ) = ρ ( [ e R e v e p e b ] T Σ p [ e R e v e p e b ] ) e R = L o g ( R ˉ W B j R W B j ) ,   e v = W v ˉ B j − W v B j ,   e p = W p ˉ B j − W p B j ,   e b = b ˉ j − b j E_{prior}(j)=\rho([e_Re_ve_pe_b]^T\Sigma_p[e_Re_ve_pe_b])\\e_R=Log(\bar{R}_{WB}^j{R}_{WB}^j), \ e_v=_W\bar{v}^{j}_{B}-_Wv^{j}_{B}, \ e_p=_W\bar{p}^{j}_{B}-_Wp^j_{B}, \ e_b=\bar{b}_j-b_j Eprior(j)=ρ([eRevepeb]TΣp[eRevepeb])eR=Log(RˉWBjRWBj), ev=WvˉBjWvBj, ep=WpˉBjWpBj, eb=bˉjbj带横线的为先验。
  4. 联合优化结束后,边缘化掉第j帧,重复步骤2、3,直到地图有更新(出现新的关键帧),重新执行1开始

该过程对应的图模型

一、LocalBAPRVIDP对应Tracking中的步骤一:

节点:
  1. 外点:vTcb 类型:VertexNavStatePR;ID:ExtrinsicVertexId = KeyFrame::nNextId*3 + MapPoint::nNextId + 1(每一个关键帧三个节点,每一个路标点一个节点,一个外部节点);固定不优化
  2. LocalKeyFrame帧节点pKF0:
    1)PR节点(位姿)vNSPR 类型:VertexNavStatePR;
    2)V节点(速度)vNSV 类型:VertexNavStateV
    3)Bias节点 vNSBias 类型:VertexNavStateBias
  3. FixedCameras 节点(固定)pKF1:
    1)PR节点(位姿)vNSPR 类型:VertexNavStatePR;对于常规的关键帧,只添加该节点。
    2)对于划窗前最近的关键帧,添加V和Bias节点
    V节点(速度)vNSV 类型:VertexNavStateV
    Bias节点 vNSBias 类型:VertexNavStateBias
  4. MapPoint节点 vPoint:类型:VertexIDP
边:
  1. 名称:epvr:连接PR0, PR1, V0, V1, B0
    类型:EdgeNavStatePRV
  2. 名称:ebias:连接B0,B1
    类型:EdgeNavStateBias
  3. 名称: e:连接vPoint(idp),refPR,curPR,TcbPR
    类型:EdgePRIDP
图模型:

在这里插入图片描述

二、GlobalBundleAdjustmentNavStatePRV

节点:
  1. PR节点(位姿)vNSPR 类型:VertexNavStatePR;
  2. V节点(速度)vNSV 类型:VertexNavStateV
  3. Bias节点 vNSBias 类型:VertexNavStateBias
  4. MapPoint节点 vPoint 类型:VertexSBAPointXYZ
边:
  1. 名称: epvr:连接PR0, PR1, V0, V1, B0
    类型:EdgeNavStatePRV
  2. 名称: ebias:连接B0,B1
    类型:EdgeNavStateBias
  3. 名称: e:连接vPoint,vPR
    类型:EdgeNavStatePRPointXYZ
图模型:

在这里插入图片描述

三、LocalBundleAdjustmentNavStatePRV同上

四、GlobalBundleAdjustmentNavState

节点
  1. PVR节点 vNSPVR:类型:VertexNavStatePVR
  2. Bias节点 vBias: 类型:VertexNavStateBias
  3. MapPoint节点 vPoint :类型:VertexSBAPointXYZ
  1. 名称:epvr:连接PVR0,PVR1,B0
    类型:EdgeNavStatePVR
  2. 名称: ebias:连接B0,B1
    类型:EdgeNavStateBias
  3. 名称:e:连接vPoint,vNSPVR
    类型:EdgeNavStatePVRPointXYZ
图模型

在这里插入图片描述

五、PoseOptimization对应Tracking中的步骤二、三:

节点
  1. PVR节点 vNSPVR/ vNSFPVRlast:类型:VertexNavStatePVR
  2. Bias节点 vNSFBias/ vNSFBiaslast: 类型:VertexNavStateBias
  1. 名称:eNSPrior:连接vNSFPVRlast,vNSFBiaslast先验误差
    类型:EdgeNavStatePriorPVRBias
  2. 名称:eNSPVR:连接vNSFPVRlast,vNSPVR,vNSFBiaslast IMU误差
    类型:EdgeNavStatePVR
  3. 名称:eNSBias:连接vNSFBiaslast,vNSFBias
    类型:EdgeNavStateBias
  4. 名称: e:连接vNSFPVRlast;连接vNSFPVR
    类型:EdgeNavStatePVRPointXYZOnlyPose
图模型

在这里插入图片描述

六、PoseOptimization

去掉了eNSPrior和只连接vPVRLast的边e

七、LocalBundleAdjustmentNavState同上相同?

八、OptimizeInitialGyroBias

该优化函数用于陀螺仪偏置初始化

节点
  1. GyrBias节点:vBiasg:类型VertexGyrBias
  1. 名称:eBiasg:连接vBiasg陀螺仪偏置一元边
    类型:EdgeGyrBias

九、LocalBundleAdjustment

节点
  1. 位姿节点:vSE3:类型VertexSE3Expmap
  2. MapPoint节点: vPoint:类型VertexSBAPointXYZ
  1. 名称:e:连接vSE3,vPoint
    类型:EdgeStereoSE3ProjectXYZ
图模型

在这里插入图片描述

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

VIO的图优化模型 的相关文章

  • MapReduce系列-eclipse运行MapReduce

    1 eclipse安装hadoop的插件 下载 hadoop eclipse plugin 2 6 0 jar xff0c 将其放入 eclipse 的 plugins 目录 xff0c 并重启 eclipse xff0c 项目视图 xff
  • python爬取淘宝网

    from selenium import webdriver import re from bs4 import BeautifulSoup import time def url open driver content 爬取源代码 ele
  • SUMO仿真数据输出的配置方法

    1 概述 1 1 目的 说明SUMO仿真结束后可以输出的数据及其设置方法 1 2 参考文档 http sumo dlr de wiki Simulation Output 2 SUMO的输出数据概述 SUMO可以输出的数据概述如下表 xff
  • LQR 控制学习-LQR控制 MATLAB官方教程-LQR 控制器_状态空间系统Matlab/Simulink建模分析

    LQR 控制 本blog主要记录LQR 线性二次调制系统的 xff0c 学习教程为两个B站的教学视频 状态空间4 LQR控制 MATLAB官方教程 视频链接 xff1a 原创翻译 状态空间4 LQR控制 MATLAB官方教程 原创翻译 状态
  • 多传感器融合定位 第一章 概述

    多传感器融合定位 第一章 概述 本记录深蓝学院多传感器定位融合第四期学习笔记 xff0c 官方推荐使用docker进行开发 xff0c 为了方便之后移植部署 xff0c 故本次在次在本地环境进行开发 代码下载 xff1a https git
  • 记一次CSDN的资源加载失败的问题的解决方法

    前段时间 xff0c 某天突然发现CSDN加载不了 xff0c 我还以为网站出现故障了 xff0c 但是没想到第二天还是访问不了 xff0c 问了下同事 xff0c 他的好像没有什么问题 xff08 大概长这样 xff09 找到加载失败的u
  • github release 功能的使用及问题解决

    对很多初学者来说 xff0c 要自己架设一个服务器来提供app更新 xff0c 别说是配置服务器了 xff0c 光是买个主机都很棘手 所幸的是github提供了release功能 xff0c 并有相关api支持 下面就来说说如何使用gith
  • Ubuntu 下如何测试 USB 摄像头支持的分辨率、压缩格式,并使用 OpenCV 按正确的格式读取出来?

    介绍 本篇博客介绍了如何使用v4l utils工具来查看所购买的USB摄像头支持的分辨率等信息 xff0c 并使用一个短小的 opencv 脚本将图像读取出来 测试 USB 摄像头支持的分辨率和压缩格式 需要的工具 xff1a apt in
  • 程序上下文切换,什么是上下文?

    1 什么是上下文 xff1f Linux是一个多任务的操作系统 xff0c 它支持远大于CPU数量的任务同时运行 xff0c 当然 xff0c 这些任务实际上并不是真正的在同时运行 xff0c 而是系统在很短的时间内 xff0c 将CPU轮
  • PHP计算今天、昨天、本周、本月、上月开始时间和结束时间

    start 61 date 39 Y m d H i s 39 mktime 0 0 0 date 39 m 39 date 39 d 39 date 39 Y 39 end time 61 date 39 Y m d H i s 39 m
  • nms和softnms的代码

    文章目录 前言预测框筛选的方法1 nms2 softnms 总结 前言 nms和softnms的原理及相关简单代码总结 预测框筛选的方法 预测框的筛选 xff0c 是检测模块后处理阶段的一个十分重要的过程 因为我们预测输出的预测框 xff0
  • day5·全局与局部变量

    命名空间 命名空间是一个名称到对象之间的映射 xff0c 字典格式 相同的命名空间是不能有重复名称 xff08 字典的特性key不重复 xff09 不同的命名空间是可以有重复名称 局部命名空间 xff1a 函数中定义的名称 包含函数的参数
  • Ubuntu16.04下opencv获取realsense sr300的图像数据

    看到网上很多的文章都是用的库是librealsense xff0c 现在用的库是librealsense2 感觉差别较大 include lt librealsense2 rs hpp gt include lt opencv2 openc
  • P4基础知识

    为了解决 OpenFlow 编程能力不足的问题 Nick 教授等人提出了 P4 高级编程语言 P4 的优点主要有以下三点 可灵活定义转发设备数据处理流程 且可以做到转发无中断的重配置 P4 语言具有对交换机协议解析流程和数据处理流程进行编程
  • 飞控与ROS通信之路之环境搭建(ubuntu18环境下)

    文章目录 一 ROS的安装 二 Mavros的安装 三 QGC地面站的安装 一 ROS的安装 请参考的我的另一个博客 xff1a 点这 二 Mavros的安装 2 1 Mavros的简介 MAVROS相当于PX4飞控中的MAVLINK模块
  • 飞控与ROS通信之路之准备工作

    请先进行环境的搭建 xff1a 参考我的另一篇 博客 目录 xff1a 一 使用QGC为飞控下载固件 二 测试串口端口 三 测试信息 一 QGC下载飞控固件 使用USB链接电脑与飞控 xff0c 并打开QGC 重新插拔USB xff0c 在
  • ROS-新建工作空间、功能包、利用c++、python语言编写发布和订阅通信

    文章目录 1 创建工作空间与功能包1 1工作空间1 1 1工作空间的介绍1 1 2创建工作空间1 1 3编译工作空间 1 2功能包1 2 1功能包的介绍1 2 1功能包的创建1 2 2功能包的编译1 2 3功能包中文件的意义1 2 4设置环
  • 移动端苹果IOS中select的option值不显示问题解决

    移动端苹果IOS中select的option值不显示问题解决 遇到一个问题就是最原始的select标签在安卓手机上显示正常 xff0c 但是在IOS苹果高版本上点击select xff0c 在页面上有占位 xff0c 随便点击也可以将值选在
  • Maven入门 常用知识

    目录 maven目录 Maven常用命令说明 设置http代理 Maven插件安装 xff0c 基于IDEA Maven使用 依赖的配置 依赖范围 传递性依赖 依赖范围 排除依赖 归类依赖 仓库 仓库的由来 仓库的布局 仓库的分类 本地仓库
  • 2020-10-28 元学习(Meta Learning)与迁移学习(Transfer Learning)的区别联系是什么?

    本文转自 xff1a https www zhihu com question 299020462 answer 653199202 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 迁

随机推荐

  • 软件安装系列:Boost 的安装与初试

    这期开始会不断更新一些软件安装使用过程中的一些问题 xff0c 帮着各位老师快速的实现软件的使用 xff0c 在安装过程中总是出现这样那样的问题 xff0c 我们就将基于此类问题 xff0c 总结一些解决办法 xff0c 帮助大家快速成长
  • PHP 出现 ‘continue’ not in the ‘loop’ or ‘switch’ context错误

    把 continue 删除 改为 return 即可
  • Java随机数-获取0到9内的随机数

    本文参考 嗨客网 Java 实战 Java随机数 描述 运用 Java 的 Random 得到随机数 题目 获取 0 到 9 内的随机数 xff08 包括 0 和 9 xff09 题目解决思路 创建一个生产随机数的对象 通过对象方法获取随机
  • Java基础练习题及详细答案

    本文参考 嗨客网 Java 实战 前言 本篇文章给大家安利一些关于 Java 基础的练习题 xff0c 每道题都附有答案链接 xff0c 答案解题的每个步骤到运行结果都十分详细 xff0c 十分适合小白拿来练习 xff0c 也十分适合准备面
  • STM32 四线驱动1602A 填坑!解决重启乱码

    最近学STM32 xff0c 用来丰富一下生活 xff0c 一个四线1602搞得一星期 xff0c 对自己的智商也是醉了 填坑开始 xff01 用的是HAL库编写的 xff0c 仅仅在ODR寄存器使用了一点寄存器操作 xff0c 其余全是H
  • 谭浩强C语言练习题及详细答案

    本文参考 嗨客网 Java 实战 前言 本篇文章分享的是 C 语言程序设计 xff08 谭浩强 C 语言第三版 xff09 课后习题及答案 xff0c 大家在学习了 C 语言程序设计后 xff0c 做几道相关的练习题 xff0c 复习一下该
  • 【自学C++】Windows安装C++语言开发环境

    Windows安装C 43 43 语言开发环境 Windows安装C 43 43 语言开发环境教程 C 43 43 的开发环境可以直接使用 C 语言 的开发环境 xff0c 同时 xff0c Windows 本身就自带 C 43 43 语言
  • 【自学Python】Python bytes转string

    Python bytes转string Python string转bytes教程 在 Python 中 xff0c bytes 类型和 字符串 的所有操作 使用和内置方法也都基本一致 因此 xff0c 我们也可以实现将 bytes 类型转
  • 【自学Python】Python查找字符串位置

    Python查找字符串位置 大纲 Python查找字符串位置教程 在开发过程中 xff0c 很多时候我们有在一个 字符串 中查找另一个字符串位置的需求 xff0c 在 Python 中 xff0c 在一个字符串中查找另一个字符串的位置我们使
  • 【自学Docker 】Docker port命令

    Docker port命令 概述 docker port命令教程 docker port 命令可以用于列出指定的 Docker容器 的端口映射 xff0c 或者将容器里的端口映射到宿主机 该命令后面的 CONTAINER 可以是容器Id x
  • 【自学Docker】Docker pull命令

    大纲 Docker pull命令 docker pull命令教程 docker pull 命令用于从镜像仓库中拉取或者更新指定镜像 docker pull 命令中的 name 即镜像名称后面可以跟上镜像标签或者镜像摘要 docker pul
  • 【自学Docker】Docker push命令

    大纲 Docker push命令 docker push命令教程 docker push 命令用于将本地的 Docker镜像 上传到 Docker镜像仓库 docker push命令使用之前需要要先登陆到镜像仓库 docker push命令
  • 【自学Linux】Linux运行级别

    Linux运行级别 Linux运行级别教程 Linux 可以支持运行级别的设置 xff0c 运行级别就是操作系统当前正在运行的功能级别 xff0c 级别是从 0 到 6 Centos7 系统之前的版本是通过 etc inittab 文件来定
  • 【自学Linux】 Linux文件目录结构

    Linux文件目录结构 Linux文件目录结构教程 在 Linux 中 xff0c 有一个很经典的说法 xff0c 叫做一切皆文件 xff0c 因此 xff0c 我们在系统学习 Linux 之前 xff0c 首先要了解 Linux 的文件目
  • 【自学Linux】Linux一切皆文件

    Linux一切皆文件 Linux一切皆文件教程 Linux 中所有内容都是以文件的形式保存和管理的 xff0c 即一切皆文件 xff0c 普通文件是文件 xff0c 目录是文件 xff0c 硬件设备 xff08 键盘 监视器 硬盘 打印机
  • 链路聚合--Eth-Trunk

    链路聚合技术是解决二层交换机多条链路产生环路的问题 xff0c 不仅避免了环路问题 xff0c 还提高了数据的传输效率 链路聚合分为两种模式 xff1a 手动模式和LACP模式 手动模式 手动模式就是人工的方式去创建Eth Trunk和成员
  • 块元素和内联元素的特点和区别

    lt css基础之块级元素和内联元素 块级元素的特点 xff1a 1 占一整行 2 是一个矩形 3 可定义宽度和高度 xff0c 内边距 xff0c 外边距等 4 其display属性默认为block 内联元素的特点 xff1a 1 并不占
  • 在vs code中使用git

    在vs code使用git 1 下载安装git 下载地址 xff1a Git Downloads 下载后安装选择默认选项即可 2 安装完成后 xff0c 设置git的环境变量 xff1a 在系统的path环境变量中添加git exe的安装目
  • Ubuntu下压缩与解压缩

    一 linux下常用的压缩格式 linux下常用的压缩扩展名有 xff1a tar tar bz2 tar gz 二 Windows下7ZIP软件的安装 因为Linux下很多文件是bz2 gz结尾的文件 xff0c 因此需要在windows
  • VIO的图优化模型

    因子图结构 VIO在纯视觉的基础上添加了IMU约束 xff0c 因子图如下 xff1a 状态变量 VIO中 xff0c 待估计的状态变量为 i 61 R