一起自学SLAM算法:10.2 VINS算法

news2024/9/22 19:33:36

连载文章,长期更新,欢迎关注:

不管是激光SLAM还是视觉SLAM,由于传感器采样率、传感器测量精度、主机计算力等因素的限制,在高速运动状态下定位追踪极易丢失。虽然轮式里程计能为激光SLAM系统提供短期运动预测以避免高速运动时丢失的风险,轮式里程计还能在长走廊这样的低特征环境下提供定位辅助。但是轮式里程计也不是万能的,当地面起伏较大或轮子打滑时,轮式里程计将不再可靠;对于在三维空间工作的视觉SLAM来说,提供二维空间定位信息的轮式里程计很难应用其中。而在高速运动(尤其是高速旋转)或特征严重缺失(比如白墙、天空、地面等场景)时视觉SLAM基本上无法工作。采用IMU进行融合,无疑成了解决这些棘手问题的香饽饽。

关于IMU数据融合的问题,大体上又分为内部融合和外部融合两种,如表10-3所示。所谓内部融合,就是利用IMU模块内部各个轴的数据(acc、gyro、mag)进行姿态融合(也叫数据滤波),求解出IMU模块在空间中的姿态角(roll、pitch、yaw),在4.1.5节中已经给出了用于姿态融合的几种常用滤波算法,即卡尔曼滤波和互补滤波。通过内参标定,能大大提高IMU原始测量数据的精度,而姿态融合过程不仅能解算出姿态角,还能进一步修正IMU原始测量数据。而外部融合,是将IMU数据与其他传感器(比如轮式里程计(odom)、视觉(camera)、激光雷达(lidar)、GPS等)的数据进行融合。在外部融合过程中,既可以使用仅经过内参标定校正后的IMU原始测量数据(acc、gyro或acc、gyro、mag)也可以使用经姿态融合后得到的姿态角(roll、pitch、yaw)及IMU原始测量数据(acc、gyro或acc、gyro、mag),然后将IMU与其他传感器建立松/紧耦合联系,当然需要对IMU与其他传感器的安装坐标关系(也就是外参)进行标定,最后进行位姿估计实现定位追踪。物体在三维空间的状态可以由空间位姿(姿态角和位置)、线速度、线加速度、角速度、角加速度等描述,由于这里不涉及物体运动学问题,仅讨论空间姿态。内部融合只求出了空间姿态的姿态角orientation(roll,pitch,yaw)分量,也就是模块在空间的朝向。有些朋友可能会说,利用加速度和角速度积分不就能求出位移量,这样不就求出了空间姿态的位置position(x,y,z)分量了。这样做确实是可以的,但是IMU测量数据严重的长期漂移问题,求解出的位置很难用于像机器人这样需要大规模全局定位的场景。既然通过IMU测量数据本身无法提供可靠的位姿估计,那么就需要引入额外的传感器测量数据,也就是外部融合。在条件允许的情况下,配备越多的传感器理论上讲越有利于位姿估计,但是系统设计难度也更困难,本节重点讨论比较流行的一种融合方案(IMU与视觉融合,即VIO)。当然IMU还有很多其他用途,比如机器人上下坡判断(这对于单线激光雷达正确分割出地面很重要)、激光雷达运动畸变校正、机器人实时运动操控(IMU能提供机器人高实时性的加速度、角速度、线速度等运动信息,这些高实时的反馈数据能让机器人运动操控更加精确,这对于后面自主导航中路径规划和轨迹跟踪控制很重要)等。

表10-3  IMU数据融合

其实前面已经讨论过的Cartographer、ORB-SLAM3和RTABMAP都已经支持IMU融合,当然专门针对VIO开发出来的框架(比如MSCKF、OKVIS、ROVIO等)也已发展多年,不过本节要介绍的VINS是众多同类算法中比较优秀的一个,并且VINS的亮点都体现在IMU融合这个点上,鉴于此拿来进行分析学习。下面将从原理分析、源码解读和安装与运行这3个方面展开讲解VINS算法。

10.2.1 VINS原理分析

VINS算法是IMU与视觉融合的典型代表,融合首先要讨论的就是各个传感器的标定问题,其次是传感器数据的融合方式(也就是耦合),最后结合论文[3,4]对VINS系统框架展开具体分析。

