用于自动驾驶车辆视觉定位的地图存储:ORB-SLAM2的一种拓展
用于自动驾驶车辆视觉定位的地图存储:ORB-SLAM2的一种拓展
Persistent Map Saving for Visual Localization for Autonomous Vehicles : An ORB-SLAM 2 Extension
摘要:
电动汽车和自动驾驶汽车是目前汽车领域的热门研究方向。这两个课题在实现车辆更安全和更环保的方向上是相互促进的。自动驾驶汽车的一个基本组成要素是构建环境地图并在地图上定位自己的能力。在本文中,我们使用一个双目视觉传感器来感知环境并创建地图。因为没有真值数据用作参考且误差会随着时间累积,所以SLAM存在错误定位的可能。因此,我们首先使用我们的ORB-SLAM2的拓展版本在汽车低速行驶的情况下构建并保存具有环境视觉特征的地图。在第二次运行时,我们重新加载地图,然后在之前构建的地图上定位。对构建好的地图进行加载和定位可以提高自动驾驶车辆的连续定位精度。此地图的保存功能是原始的ORB-SLAM 2所缺少的。
我们使用KITTI数据集的场景来评估已建成SLAM地图的定位精度。此外,我们用自己的小型电动模型车记录的数据对构建的地图进行了定位精度测试。测试结果表明,在特征丰富的环境中,对于直线速度平均为36 m/s行驶的车辆而言,定位的相对平移误差可以保持在1%以下。与完全SLAM相比,该定位模式拥有更好的定位精度和更低的计算负荷。我们对ORB-SLAM2拓展的源代码将在以下网址公开:[https://github.com/TUMFTM/orbslam map-saving-extension](https://github.com/TUMFTM/orbslam map-saving-extension)
索引词:SLAM,定位,重定位,自动驾驶,地图,ORB-SLAM2
介绍
掌握自动驾驶技术对于汽车行业和学术界是一个持续性的挑战。为了导航的安全性,自动驾驶汽车需要建立一个环境的准确模型,并具备估计自身位置的能力。在这项工作中,我们的目标是实现在已经行驶过并建立地图的路径上准确定位车辆(在地图上的)位置的功能。作为应用程序的中间开发环节,它目前作为一种定位方法用于车辆比赛场景。在这些场景下,车辆需要能够精确定位自身位置的能力,保证其可以高速行驶。
使用全球导航卫星系统(GNSS)估计自主车辆的位置是一种有效的方法。然而,这些系统的精度是有限的。大气条件、信号反射和时钟误差都会产生噪声。实时动态(RTK)定位系统可以通过使用固定校正基站的校正信号来减少这些误差。但是,此类系统依赖于更多的基础设施,会带来额外的成本。
有别于GNSS或RTK的定位方式,汽车使用激光、相机和雷达传感器感知环境。基于这些传感器,我们可以计算出当前环境的地图模型。同时,车辆可以定位自身相对于此地图的位置(SLAM)。当这些局部地图被保存在一个固定的全球导航卫星系统(GNSS)中,行驶在已经建图区域上的车辆只需定位自己在上述地图中的位置,就可以得到自身的全球位置估计。在SLAM的过程中,错误的定位会导致地图的不连续,从而阻碍进一步的定位或重新定位。纯定位模式可以节省计算资源,并能够在发生错误定位时进行重定位。
下面,我们对ORB-SLAM2算法进行了改进,以适应这种只进行两阶段定位场景的需要。第一步,我们在低速行驶条件下使用SLAM创建了一个环境地图。第二步,我们加载地图并以更高的速度在地图上定位车辆。结果表明,这种纯定位策略可以有效降低计算量和定位误差。在第二节中,我们简要地介绍了相关的研究和我们所建立的算法。在第三节中,我们讨论了我们对于ORB-SLAM2的拓展工作。在第四节中,我们评估了我们的拓展版本在不同场景下的性能,并得出了我们的结论。
结论:
这篇文章通过增加地图保存功能对视觉SLAM系统进行了拓展。和原始的功能一样,此拓展版本依然可以使系统作为一种SLAM模块应用于车辆的低速驾驶场景中。此外,它可以作为定位模块应用于更快速的驾驶场景,输出一个整体上更加精确的轨迹估计(结果)。该系统是ORB-SLAM2的一个拓展版本,可以实现室外和室内环境的定位。实验结果表明,在特征丰富的场景中,此系统可以在36m/s的速度下实现精确的定位功能。
此系统的定位模块相较于SLAM模块占用更少的计算资源; 但特征计算和匹配功能要求(资源)较高。我们展示了这种方法在嵌入式CPU上的局限性。
此系统的定位能力在特征值较少的环境中表现并不好,比如KITTI的01序列。这对类似算法在特征相似的比赛场景中的应用提出了挑战。(针对这个问题,)许多新兴的方法使用深度学习技术生成的特征来提高SLAM的应用性。尽管这种方法是否能提高上述场景的定位精度仍是一个有待研究的问题。同时,与目前(主流)的视觉特征相比,这些**深度特征**可以在光照条件改变时发生更小的变化。这可以使地图的重定位功能**在不同的场景条件**下比如白天和晚上,依然能够实现。
研发和评估后的地图保存扩展模块提高了原始ORB-SLAM 2方法的功能性,并使其可以适用于许多新的场景,例如模型汽车的自动驾驶比赛的应用等
论文插图(/表格):
图1: ORB-SLAM2的定位(左)和完全SLAM(右)两种工作模式流程图。
图2 : 室外数据集的示例图像帧。ORB特征点的定位结果显示为绿色。
图3 : 室内数据集的示例图像帧。ORB特征点的定位结果显示为绿色。
表一 : TUM数据集中快速行驶和快速回放在不同速度下跟踪丢失(LT:Lost Track)情况的比较。
表二 : SLAM系统与真值数据的精度对比
(trel : 平均相对平移;rrel : 平均相对旋转; tabs : 绝对平移均方根误差)
图4 : KITTI序列09。轨迹真值(灰色虚线),8m/s行驶时的SLAM轨迹(蓝色)和20m/s行驶时的SLAM轨迹(黑色)。20m/s行驶时的SLAM轨迹与真值的偏离更大,并在红色标记的位置处定位失效。
表三 : 相对于地图的定位精度(trel: 平均相对平移;rrel : 平均相对旋转; tabs : 绝对平移均方根误差; LT:跟踪丢失; LTt,max : 丢失跟踪的最大连续时间)
图5 : KITTI序列09。轨迹真值(灰色),8m/s行驶时的SLAM轨迹(蓝色)和36m/s行驶时的SLAM轨迹(橙色)。SLAM和定位都与真值相近。
图6 : KITTI序列09。轨迹真值(灰色),8m/s行驶时的SLAM轨迹(蓝色)和36m/s行驶时的SLAM轨迹(橙色)。SLAM轨迹与真值有误差。定位和SLAM的轨迹一致
图7 : KITTI序列01。轨迹真值(灰色),10m/s行驶时的SLAM轨迹(蓝色)和36m/s行驶时的定位(橙色)。SLAM轨迹与真值有误差。定位与SLAM轨迹有一段曲线存在的额外的误差。
图8 : TUM数据集户外场景。SLAM轨迹(蓝色)和定位(橙色)。定位和SLAM轨迹相近
图9 : TUM数据集室内场景。SLAM轨迹(蓝色)和定位(橙色)。定位和SLAM轨迹相近。我们可以看到在两个轨迹中都存在漂移现象,因为测试用的轨迹是矩形的,但系统形成的轨迹并非如此。
表四 : 不同计算硬件下的定位精度
(LT:跟踪丢失; LTt,max : 丢失跟踪的最大连续时间)
- 纳税服务系统五(登陆与系统拦截)【配置系统、子系统首页、登陆与拦截】
- 纳税服务系统六(信息发布管理模块)【Ueditor、异步信息交互、抽取BaseService、条件查询、分页】
- 纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】
- Unikernel初体验
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合
- Kafka的生产者和消费者代码解析
- Caused by: java.lang.ClassNotFoundException: backtype.storm.topology.IRichSpout
- 作为完美主义者(强迫症)如何将linux的eth1网卡修改为eth0网卡
- 【入门篇】一个小白在Jetson TX2上安装caffe的踩坑之旅
- 【入门篇】Jetson TX2深度学习Inference初体验
- zeromq的安装,部署(号称最快的消息队列,消息中间件)
- OpenDaylight新建HelloWorld工程并集成版本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 让whoops帮我们告别ThinkPHP6的异常页面
- PHP实现文件上传操作和封装
- gearman中任务的优先级和返回状态实例分析
- php实现文件上传基本验证
- php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
- php使用fputcsv实现大数据的导出操作详解
- php的无刷新操作实现方法分析
- PHP实现创建一个RPC服务操作示例
- php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
- gearman管理工具GearmanManager的安装与php使用方法示例
- php 的多进程操作实践案例分析
- php 输出缓冲 Output Control用法实例详解
- PHP使用gearman进行异步的邮件或短信发送操作详解
- php多进程并发编程防止出现僵尸进程的方法分析
- php+ajax实现文件切割上传功能示例