【VINS论文笔记】A General Optimization-based Framework for Local Odometry Estimation with Multiple Sensors

2023-05-16

前言

2019年1月11日,港科大VINS-Mono的团队发布了VINS的扩展版本——VINS-Fusion。其支持多种视觉惯性传感器类型(单相机+ IMU,立体相机+ IMU,立体相机),还支持将VINS与GPS进行融合。本人就VINS-Fusion中多传感器局部位姿估计的相关论文进行了阅读,并进行内容整理(尽可能简洁)。

原文:A General Optimization-based Framework for Local Odometry Estimation with Multiple Sensors
《一种基于通用优化方法的多传感器局部里程计估计框架》

在这里插入图片描述

摘要

如今机器人上配备了越来越多的传感器以提高鲁棒性和自主能力。我们看到各种传感器组件配备在不同平台上,例如地面车辆上的立体相机,手机带有IMU(惯性测量单元)和单目相机,以及空中机器人上带有IMU和立体相机。尽管过去已经提出了许多用于状态估计的算法,但是它们通常应用于单个传感器或特定传感器组件。很少可以支持多种传感器。本文提出了一种基于通用优化的里程计估计框架,它支持多个传感器组。在框架中每个传感器都被视为一个通用因子。将共享相同状态变量的因子相加在一起以构建优化问题。我们进一步展示了视觉和惯性传感器的通用性,它们形成三种传感器组件(立体相机,带IMU的单目相机和带IMU的立体相机)。我们在公共数据集和通过多传感器的实际实验验证了该系统的性能。将结果与其他最先进的算法进行比较。我们强调该系统是一个通用框架,可以在位姿图优化中轻松融合各种传感器。我们开源了实现。

引言

提出了多传感器兼容的通用算法必要性:
1、过去的算法通常仅适用于单个传感器或特定传感器套件,无法移植到不同平台。
2、在传感器发生故障时,应移除不工作的传感器,并在系统中快速添加替代传感器。

本文的贡献:
1、一种支持多传感器的基于优化的通用状态估计框架
2、使用视觉和IMU详细推导状态估计,这些传感器形成不同的传感器套件(立体相机,单目相机+IMU,以及立体相机+IMU)。
3、对公共数据集和实际实验进行系统评估。
4、开源算法

相关工作

两种多传感器融合方法:

1、基于滤波器
EKF如MSCKF,其维持了几个相机位姿并利用多相机视图来形成多约束更新。
基于滤波器的方法产生非线性误差,能观性约束的EKF被提出用于提高准确性和一致性。而UKF是不分析雅可比矩阵的EKF扩展。
基于滤波器的方法对时间同步很敏感。任何延迟的测量都会引起麻烦,因为状态无法在滤波过程中传播回来。因此需要特殊的排序机制来确保来自多传感器的所有测量都是有序的。

2、基于优化
通过BA来维持大量测量值并一次优化多个变量,与滤波器方法相比,在时间同步上不敏感,在相同计算复杂性的精度上也较优。
发展出增量求解器以限制位姿图大小,如iSAM;滑动窗口法,保持固定大小的位姿图,将先前的状态被边缘化为先前因子而没有信息丢失。

本文采用了基于滑动窗口优化的状态估计框架。

系统概述

在这里插入图片描述位姿图中每个节点代表状态,每条边代表测量值得出的因子。构建位姿图,优化它等价于找到尽可能匹配所有边缘的节点配置。

方法

1、问题定义
1)待估计的状态变量:
在这里插入图片描述
p和R分别代表世界坐标系下的本体位置向量与旋转矩阵,xcam为相机相关状态,包括每个观察到的特征点深度,ximu是IMU相关状态,包括速度、加速度偏置和陀螺仪偏置。相机到IMU的变换矩阵通过离线标定。定义IMU作为本体坐标系中心(若不使用IMU则定义为左相机)。

2)代价函数
状态估计是一个最大似然估计问题(MLE),假设所有测量值独立且服从高斯分布,可以转变成最小二乘问题,通过BA进行求解:
在这里插入图片描述
在这里插入图片描述

2、传感器因子

1)相机因子:
对于每个相机帧,检测角点特征并通过KLT光流追踪先前帧。对于双目相机,追踪器也匹配左右图像的特征。
相机因子是重投影过程:将第一次观察的特征重投影到后续帧中。假设特征l在图像帧i被第一次观察,在图像帧t中观察到的残差被定义为(双目同理):
在这里插入图片描述
其中 [ u i l , v i l ] [u^l_i,v^l_i] [uil,vil]为在图像i中特征l的第一次观测
[ u t l , v t l ] [u^l_t,v^l_t] [utl,vtl]为在图像t中的相同特征的观测
π c 和 π c − 1 \pi_c和\pi^{-1}_c πcπc1为相机模型的投影、逆投影函数
T是4x4齐次变换矩阵
T b c T^c_b Tbc为从本体坐标系到相机坐标系的外参矩阵(已离线标定)
Ω t l \Omega^l_t Ωtl是重投影误差的协方差矩阵,是像素坐标系中的定值,来自相机内参标定结果。

2)IMU因子
假设加速度和陀螺仪噪声是高斯白噪声,加速度和陀螺仪偏置是一个随机游走,其导数是高斯白噪声。使用协方差传递函数在流形上对IMU测量值做预积分,IMU残差为:
在这里插入图片描述
3)其他因子
可以将其他测量值(轮式里程计、雷达、激光)建模为一般残差因子,并将残差因子加入到代价函数中。