1.标定

这里主要讨论IMU和单目相机的数据融合,在数据融合前需要先对传感器的内参和外参进行标定,标定结果的好坏对融合精度至关重要,下面具体讨论。

(1)IMU内参标定

由于制造工艺的误差,IMU模块内部会存在轴偏差、尺度偏差、零偏等问题。通过对IMU建立数学模型,并对模型中的误差项进行校准,能大大提高IMU原始测量数据的精度。常见的误差模型,如式(4-1)所示,具体标定过程见4.1.3节。

(2)单目相机内参标定

同样,由于制造工艺的误差,单目相机内部也存在各种误差。对于小孔成像模型的相机,需要对焦距和光心进行标定,有时也需要对畸变进行标定,其误差模型如式(4-110)和(4-111)所示,具体标定过程见4.3.1节。

(3)IMU与单目相机外参标定

关于IMU与单目相机外参标定,分为离线标定和在线标定两种。所谓离线标定,就是采集传感器的数据后离线进行处理求出待标定外参数,其中较常用的一个标定工具是kalibr。下面就以kalibr为例,简单介绍一下IMU与单目相机外参的离线标定过程,如图10-19所示。

图10-19  离线外参标定

其中,固定在环境中的标定板以世界坐标系O_{w}为参考,而相机坐标系O_{c}与世界坐标系O_{w}之间的转移关系T_{w,c}(k)其实就是相机在世界坐标系的位姿,该位姿可以通过标定板上的角点到相机像素点之间的3D-2D投影关系求解。求解出来的相机位姿T_{w,c}(k)是离散的,而相机实际的运动轨迹显然是连续的,通过样条曲线(这里用的是B-spline)很容易从相机的离散位姿点得到连续轨迹T_{w,c}(t)。由于相机与IMU之间的转移关系是固定的常量T_{c,i},在相机运动轨迹T_{w,c}(t)叠加上这个固定转移关系T_{c,i}就得到了IMU运动轨迹T_{w,i}(t)。将T_{w,i}(t)中的平移分量对时间进行两次求导就得到了IMU运动时的加速度a(t),将T_{w,i}(t)中的旋转分量对时间求导就得到了IMU运动时的角速度\omega (t)。考虑到相机与IMU之间采样时间存在一定的延迟d,最后通过IMU的内参模型后就得到实际加速度测量值a(k)和角速度测量值\omega (k)。整个过程涉及到三个核心模型,如式(10-2)~(10-4)所示。

其中ua(k)\omega (k)均为从传感器得到的观测量,u是相机观测到的像素, a(k)\omega (k)为IMU观测到的加速度和角速度。F_{cam}是相机内参模型,包含焦距、光心和畸变参数;F_{imu}是IMU内参模型,包含轴偏差、尺度偏差和零偏参数。三个模型的重投影误差分别用e_{u}e_{a}e_{\omega }表示,通过最小化重投影误差即可求出模型内参F_{cam}F_{imu}、外参T_{c,i}以及相机与IMU之间的时间延迟d,如式(10-5)所示。

可以发现用kalibr进行标定时,不仅求出了外参T_{c,i}和延迟d,还对内参F_{cam} 和F_{imu}进行了优化改善。有关kalibr外参标定方面的详细原理,请参考原论文[5]。

每次运行算法之前都要对传感器进行标定,然后手动将标定参数载入系统,这样很麻烦,并且对模型参数容易变化的时候,离线标定就不好用了,这就要提到在线标定了。所谓在线标定,就是在系统运行过程中标定程序自动采集数据并完成模型参数标定,这个过程不需要人为干预,因此也叫自动标定。比如VINS中就集成了在线标定功能,具体原理可以参考论文[4]。

 (4)拓展

