简化可视SLAM应用程序的开发
简化可视SLAM应用程序的开发
Easing the development of visual SLAM applications
同步定位和映射(SLAM)描述了一个设备(如机器人)使用传感器数据构建其周围环境的图像并同时确定其在该环境中的位置的过程。有许多不同的方法来实现SLAM,无论是在软件算法方面,还是在使用的传感器方面,其中可能包括相机、声纳、雷达、激光雷达和使用惯性测量单元(IMU)的基本位置数据。
廉价和小型摄像机的可用性推动了单目视觉SLAM系统的流行,该系统使用单一的标准摄像头来执行定位和地图绘制功能。这样视觉SLAM系统可以在各种各样的机器人身上找到,包括火星探测器和着陆器、农业领域的野外机器人、无人机,还有可能,自动驾驶车辆。在GPS不可用的情况下,例如在室内区域或大城市,由于建筑物的阻碍,GPS的精度会降低,因此可视SLAM系统也具有优势。
本文描述了视觉SLAM的基本过程,包括目标识别、跟踪和纠错所涉及的模块和算法。讨论了将SLAM计算和功能卸载到专用DSP上的优点,并使用CEVA-SLAM SDK开发工具包来说明遵循此开发路线可以获得的好处。
Direct and Feature-based SLAM
直接和基于特征的SLAM
有许多不同的方法来实现视觉SLAM,但都使用相同的整体方法,通过连续的摄像机帧跟踪设定点来三角化它们的3D位置,同时利用这些信息来近似摄像机的姿态。并行地,SLAM系统不断地使用复杂的算法来最小化投影点和实际点之间的差异——重投影误差。
视觉SLAM系统可以分为直接式和基于特征的,根据它们使用接收到的图像信息的方式。直接SLAM系统将整个图像相互比较,提供关于环境的丰富信息,允许创建更详细的地图,但以牺牲处理工作量和速度为代价。本文重点研究了基于特征的SLAM方法,即在图像中搜索已定义的特征,如角点和斑点,并仅基于这些特征来估计位置和周围环境。虽然基于特征的SLAM方法会从图像中丢弃大量有价值的信息,但取舍是一个简化的过程,在计算上更容易实现。
Figure 1: Direct vs Feature-based SLAM.
The visual SLAM Process
基于特征的SLAM的主要步骤是从输入图像中提取一组稀疏特征,匹配从不同摄像机姿态获得的特征,并通过最小化特征重投影误差(在所有点上,一个点的跟踪位置与期望给出摄像机姿态估计的位置之间的差异)来解决SLAM问题。
这些步骤是使用下面描述的一组构建块来完成的,这些构建块对于所有基于特性的SLAM实现都是通用的。可视化SLAM是一个不断发展的领域,产生了大量的研究,并且已经为每个模块开发和提出了各种算法,根据SLAM实现的确切性质,每个模块都有利弊。下面的描述提到了当前最流行的算法的一个子集。
特征提取(图2)是一个过程,它有效地将图像中的有用信息(如角点、边缘、斑点和更复杂的对象(如门口和窗户)表示为紧凑的特征向量。目前流行的特征提取算法包括高斯差分法(DoG)和加速段测试法(FAST9)特征提取算法,该方法计算效率高,适合于实时视频处理。
Figure 2: SLAM Feature Extraction.
在特征描述中,将每个提取特征周围的区域转换为一个紧凑的描述符,该描述符可以与其他描述符进行匹配。例如,可以通过特征的外观或者特征点周围的面片中像素的强度来描述特征。ORB和FREAK是流行的特征描述算法的例子。
在特征匹配中,提取的特征(描述符)在多个帧上进行匹配。通过将第一个图像中的所有特征与第二个图像中的所有特征进行比较,在两个图像中进行特征匹配。汉明距离函数通常用于特征匹配,因为它可以在硬件中有效地使用异或和计数位函数对数据位集(如向量)执行。汉明距离表示两个向量中有多少位是不同的,这意味着得分越低,匹配越接近。
循环闭合是SLAM过程中的最后一步,它确保了SLAM解决方案的一致性,尤其是当定位和映射操作需要长时间执行时。Loop closure通过非相邻帧观察同一场景,并在它们之间添加约束,以减少姿态估计中的累积漂移。与其他视觉SLAM模块一样,已经开发了多种环路闭合算法,其中最流行的是束平差、卡尔曼滤波和粒子滤波。
VSLAM算法是一个活跃的研究领域,以上是近年来出现的越来越多的技术的例子。由于基于带宽的解决方案更有效地利用了基于内存的SLAM处理速度。此外,基于特征的解决方案在各种条件下表现出更高的鲁棒性,包括亮度的快速变化、低亮度、相机的快速移动和遮挡。
特定算法的选择取决于特定应用的特点,包括地图类型、传感器类型、所需精度等等。许多SLAM系统结合了一组算法,这些算法最适合最广泛的场景。
SLAM implementation challenges
可视化SLAM处理的计算量非常大,给传统的基于CPU的实现带来了很高的负载,导致了过多的功耗和较低的帧速率,从而影响了精度和电池寿命。新兴SLAM应用程序的开发人员需要能够提供更高集成度和更低功耗的解决方案。他们在设计中越来越多地使用专用视觉处理单元(VPU)。VPU是一种微处理器,其体系结构专为加速机器视觉任务(如SLAM)而设计,可用于从主应用程序CPU上卸载视觉处理。VPU,如CEVAs CEVA-XM6,图3,包括低功耗、强大的ALU、强大的MAC功能、高吞吐量内存访问和专用视觉指令等特性。这些设备还将支持图像处理应用程序所需的强大浮点功能。
Figure 3: CEVA XM6 vision processing unit.
然而,即使使用VPU,VisualSLAM开发人员仍然必须克服几个挑战,因为为不同的SLAM模块创建高效的代码是一项非常重要的工作,而且很难将VPU连接到主处理器。
必须优化嵌入式应用程序的执行速度和功耗。可视化SLAM模块的编码是一项复杂的任务,可能需要获取、存储和操作大量的数据。例如,在特征匹配中,描述符作为128位向量存储在存储器中,为了在连续帧中匹配特征,通常必须将200个特征与2000个候选特征进行比较,从而导致400000个匹配操作。匹配操作显然需要大量的内存,但在采样数据较小的情况下,获取和格式化数据的高开销会影响编码算法的效率。
束平差是另一种涉及复杂线性代数的算法,涉及大矩阵的操作。存在各种技术来优化这些和其他VSLAM模块的编码,但是这些技术的实现需要高水平的视觉特定编码专业知识。
内存管理是图像处理中的另一个挑战。从图像捕获的数据通常被加载到连续的内存位置,处理图像中的随机补丁意味着处理未存储在连续内存位置的数据。执行特征匹配的软件例程必须从非连续内存位置检索描述符,这进一步增加了设置开销。
VSLAM开发工具
在当今的环境中,快速上市对开发人员来说是至关重要的,因此花时间获取实现高效视觉处理代码所需的技能和知识并不总是实际可行的。幸运的是,有许多工具可以促进经济高效的SLAM应用程序的加速;应用程序开发工具包提供了vision特定软件库、优化的硬件和集成工具的组合,使开发人员能够轻松地将vision特定的任务从CPU卸载到VPU。
图4所示的cevaslamsdk是此类应用程序开发工具集的一个主要示例。
Figure 4: The CEVA SLAM SDK.
基于CEVA XM6 DSP和CEVA NeuPro AI处理器硬件,CEVA SLAM SDK能够有效地将SLAM实现集成到低功耗嵌入式系统中。SDK具有许多构建块,包括图像处理库,为特征检测和匹配以及捆绑调整提供了有效的代码。它还为线性代数、线性方程求解、快速稀疏方程求解和矩阵处理提供了支持。
CEVA XM6硬件针对图像处理进行了优化,具有创新功能,如解决非连续内存访问问题的并行加载指令,以及用于执行汉明距离计算的唯一专用指令。SDK还包括一个详细的CPU接口,使开发人员能够轻松地将视觉处理功能与主应用程序CPU集成。
为了说明SDK作为开发工具的性能,我们测量了一个以每秒60帧的速度运行的全SLAM跟踪模块的参考实现,其功耗仅为86mW。
Conclusion
视觉冲击系统在农业领域机器人和无人机等广泛的应用中越来越受欢迎。可视化SLAM的实现有很多替代方法,但是随着嵌入式应用的日益广泛,编码效率和低功耗是关键因素。
虽然开发人员通常使用VPU来从主CPU上卸载计算密集型的视觉处理任务,但是为了生成高效的代码以及管理VPU和CPU之间的接口,仍然存在重大挑战。
随着上市时间成为一个关键驱动因素,开发人员可以利用构建在SLAM特定开发工具包(如cevaslamsdk)中的功能来加速产品开发。
简化可视SLAM应用程序的开发的更多相关文章
- Java程序员开发参考资源
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- Microsoft Graph Web应用程序极致开发体验
作者:陈希章 重写于 2017年5月24日 前言 这篇文章最早写于2017年5月2日,当时的想法是从最简单的方式来写如何在一个ASP.NET MVC应用程序中集成Microsoft Graph,但实际 ...
- java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api
移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...
- 用小程序·云开发两天搭建mini论坛丨实战
笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数.数据库.存储三大能力.关于云开发,可参考文档:小程序·云开发. 个人感觉云开发带来 ...
- Web程序员开发App系列 - 开发我的第一个App,源码下载
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- Web程序员开发App系列 - 调试Android和IOS手机代码(补图)
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- Web程序员开发App系列 - 申请苹果开发者账号
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- Web程序员开发App系列 - 认识HBuilder
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- YARN应用程序的开发步骤
开发基于YARN的应用程序需要开发客户端程序和AppMaster程序: 我们基于程序自带的例子来实现提交application 到YARN的ResourceManger. Distributed Sh ...
随机推荐
- 从苏宁电器到卡巴斯基第14篇:我在苏宁电器当营业员 VI
我也过了一把讲师的瘾 由于iPhone已经成为了我们的主推产品,因此苏宁要求手机专区的每一个人,不论是自营还是厂促,都要对iPhone非常了解才可以.于是,督导也没有事先通知我,就直接让我给手机专区的 ...
- hdu4998 旋转坐标系
题意: 一开始的时候有一个坐标系(正常的),然后有n个操作,每个操作是 x y d,意思是当前坐标系围绕x,y点逆时针旋转d度,最后让你输出三个数x y d,把这n个操作的最后结果,用一步 ...
- hdu5012 水搜索
题意: 给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路: ...
- POJ2296二分2sat
题意: 给n个点,每个点必须在一个正方形上,可以在正方向上面边的中点或者是下面边的中点,正方形是和x,y轴平行的,而且所有的点的正方形的边长一样,并且正方形不能相互重叠(边相邻可以),问满 ...
- 【前端】vue2.x 配合 bootstrapTable 动态添加元素和绑定点击事件,事件无效 解决
背景: 使用bootstrap-table 表格插件时,每一行的最后一班会加操作按钮列.如果不加入vue的话,使用插件自己的列属性formatter:function(value, row, inde ...
- 【哲学角度看软件测试】要想软件“一想之美”,UI 测试少不了
摘要:软件测试的最高层次需求是:UI测试,也就是这个软件"长得好不好看". 为了让读者更好地理解测试,我们从最基础的概念开始介绍.以一个软件的"轮回"为例,下图 ...
- 巧用SQL拼接语句
前言: 在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果.本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索 ...
- 【转】java-selenium三种等待方式
方式1: 线程等待:Thread.sleep(xxxx) 只要在case中加入sleep就会强制等待设置的时间后才会执行之后的命令,这种等待一般适用于调试脚本的时候. java代码: //等待3秒 T ...
- Node.js核心模块API之文件操作
参考:https://www.runoob.com/nodejs/nodejs-fs.html 异步I/O 1,文件操作 2,网络操作 在浏览器中也存在异步操作 1,定时任务 2,事件处理 3,Aja ...
- [bug] python3 pip 安装 MarkupSafe==1.0 失败:ImportError:cannot import name 'Feature' from 'setpools'
解决 先升级pip到最新版本 python -m pip install --upgrade pip 再升级setuptools pip install --upgrade pip setuptool ...