3、优化
采用G-N或L-M方法解最小二乘问题。VINS采用ceres solver实现。
在这里插入图片描述
4、边缘化
状态数量随时间增加,计算复杂度平方增长,需要在不丢失有用信息的条件下采用边缘化。边缘化将先前测量转换为保留过去信息的先前项。
被边缘化的状态集合表示为Xm,剩余状态集合表示为Xr。 通过对所有边缘化因子求和,我们得到一个新的H和b。 重新排列顺序后得到:
在这里插入图片描述
通过舒尔补进行边缘化,得到新的预先值Hp和bp
在这里插入图片描述
5、讨论
系统是一个总体框架,通过将各种传感器转变为一般残差因子,可以将可以将其轻松添加到系统中。 能够处理传感器故障情况: 当传感器发生故障时,只需删除非不工作的传感器因子,并添加其他替代传感器的新因子。

实验

采用EuRoC MAV Visual-Inertial Datasets进行评估,并与OKVIS进行对比。评估内容包括:RPE (Relative Pose Errors) and ATE (Absolute Trajectory Errors)。
1、纯双目在V1 03 difficult和V2 03 difficult序列跟踪失败,而采用IMU的方法在所有图像序列中成功工作。说明当视觉轨迹因照明变化、无纹理区域或运动模糊而跟踪失败时,IMU可以显著改善运动跟踪性能。
2、纯双目的精度表现最差。而使用IMU显著利于状态估计。 因为IMU测量重力矢量,可以有效地抑制翻滚角和俯仰角的漂移。
3、具有IMU的立体相机并不总是表现最佳,因为它需要比具有IMU的单目摄像机更精确的标定。 不准确的内参和外参标定将在系统中引入更多噪声。
4、多传感器融合增加了系统的稳健性。

结论

提出了一种基于优化的局部位姿估计框架。 该框架可支持多传感器组合,文中演示了3种传感器组件:立体相机、带IMU的单目相机和带IMU的立体相机,也可以推广到其他传感器。并在公共数据集和实际实验中使用多传感器验证了系统性能。
未来将使用全局传感器(例如GPS)扩展该框架,以实现局部准确和全局感知的位姿估计。

个人想法

本文在对相机和IMU的状态估计推导和之前的VINS论文保持一致,也并没有深入介绍。其创新点在于将VINS构建为一种通用的VIO算法,通过将传感器测量值转换为一般残差因子添加到总代价函数中,以适用不同传感器组件的情况,便于算法在不同机器人上的移植和文中提到的对传感器进行替换。

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

【VINS论文笔记】A General Optimization-based Framework for Local Odometry Estimation with Multiple Sensors 的相关文章

  • 网页优化:为什么组合文件速度更快?

    我读过 将所有 css 文件合并为一个大文件 或将所有脚本文件合并为一个脚本文件 可以减少 HTTP 请求的数量 从而加快下载速度 但我不明白这一点 我认为如果你有多个文件 最多有一个限制 我相信在现代浏览器上是 10 个 浏览器会并行下载
  • WCF - 在服务中抛出故障异常的开销

    我发布了一个question https stackoverflow com questions 81306 wcf faults exceptions versus messages关于使用消息与故障异常在服务之间传达业务规则 我的印象是
  • Mysql:多个表还是一张大表?

    这个问题已经被问过 但我还没有找到 1 个语音答案 最好这样做 1 张大桌子 其中 用户 ID 属性 1 属性 2 属性 3 属性 4 或 4 个小桌子 其中 用户 ID 属性 1 用户 ID 属性 2 用户 ID 属性 3 用户 ID 属
  • 平衡括号问题的优化解

    给定一个仅包含字符的字符串 and 判断输入字符串是否有效 输入字符串在以下情况下有效 左括号必须由相同类型的括号封闭 左括号必须按正确的顺序关闭 请注意 空字符串也被视为有效 示例1 Input Output true Example 2
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 将代码保存在 L1 缓存中

    我一直在阅读维基百科关于 K 编程语言的文章 http en wikipedia org wiki K programming language Performance characteristics这就是我所看到的 解释器的小尺寸和语言的
  • 实验室数据与 Google Page Insight 的起源摘要之间的混淆

    任何知道 Core web Vitals 详细信息的人请帮我解决一些问题 How 起源总结与实验室数据不同吗 Speed Insight 如何获取起源摘要 这是同一页面或相似页面最近 28 天的总评分吗 我检查了具有相同内容的网站类别页面L
  • 计算径向轮廓的最有效方法

    我需要优化图像处理应用程序的这一部分 它基本上是按距中心点的距离划分的像素的总和 def radial profile data center y x np indices data shape first determine radii
  • Clang 与 1 优化相反

    经过与同事的讨论后 我最终测试了 clang 是否可以将倒数为 1 的两个分区优化为单个分 区 const float x a b x not used elsewhere const float y 1 x 理论上 clang 可以优化为
  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 单个返回语句与多个返回语句? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SELECT COUNT() 与 mysql_num_rows();

    我有一个大表 60 数百万条记录 我正在使用 PHP 脚本来浏览该表 PHP 脚本 带分页 加载速度非常快 因为 表引擎是InnoDB因此SELECT COUNT 非常慢并且mysql num rows 不是一个选项 所以我将总行数 我用来
  • 最大化数组中成对距离的总和

    想象一个清单 e1 e2 en 和一个函数f e1 e2 gt number返回常数时间内任意两个元素之间的距离 f e e 0 e1 e2 gt f e1 e2 gt 0 f e1 e2 lt f e1 e3 f e3 e2 目标是排列列
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • JavaScript:document.getElementById 性能缓慢?

    我反复使用document getElementById很多关于commonCSS 元素 如果我创建一个global array存储我所有的document getElementById元素而不是每次重新获取元素 示例 而不是 docume
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use

随机推荐