其实在机器人中涉及到各种标定问题,不仅限于上面的IMU与相机的标定。对于不同驱动形式的底盘(比如两轮差分、四轮差分、阿克曼、全向轮等),其轮式里程计的数学模型都不一样,要设计专门的标定方法对底盘进行标定。以两轮差分底盘为例,最常见的标定参数是动力系数和轴距,对于底盘中两个轮子差异较大的情况,两个轮子的动力系数还需要单独标定。当机器人搭载多个激光雷达时,需要对这些激光雷达的外参进行标定以保证数据能够正确融合在一起。对于配备有超声波测距的机器人,需要对超声波测距仪与其他传感器之间的外参进行标定。不管是何种传感器,标定方法同上面IMU与相机之间标定思路类似,都是从传感器中采集观测数据并利用其中的某些内在约束对标定参数进行建模并求解。标定对于多传感器融合算法来说既是重点也是难点,需要特别注意。

2.融合

通过第7章的介绍,我们已经知道SLAM问题其实就是利用观测数据对机器人位姿和路标进行估计的状态估计问题。而如何构建出观测量与待估量之间的约束关系就至关重要,接着就是求解该状态估计问题。众所周知,求解方法分为滤波方法和优化方法两大派别。当只用单传感器提供观测时,直接将观测送入滤波器(比如EKF)或优化器(比如PoseGraph)求解机器人位姿和路标即可。而当有多个传感器同时提供观测时,需要先考虑各个观测数据之间的融合问题,然后再送入滤波器或优化器求解机器人位姿和路标。关于融合方式,可以分为松耦合和紧耦合两种。这样的话,多传感器融合的SLAM问题就可以分为4种情况,以下主要讨论IMU和视觉两种传感器融合的SLAM问题,常见的一些方案如表10-4所示。

表10-4  常见的Visual-IMU融合SLAM方案

Visual-IMU

SLAM

滤波方法

优化方法

松耦合

ssf

msf

-

紧耦合

MSCKF

ROVIO

OKVIS

ORB-SLAM3

VINS

(1)松耦合

对于滤波方法的松耦合,比较典型的方案有ssf和msf。所谓松耦合,就是图像先通过单独的估计模块(black box)处理得到视觉里程计(VO),然后再将VO和IMU组合成一个状态向量送入滤波器(EKF)进行更新,如图10-20所示。

 

图10-20  滤波方法的松耦合方式(左图和右图)

而对于优化方法的松耦合,这方面的研究并不多,主要原因是效果不如紧耦合好。论文[7]提出过一种优化方法的松耦合方案,感兴趣的读者可以了解一下,如图10-21所示。其实也是图像先通过单独的估计模块处理得到视觉里程计(VO),那么两帧相机的位姿转移量利用相机与IMU的外参很容易变换为IMU的位姿转移量,最后将这个IMU的位姿转移量与IMU其他约束量一起在IMU框架下进行优化求解。

图10-21  优化方法的松耦合方式

(2)紧耦合

对于滤波方法的紧耦合,比较典型的方案有MSCKF[8]和ROVIO[9]。所谓紧耦合,就是图像中提取出来的路标特征点直接作为观测数据与IMU观测数据一起送入滤波器(EKF)进行更新,如图10-22所示。

 图10-22  滤波方法的紧耦合方式

而对于优化方法的紧耦合是当前研究的热点,比较典型的方案有OKVIS[10]、ORB-SLAM3[11]和VINS[3]。对于基于优化的纯视觉SLAM问题,机器人位姿和路标作为待估计量由图结构中的节点表示,观测约束由图结构中的边表示,最后利用所有约束进行优化求解;而当IMU紧耦合到视觉SLAM时,同样机器人位姿和路标作为待估计量由图结构中的节点表示,只是观测约束边除了由视觉提供外还由IMU提供,同样最后利用所有约束进行优化求解,如图10-23所示。

 图10-23  优化方法的紧耦合方式

(3)松耦合与紧耦合对比

在基于滤波方法的SLAM中,待估计量(机器人位姿和路标)用一个状态向量来描述,然后滤波器(比如EKF)利用观测数据(视觉和IMU)对待估状态向量进行迭代更新。对于松耦合的情况,视觉图像先通过单独模块处理得到VO,然后再将VO与IMU送入滤波器用于状态更新;而对于紧耦合的情况,视觉特征点与IMU直接就送入滤波器用于状态更新。不难发现,图像特征点在经过单独模块处理得到VO后,VO数据维度相比原始图像特征点要小很多,但会引入额外误差。也就是说松耦合比紧耦合的计算复杂度低,而紧耦合比松耦合的精度高。

