简化可视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 ...
随机推荐
- Python小游戏 -- 猜数字
Python初学者小游戏:猜数字 游戏逻辑:电脑随机生成一个数字,然后玩家猜数字,电脑提示猜的数字大了还是小了,供玩家缩小数字范围,达到既定次数后,玩家失败.若在次数内猜对,玩家获胜. 涉及知识点:r ...
- hdu4950 打怪(简单题目)
题意: 打怪,一开始怪有h滴血,每回合可以让对方减少a滴血,每次打完之后怪会恢复b滴血,每连续k回合之后自己会休息一回合,这一回合怪物依然回血,问是否可以把怪打死. 思路: 比较 ...
- Python脚本自动化破解大白鲨摄像头(Shodan)
关于本文的技术知识点,Shodan模块的用法,传送门--> Python中shadon模块的使用 Shodan的使用 今天我们要利用python进行自动化破解的摄像头叫大白鲨摄像头,他的 ...
- Linux中的shell和bash
目录 shell shell script sh bash Dash tty .pty 和 pts 学安全的我们,经常会听到说获得某服务器的shell,就是指获得某个服务器的操作权限.我们学习linu ...
- 使用Github+Picgo搭建图床
虽然我的大部分博客使用的腾讯云的对象存储(COS)作为图床,但是腾讯云的免费对象存储空间结束了,购买资源西南地区大致存储资源包50元/12月+下行流量9元/3月,价格较为高昂,而使用GitHub或者G ...
- java之泛型的使用
在java中,普通的类和方法只能用具体的类型,这对代码的限制很大,代码的可重用性大大降低. 那么如何才能让同一个类和方法使用不同类型的对象呢?在接触泛型之前我们可能会想到通过类型转换的方法来实现. p ...
- 手写一个LRU工具类
LRU概述 LRU算法,即最近最少使用算法.其使用场景非常广泛,像我们日常用的手机的后台应用展示,软件的复制粘贴板等. 本文将基于算法思想手写一个具有LRU算法功能的Java工具类. 结构设计 在插入 ...
- 类的两个装饰器classmethod、staticethod和内置魔术方法
一.两个装饰器@classmethod.@staticmethod @classmethod:把类中的绑定方法变成一个类方法,cls 就等于类名 有什么用? 1.在方法中任然可以引用类中的静态变量 2 ...
- JAVA中Abstract到底有什么用?都用在哪些方面比较合适?
功能向上聚合 Abstract作为抽象类和抽象方法,第一种情况是在聚合子类的通用性上起到作用,往往出现在重构过程中自然而然形成的一种层次结构-希望将多个子类的通用方法和逻辑提取到父层的抽象类. 这种重 ...
- [Java] Spring 原理
IOC(Inverse of Control)控制反转 依赖对象的获得被反转了,由自己创建变为从IOC容器获取 优点 代码更简介,不需要new对象 面向接口编程,使用者与具体类解耦,易扩展 方便进行A ...