|期刊分享|计算机视觉|适用于VI-SLAM的百度ICE-BA算法
bigegpt 2024-10-12 05:36 9 浏览
编者序:本文是百度刚刚开源的视觉惯性SLAM算法中用到的优化算法,文章发表在CVPR-2018上,作者也包括浙大张国锋老师。后端优化耗时限制了SLAM在移动设备中的应用,百度改进的BA算法,将运算速度提高了一个数量级,工程性很强,在估计性能上略优于state-of-the-art,可融合在各种滑窗SLAM算法中使用。
推荐指数 ☆☆☆☆☆☆☆
1 引言
SLAM在很多应用中都是一个经典但需要继续研究的问题,由于大量的图像和惯性传感器的出现,近年来视觉惯性VI-SLAM在增强现实AR、无人机、无人车、机器人等领域广泛应用。类似于纯视觉SLAM,VI-SLAM提取并建立图像帧间的特征匹配,但是VI-SLAM进一步利用惯性测量作为运动估计的约束,惯性测量在快速和不规则运动的估计中尤其有效,而这正是视觉特征匹配面临挑战的地方。假如运算能力足够大,state-of-the-art VI-SLAM算法的6DOF估计精度非常高。
由于大部分的SLAM应用是移动和实时性要求比较高的场景,VI-SLAM的计算复杂度也引起了学者们很大注意,只有很少一部分VI-SLAM系统能够在嵌入式设备上运行,提高计算效率是进一步应用的关键因素。在VI-SLAM中有两个主要运算任务:前端和求解器。前端包括视觉特征提取和匹配,一般并行性很好,可以使用各种现在的计算架构高效完成。求解器目标是优化位姿参数,通过给定一系列视觉特征和惯性测量后最小化目标函数实现,求解器优化常常是VI-SLAM算法速度的瓶颈。
大部分VI-SLAM框架使用传统的数值求解器优化目标函数,如视觉BA。本文将BA推广为联合优化视觉和惯性测量。常规的高斯牛顿法或LM求解器设计目标是提供数值精确结果,并没有考虑实时性。因此,目前基于这些求解器的实时VI-SLAM算法仅能够使用最近很小的滑窗估计位姿。理论上,长时间测量能够提供估计精度,BA的效率是VI-SLAM算法性能的主要因素。
我们改进了VI-SLAM中BA处理部分,显著提高了局部和全局优化效率,并解决了闭环检测的一致性问题。在SLAM中,视觉和惯性测量顺序到来,我们高效的使用以前优化的中间结果避免新的冗余计算。我们的一般算法明显提高了求解速度,能够应用于大部分基于滑窗的VI-SLAM中。
此外,本文算法解决了全局一致性问题,这对AR等应用至关重要。如果可以很好地闭环并且重投影误差足够小,则认为全局地图具有一致性。对于视觉SLAM来讲,全局一致性可以通过全局BA或位姿图近似实现;而VI-SLAM问题更复杂,帧间速度约束和IMU偏差使得优化问题有很多局部最小值。当测量从滑动窗口中去除时,边缘化累积误差会与闭环约束冲突。以前的方法或者跳过边缘化(如VI-ORB-SLAM2),或者不考虑冲突直接边缘化(如VINS)。
本文主要贡献如下:(1)提出了一种新的滑窗优化算法,改变了SLAM测量的增量本性,获得比state-of-the-art算法10倍效率的提升;(2)提出了一种新的相对边缘化算法,解决了滑窗边缘化偏差和全局闭环检测约束直接的冲突;(3)开源了本文算法。
2 相关工作
早期SLAM大部分是基于EKF的,6DOF运动参数和3D路标在一个状态向量中用概率表示,运算复杂度随路标个数二次增长。
视觉SLAM仅使用视觉特征解决SLAM问题,通过仔细提取并匹配大量精致的视觉特征,能够提供较高跟踪精度。
视觉惯性SLAM一般不需要数量特别大的图像特征以便达到合理精度,因为惯性测量提供了额外约束。MSCKF等在EKF SLAM基础上,从状态向量中去除了3D路标,能够在状态中建模多帧;然而与EKF算法类似,它们仅能够维护最新状态,从而对测量噪声敏感,很难从不稳定跟踪状态中恢复。VINS-MONO等算法使用滑动窗口选择最近视觉和惯性测量优化目标函数,很多情况下滑窗VI-SLAM比基于滤波的算法更稳健、更精确。然而目标函数优化运算量非常大,滑窗VI-SLAM高度依赖于运算能力,在移动设备应用中很受限。本文提出的算法可以显著提高优化求解效率。
很多SLAM算法优化求解部分使用通用的实现方式,尽管它们前端和框架直接区别很大。时间SLAM的BA利用了重投影函数的稀疏性结构和Hessian。本文将BA扩展至联合优化视觉和惯性测量。一些学者提高了大尺度配置时的BA,Jeong等人指出分块PCG(preconditioned conjugate gradient)算法能够用于解决Schur补空间以提高效率。ceres和g2o中很好的工程实现了BA,并且应用于state-of-the-art SLAM系统中。然而所有这些方法都有一个缺点:复杂度随图像帧数二次增长,因此基于这些求解器的SLAM系统仅仅能够使用非常有限的测量,以便实现实时位姿估计。
增量求解器试图利用以前的优化结果降低新计算的运算量。iSAM2通过测量矩阵QR分解进行优化。每次迭代仅仅更新很小一部分分解结果而不是分解整个图。SLAM++增量恢复估计和方差,在BA中增量更新Schur补空间。然而上述算法仅适用于解决稀疏相机问题(大部分关键点仅仅在很少帧中可见),这符合大规模SfM问题,但在SLAM问题中,局部滑动窗口内的大部分帧共视很大部分的关键点,从而使得上述增量算法演变为常规BA求解器,因此定位精度并不能比其它的state-of-the-art SLAM算法好。本文提出的新的增量求解器,更好的利用了SLAM中的块矩阵结构,在速度和精度上都有显著提升。此外,本文进一步讨论了局部BA的加速和全局一致性相对边缘化,提供了更多的实验结果。据我们所知,本文是第一次提出了VI-SLAM BA求解器,在达到stahe-of-the-art精度的同时,实现了前所未有的效率提升,同时保障了全局一致性。
6 评估
为了评估本文提出的优化求解器,构建了一个SLAM系统,前端检测Harris特征,使用光流进行帧间特征跟踪,双目帧间直接匹配特征;闭环检测使用关键帧提取的词袋特征,一旦检测到闭环,使用匹配帧间的相对位姿和方差作为全局BA的相对约束。
使用EuRoC数据集进行定量评估,并与Google Tango进行对比。滑窗大小设为50,更大的滑窗增加不了精度还降低了效率。
定位精度对比如下表所示,OKVIS和SVO都是VIO,iSAM2使用与本文相同的特征跟踪,没有闭环。为公平起见,我们给出了本文算法带闭环检测和不带闭环检测的结果。不带闭环检测时,本文算法精度已经比state-of-the-art好,因为滑窗使用了50帧;带闭环检测时,相对约束使得本文算法RMSE明显降低。
在Intel i7 CPU上不同求解器耗时如下表所示,禁用了多线程,并且不包含前端处理。OKVIS滑动窗口使用5个关键帧和3个IMU帧,本文算法使用50帧情况下仍达到10倍加速。SVO的优化时间并不能直接测量,我们将我们系统前端结果输入到iSAM2估计SVO优化耗时。iSAM2是SVO使用的优化求解器,也是state-of-the-art增量求解器。我们也测试了使用g2o的ORB-SLAM优化时间,远远慢于我们的算法,一个原因在于ORB-SLAM需要更多的特征才能文件跟踪,如果将特征数从默认的1200降为490,ORB-SLAM在3个数据集上会跟踪失败。
在oct-core ARM CPU(4个A9和4个A15),单线程运行模式,本文算法在不带闭环和带闭环时,局部BA和全局BA耗时分别为12.18ms、78.14ms和193.72ms,因此具备应用在移动低功耗设备上的潜力。
Tango是稳健性和精度高度优化的运动跟踪商业设备,本文双目SLAM与Tango Phab 2对比结果如下图所示。不带闭环检测时,本文系统轨迹和Tango相比拟,尺度比它更精确;带闭环检测时,一致性比Tango更好。
英文名称:ICE-BA: Incremental, Consistent and Efficient Bundle Adjustment for Visual-Inertial SLAM
源码:https://github.com/baidu/ICE-BA
本公众号专注于提供计算机视觉、机器学习、深度学习、智能传感器技术等人工智能、机器人、无人车、无人机相关领域省时的知识转述,敬请各位看官关注、评论、转发、分享。
关注该公众号,一起创造奇迹。
相关推荐
- 当Frida来“敲”门(frida是什么)
-
0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...
- 服务端性能测试实战3-性能测试脚本开发
-
前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
-
今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...
- Linux和Windows下:Python Crypto模块安装方式区别
-
一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...
- Python 3 加密简介(python des加密解密)
-
Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...
- 怎样从零开始编译一个魔兽世界开源服务端Windows
-
第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...
- 附1-Conda部署安装及基本使用(conda安装教程)
-
Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...
- 如何配置全世界最小的 MySQL 服务器
-
配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...
- 如何使用Github Action来自动化编译PolarDB-PG数据库
-
随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
-
订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...
- 信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要
-
问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...
- OpenSSH 安全漏洞,修补操作一手掌握
-
1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...
- Linux:lsof命令详解(linux lsof命令详解)
-
介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...
- 幻隐说固态第一期:固态硬盘接口类别
-
前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...
- 新品轰炸 影驰SSD多款产品登Computex
-
分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...
- 一周热门
- 最近发表
-
- 当Frida来“敲”门(frida是什么)
- 服务端性能测试实战3-性能测试脚本开发
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
- Linux和Windows下:Python Crypto模块安装方式区别
- Python 3 加密简介(python des加密解密)
- 怎样从零开始编译一个魔兽世界开源服务端Windows
- 附1-Conda部署安装及基本使用(conda安装教程)
- 如何配置全世界最小的 MySQL 服务器
- 如何使用Github Action来自动化编译PolarDB-PG数据库
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)