在基于优化方法的SLAM中,待估计量(机器人位姿和路标)用图结构中的节点描述,而观测数据(视觉和IMU)提供节点之间的边约束,最后利用所有约束进行优化求解。对于松耦合的情况,视觉图像也是先通过单独模块处理得到VO,然后再利用VO约束和IMU约束进行优化求解;而对于紧耦合的情况,视觉图像特征观测约束与IMU约束用于构建一个整体的图结构,然后对这个整体约束进行优化求解。不难发现,松耦合计算复杂度更低,并且更易于进行多系统融合。所谓多系统融合,比如同时将多个独立运行的SLAM系统的VO约束提取出来进行松耦合,然后在构建出的新约束中优化求解新VO,这样就能在不重构原有SLAM的代码的情况下轻易融合众多优秀SLAM算法。而紧耦合完全保留了原始观测数据提供的约束信息,融合结果的精度显然更高。

3.VINS系统框架

根据上面的介绍,已经知道基于优化的紧耦合方案的融合精度是最高的,而VINS正是基于优化的紧耦合方案的典型代表。到这里就可以分析VINS的系统框架了,结合算法原作者清晰的论文思路[3],很容易理解整个算法的组成架构。VINS有多个版本,最初的版本为VINS-Mono,仅支持IMU和单目;后来的版本VINS-Fusion在VINS-Mono的基础上进行了扩展,增加了对双目的支持;而VINS-Mono还专门被移植到手机,也就是版本VINS-Mobile。不过只要掌握了VINS-Mono的原理,其他版本很容易上手。如图10-24所示,为VINS-Mono系统框架。系统架构非常清晰,由观测预处理模块(Measurement Preprocessing)、初始化模块(Initialization)、VIO融合模块(Local Visual-inertial Odometry with Relocalization)和全局优化模块(Global Pose Graph Optimization and Reuse)构成,下面展开进一步的分析。

 图10-24  VINS-Mono系统框架

(1)观测预处理模块

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

(2)初始化模块

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

(3)VIO融合模块

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

(4)全局优化模块

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

10.2.2 VINS源码解读

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

10.2.3 VINS安装与运行

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

参考文献

【1】 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一次ubuntu进入不了界面的恢复记录

能说服一个人的从来不是道理,而是南墙;能点醒一个人的从来不是说教,而是磨难 一、问题描述 1、 卸载Python之后,ubuntu启动进入黑屏tty界面无法联网,无法进入桌面 2、 进入到界面之后没有网络,网络中或者右…

【分析向】没有三级缓存会导致什么?

通过上篇(【实践向】当移除了三级缓存…… )的实践,我们得出的结论是:如果不存在代理对象,二级缓存就可以解决循环依赖性的问题,但是当存在代理对象的时候,二级缓存则无法完全解决循环依赖&…

机器自动翻译古文拼音 - 十大宋词 - ALL

机器自动翻译古文拼音 - 十大宋词 - 雨霖铃寒蝉凄切 柳永https://mp.csdn.net/mp_blog/creation/editor/128779245机器自动翻译古文拼音 - 十大宋词 - 江城子乙卯正月二十日夜记梦 苏轼https://mp.csdn.net/mp_blog/creation/editor/128779156机器自动翻译古文拼音 - 十大宋词 …

0基础小白十分钟入门人工智能强化学习(附有实战源码)

强化学习概述 1.1 强化学习的学习任务目标 强化学习(Reinforcement Learning, RL),用官话讲,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成…

Mybatis-Plus 乐观锁与代码生成器

目录 乐观锁 问题引入 乐观锁实现思路 实现步骤 代码生成器 代码生成器分析 代码生成器实现 乐观锁 问题引入 业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售,为了能保证每个商品或者票只能被一个人购买,如何保证不会出现超买或者重复…

记一次nginx崩溃事件

一、事件描述 2023年春节复工第一天,项目组同事反馈说业务系统中图像处理代理Nginx服务于1月23日发生崩溃,完成了重启操作,检查nginx的日志有如下报错: 2023/01/23 11:07:07 [crit] 3237#3237: *2253009 pwritev() "/var/c…

