【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 的相关文章

  • 使用嵌套字典Python的自定义类

    当使用相同的键在嵌套字典中添加值时遇到问题 并且该值始终显示相同的值 事实是 我想更新值事件 键是相同的 该算法是人工鱼群算法的基础 example gt gt fish template 0 weight 3 1 visual 2 ste
  • x >= 0 比 x > -1 更有效吗?

    在 C 中与 int 进行比较是x gt 0比更有效率x gt 1 简短的回答 不 更长的答案提供一些教育见解 这完全取决于您的编译器 尽管我打赌每个理智的编译器都会为这两个表达式创建相同的代码 示例代码 int func ge0 int
  • 优化子查询选择每组最后一条记录

    我有这个查询 它是一个依赖查询并且需要很多执行时间 SELECT u id u user name ifnull select longitude from map where user id u id order by map id de
  • 使用 Django 的 ORM 加速批量插入?

    我计划使用 django 的 ORM 将从约 750 个文件 每个约 250MB 中获取的 10 亿条记录上传到数据库 目前每个文件需要大约 20 分钟来处理 我想知道是否有任何方法可以加速这个过程 我采取了以下措施 使用 transact
  • 在服务器中实现自动完成的最佳方法是什么?

    这个问题很容易让人知道 让 Web 应用程序的客户端自动完成变得漂亮很简单 有很多插件 但是 在后端 在服务器端 最好的方法是什么 我不喜欢用户每次按下按键就访问数据库的想法 我一直在考虑 sphinx 或者一些与您的网站并行运行的全文搜索
  • 针对 PyPy 进行优化

    这是后续PyPy 的统计分析器 https stackoverflow com questions 17346226 statistical profiler for pypy 我正在 PyPy 下运行一些 Python 代码 并希望对其进
  • R:tuneRF 函数的行为不明确(randomForest 包)

    我对这句话的含义感到不舒服stepFactor的参数tuneRF http www inside r org packages cran randomForest docs tuneRF函数用于调整mtry进一步使用的参数randomFor
  • 向循环中添加代码如何使其速度更快?

    我有一个带有内部循环的简单函数 它缩放输入值 在查找表中查找输出值 并将其复制到目的地 ftol ambient是我从网上复制的一个技巧 用于将float快速转换为int for i 0 i lt iCount i iScaled ftol
  • 超级丑陋的数字

    所以问题是 编写一个程序来查找第 n 个超级丑数 超级丑数是正数 其所有素数因子都在给定素数列表中 大小为 k 的素数 例如 1 2 4 7 8 13 14 16 19 26 28 32 是给定素数的前 12 个超级丑数的序列 2 7 13
  • winkler的Python性能改进请求

    我是一个 python n00b 我想要一些关于如何改进算法的建议 以提高计算两个名字的 Jaro Winkler 距离的方法的性能 def winklerCompareP str1 str2 Return approximate stri
  • php microtime() 格式值

    PHP microtime 返回如下内容 0 56876200 1385731177 that s msec sec 我需要这种格式的值 1385731177056876200 this is sec msec without space
  • 我可以在 Rust 中有效地按值返回对象吗?

    我想用函数初始化一个大对象 目前我有 fn initialize mydata mut Vec
  • 在 .NET 中,mystring.Length == 0 或 mystring == string.Empty 哪个最好? [复制]

    这个问题在这里已经有答案了 可能的重复 检查字符串内容 字符串长度与空字符串 https stackoverflow com questions 10230 checking for string contents string lengt
  • 如何使用 UIImagePickerController 呈现 ViewController

    我试图提出一个ImagePicker 然后在用户选择图像后 呈现图像编辑ViewController用户可以在其中操作图像 然后将编辑后的图像发送回原始图像ViewController 问题 是否有一种标准或最佳实践方法从初始 ViewCo
  • 比较字符串结尾的最佳方法是使用 RIGHT、LIKE 还是其他?

    我需要将字符串的结尾与存储过程中可能的结尾列表进行比较 会被叫很多 大概有10 15个候选结局 此时 仅使用代码的解决方案比创建专用于此的表更好 类似的东西 IF ENDSWITH var foo OR ENDSWITH var bar O
  • 了解 Tensorflow 中的 while 循环

    我正在使用用于 Tensorflow 的 Python API https www tensorflow org api docs python 我正在努力实施罗森布罗克函数 https www sfu ca ssurjano rosen
  • 读取 CSV 文件单列的更快方法

    我正在尝试阅读一个列CSV文件至R尽快 我希望将标准方法将列放入 RAM 所需的时间减少 10 倍 我的动机是什么 我有两个文件 一个叫Main csv这是 300000 行和 500 列 其中一个称为Second csv即 300000
  • 取消的分支与常规分支有何不同?

    特别是对于 SPARC Assembly 取消的分支与常规分支有何不同 我一直认为 当我需要填充分支指令的 nop 延迟槽时 需要取消分支指令 但是 我认为我在这一部分上是不正确的 因为您可以在不取消分支的情况下填充 nop 如果不采用分支
  • 我应该如何优化这个文件系统 I/O 绑定程序?

    我有一个 python 程序 它执行如下操作 从 csv 文件中读取一行 对其进行一些变换 将其分解为实际的行 因为它们将被写入数据库 将这些行写入单独的 csv 文件 除非文件已完全读取 否则返回步骤 1 运行 SQL Loader 并将
  • 快速分类(分箱)

    我有大量条目 每个条目都是浮点数 这些数据x可以通过迭代器访问 我需要使用像这样的选择对所有条目进行分类10

随机推荐