0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍主流的VIO初始化方案

3D视觉工坊 来源:3DCV 2023-06-21 09:22 次阅读

4e16659a-0fbf-11ee-962d-dac502259ad0.png

视觉惯性融合技术应用于机器人自动驾驶方面。单目相机和低成本IMU成为最佳选择。因为VIO系统的高度非线性,初值对视觉惯性系统很重要,但很难获得精确的初始状态。VIO初始化的主要意义有:(1)对齐相机的世界坐标系和惯性系,因此需要估计重力方向(2)为后续的VIO算法提供较为准确的初始参数和状态(尺度、IMU bias、初始速度),使得算法可以快速稳定地进入正常运行阶段。良好的初始化对VIO算法的整体精度和鲁棒性至关重要。本文旨在介绍主流的VIO初始化方案

1 前言

目前的初始化方法分为松耦合(Vins-Mono、ORBSLAM3)和紧耦合方案(OpenVINS),松耦合方案用的较多,并且表现更好。从求解方法上,有滤波、图优化、闭式解三种方法。但是,滤波会很早将状态边缘化,会失去最优性。图优化由于计算复杂性高。大多数现有的初始化方法需要系统静止或已知初始状态。不能适应动态运动、空中初始化。闭合式解法缺乏传感器噪声模型。本文主要介绍基于VINS-Mono的松耦合方案。

2 问题概述

已知:(1)IMU 和图像时间戳已同步;(2)IMU 和相机外参数已知求解:尺度、图像帧的速度、重力方向、IMU bias

3 方法

3.1 进行单目结构重建(SFM),获得up-to-scale的相机姿态和特征点位置

设定一定长度的滑动窗口,它维护了几个空间分离的图像帧。空间帧由足够的视差的图像帧来选择。选择两帧具有足够特征视差的帧。然后使用五点法恢复这两帧之间的相对旋转和带尺度的平移。然后任意设置尺度,对这两帧中观察到的所有特征进行三角剖分。基于这些三角化特征,采用PnP方法估计窗口中其他帧的姿态。

4e241cd0-0fbf-11ee-962d-dac502259ad0.png

最后,应用全局BA最小化所有特征观测值的总重投影误差得到所有的帧姿态和特征位置。已知相机与IMU之间的外参数,则所有变量都可以从相机坐标系转换到IMU坐标系:

4e2be26c-0fbf-11ee-962d-dac502259ad0.png

s是未知的尺度。

3.2 对IMU测量进行预积分,得到IMU的相对运动约束

预积分公式为:

4e314b3a-0fbf-11ee-962d-dac502259ad0.png

分别表示相对位置、速度和旋转约束。可以看出,惯性测量通常被积分以形成与图像帧的初始位置和速度无关的相对运动约束。

3.3 视觉惯性对准

我们已经得到了视觉SFM和IMU预积分中获得了相机姿势。本节将介绍对齐这两个轨迹的方法。

陀螺仪bias标定

窗口中两个连续的图像帧bk和bk+1,我们有来自视觉结构的相对旋转以及来自IMU预积分的相对旋转约束。通过最小化两者之间的误差来估计陀螺仪的bias:

4e3c9512-0fbf-11ee-962d-dac502259ad0.png

注意每次更新bg,都要重新计算预积分量。上面第二个式子用到了快速更新预积分量的方法。

估计速度、重力方向和尺度参数。

重力方向估计并强制其模长等于已知值。即需要估计的变量有

4e42f9e8-0fbf-11ee-962d-dac502259ad0.png

4e4c4700-0fbf-11ee-962d-dac502259ad0.png

考虑预积分位置和速度相关的约束,IMU轨迹在相机坐标系c0下有:

4e51de4a-0fbf-11ee-962d-dac502259ad0.png

利用外参数,得到相机坐标系下的相机轨迹与预积分的关系:

4ef3593c-0fbf-11ee-962d-dac502259ad0.png

将待估计变量放到方程右边,有:

4efc12ca-0fbf-11ee-962d-dac502259ad0.png

其中,

4f0239ac-0fbf-11ee-962d-dac502259ad0.png

上式中,带尺度的相机位置和姿态已经通过视觉SFM获得。通过求解最小二乘问题:

4f0b7f80-0fbf-11ee-962d-dac502259ad0.png

可以得到视觉坐标系下的速度和重力矢量,以及尺度。视觉结构的平移分量将被缩放到米制单位。通过强制范数约束,估计的重力将经历另一轮的细化。

重力方向细化

上面的优化中,并没有约束重力的大小。通过约束重力矢量的大小,可以对前一步得到的重力矢量进行细化。在大多数情况下,重力矢量的大小是已知的。但是,如果我们直接将这个范数约束加入到上面的优化问题中,就会变得非线性,难以求解。在这里,VINS-Mono使用一种方法通过优化其切线空间上的二维误差状态来强制执行重力范数。

4f1406a0-0fbf-11ee-962d-dac502259ad0.png

上图表示重力方向参数化示意图。由于重力的大小是已知的,重力的自由度为2,我们可以在它的切空间上用两个变量来参数化重力。我们将重力参数化为:

4f1ce694-0fbf-11ee-962d-dac502259ad0.png