网络编程-----(Socket编程TCP)

在咱们的TCP API中,也是主要是涉及到两个类: 1)ServerSocket:主要是给TCP服务器来进行使用的; 2)Socket:我们既需要给客户端来进行使用,也需要给服务器来进行使用; 这样就是说我们是不需要使用专门的类来进行表示传输的包&#x…

Java学习之抽象模板模式

目录 一、基本介绍 二、模板设计模式能解决的问题 三、最佳实践 一、AA类 二、BB类 三、main方法实现 四、提取相同语句 五、建立继承关系 父类-Template 子类-AA类 子类-BB类 六、运行中的动态绑定机制 一、基本介绍 抽象类体现的就是一种模板模式的设计&#xff…

【Git】概述

目录 1.1 是什么 介绍 历史时间轴 版本控制工具 1.2 能干嘛 作用 Git工作机制 代码托管中心 集中式版本控制系统 分布式版本控制系统 1.3 去哪下 命令行工具:Git for windows 操作系统中可视化工具:TortoiseGit(了解) GitHub网站 1.1 是什…

带你走进Java8新特性Stream流的小世界

目录 一. 什么是流(Stream) 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 s…

智公网:2023年教师编必背30考点

1、制度化教育阶段开始于:近代。 2、各国的学校教育系统基本形成于:19世纪末。 3、现在世界上大多数国家的义务教育年限在:9年或9年以上。 4、“不愤不启,不悱不发”启发教学法的最早倡导者是:孔子。 5、“建国君民…

【Spring】Spring 6 新特性一一HTTP Interface

简介 Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。 这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求…

硬盘损坏数据恢复怎么操作?恢复数据的常用方法

硬盘一般固定在电脑里面的存储装置,里面保存着我们大量的数据。随着电脑的使用越加广泛,有时不免出现一些问题,比如硬盘在使用过程中出现数据错误,或者是硬盘的内部零件出现故障。出现这些问题,硬盘损坏数据恢复怎么操…

Redis实现UV统计 | 黑马点评

一、HyperLogLog 1、为什么用HyperLogLog 先介绍两个概念: UV:全称 Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人、1 天内同一个用户多次访问该网站,只记录 1 次。PV:全称 …

车载以太网 - SomeIP测试专栏 - 总纲

关于车载以太网中的SomeIP在网上也逐渐有越来越多的资料,讲的也是非常好;但是个人认为讲的泛,很难让初学者或者初入门者真正了解SomeIP到底是一个什么东西,以及它究竟在车载上有什么作用,本专栏会由浅入深的讲解SomeIP整个协议内容规范,并且对Tc8中SomeIP相关的协议测试用…

实习日记!

目录 http://localhost:5789实习第三天 接下来几天的target 实习第四天 Git的操作 实习第五天 12月5日-Mon 12月6日 12月9日 12月12日 12月15日 useState() hook 12月16日 useEffect() hook async 函数 异步编程 回调函数 12月17日 C#中的?&#x…

postgresql源码学习(54)—— HotStandby从库必须设置大于等于主库的参数

新的一篇本来计划研究lazy_scan_heap函数,但过于复杂还没研究出来… 下午做题遇到一个这样的问题,之前没太关注过,打算学习学习,避免主从配置踩坑。 题干搜一搜,没搜出啥有用的玩意…渣翻成英文搜一搜,搜出…

windows搭建go语言开发环境,IDEA安装go插件并运行Hello world代码

2023年1月27日1.Windows上安装Go语言开发包参考链接:http://c.biancheng.net/view/3992.html1.1.下载Go语言开发包可以在Go语言官网 (https://golang.google.cn/dl/) 下载Windows 系统下的Go语言开发包,如下图所示。这里我们下载的…

学习Docker就应该掌握的dockerfile语法与指令

在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。Docker commitDocker commit一般用做从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dockerfile来完成。docker commit 容…

Git场景分析

当前的开发环境如下,我们每个人都对这个项目已经开发一段时间,接下来我们要切换成团队开发模式。 也就是我们由一个团队来完成这个项目实战的内容。团队有组长和若干组员组成(组长就是开发中的项目经理)。 练习场景如下: 1.由组长&#xff0…