b1和b2是张成切平面的两个正交基。w1和w2分别是指向b1和b2的位移。我们可以用Gram-Schmidt过程(一种构造单位正交基的方法)很容易地求出b1、 b2的集合。这样,我们在其切空间上用两种状态重新参数化重力,然后将g替换为上式,也是线性形式。重新优化上面的最小二乘问题,迭代几次,直到g收敛。在细化重力矢量之后,我们根据重力矢量将所有变量从视觉坐标系旋转到世界坐标系(重力方向和Z轴平行的坐标系):

4f2600a8-0fbf-11ee-962d-dac502259ad0.png

4 结论

此时,初始化过程完成,这些变量将被输入到一个紧密耦合的非线性视觉惯性估计器,即VIO过程。还有几点需要解释:对于旋翼飞行器来说,直线运动或零加速度运动等简并运动是不可避免的。这时候在SFM窗口内的IMU测量可能无法使整个系统可见,我们可以通过检查初始化过程中的预积分的值来拒绝小的加速度运动,初始化过程只有在IMU测量中包含足够的激励时才开始。在初始化过程中,加速度偏差很难标定,因为加速度通常在小旋转下与重力耦合。因此该方法不涉及加速度bias的标定。忽略加速度偏差不会对初始化结果造成显著的负面影响,可以在VIO过程中引入,这里不做介绍。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    208

    文章

    27400

    浏览量

    202381
  • 陀螺仪
    +关注

    关注

    44

    文章

    743

    浏览量

    97891
  • IMU
    IMU
    +关注

    关注

    5

    文章

    278

    浏览量

    45400
  • 自动驾驶
    +关注

    关注

    776

    文章

    13243

    浏览量

    164121

原文标题:一文读懂复杂的VIO初始化

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CW32L083 RTC初始化设置

    介绍CW32L083的RTC初始化设置
    的头像 发表于 06-24 10:16 1134次阅读
    CW32L083 RTC<b class='flag-5'>初始化</b>设置

    求助SDIO WIFI模块初始化不稳定,有时候初始化不了

    最近遇到个问题WiFi模块有时候可以初始化,有时候初始化不成功。WIFI模块用的是正基的型号是AP6476。SDIO接口接到的CPU的电平值为3.3V。现在模块的第22引脚WL_VIO接的是3.3V
    发表于 07-14 11:18

    AD9364初始化问题及标准初始化流程?

    AD9364初始化好像不成功。能否请官方给出一个使用外部晶体(如33MHz),FDD的标准初始化例子。
    发表于 09-28 14:56

    端口初始化初始化中断

    目录PA9(TX),PA10(RX)1、端口初始化2、初始化外设3、初始化中断4、使能中断5、使能外设5、发送数据PA9(TX),PA10(RX)1、端口初始化1.开启PA时钟2.PA
    发表于 08-16 06:54

    初始化封装

    初始化封装您可以在 Mask Editor 的 Initialization 窗格中添加 MATLAB® 代码以初始化封装模块。Simulink® 将执行这些初始化命令以便在关键时刻(如模型加载
    发表于 08-27 07:17

    介绍HD-GR导航软件初始化过程

    介绍HD-GR导航软件初始化过程完成的主要处理。
    发表于 01-20 06:34

    EasyFlash+ulog自动初始化的问题与解决办法介绍

    ,这样不需要每次上电都设置一次调试等级。问题介绍移植成功EasyFlash+ulog以后,我直接就在main函数中初始化了EasyFlash,因为EasyFlash依赖FAL,因此也需要先初始化FAL
    发表于 05-31 15:23

    FPGA的ROM初始化问题讨论

    本文讨论FPGA的ROM初始化问题,详细介绍mit文件的创建与使用。利用FPGA实现的ROM只能认为器件处于用户状态时具备ROM功能。使用时不必要刻意划分,而ROM单元的初始化则是设计人员必须面
    发表于 02-08 14:24 5366次阅读
    FPGA的ROM<b class='flag-5'>初始化</b>问题讨论

    RDA1846S初始化设置

    RDA1846S初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 0次下载

    8259a初始化的步骤及代码介绍

    本文首先介绍了8259a工作初始化的步骤及程序,其次介绍了通过OCW对8259A进行操作方法,最后介绍了8259A初始化编程。
    的头像 发表于 05-23 14:24 2.9w次阅读
    8259a<b class='flag-5'>初始化</b>的步骤及代码<b class='flag-5'>介绍</b>

    8253初始化程序分享_8253应用案例

    本文首先介绍了8253概念及8253各通道的工作方式,其次详细介绍了8253初始化要求及编程,最后用一个例子介绍了8253的初始化程序。
    发表于 05-23 15:52 2.1w次阅读
    8253<b class='flag-5'>初始化</b>程序分享_8253应用案例

    在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决

    本文档的主要内容详细介绍的是在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决。
    发表于 08-20 17:31 0次下载
    在51平台下<b class='flag-5'>初始化</b>文件的引入导致全局变量无法<b class='flag-5'>初始化</b>的问题如何解决

    初始化相关的重要寄存器介绍

    在上例中,介绍了配置OV5640所需的SCCB时序,以及具体的实现。本例将介绍初始化相关的重要寄存器,以及上电时序。
    的头像 发表于 10-18 09:18 1446次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形化编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化方法。 创建新项目: 在LabV
    的头像 发表于 12-28 17:24 1563次阅读

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 423次阅读