简化可视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 ...
随机推荐
- 技术面试问题汇总第004篇:猎豹移动反病毒工程师part4
这次所讨论的三个问题,比如DLL以及HOOK,很容易被病毒木马所利用,因此必须要比较全面地进行了解.而异常处理机制,则往往与漏洞相关联.它们自身的概念并不难理解,只是由之引申而来的问题,在计算机安全领 ...
- Xposed框架Hook Android应用的所有类方法打印Log日志
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80954759 在进行Android程序的逆向分析的时候,经常需要Android程 ...
- Ubuntu20.04连接WiFi
电脑安装了Ubuntu20.04后发现没办法连接WiFi,也找不到WiFi图标,一般来说是因为Ubuntu系统没有网卡驱动,安装一下即可 解决办法如下: 先用网线或者手机开热点连接到到电脑,让电脑有网 ...
- 05.24 ICPC 2019-2020 North-Western Russia Regional Contest复现赛+Codeforces Round #645 (Div. 2)
A.Accurate Movement(复现赛) 题意:两个木块最左边都在0的位置,最右边分别为a,b(b>a),并且短的木条只能在长木条内移动,问两个木条需要移动多少次才能使两个木条的右端都在 ...
- Pytorch实现对卷积的可插拔reparameterization
需要实现对卷积层的重参数化reparameterization 但是代码里卷积前weight并没有hook,很难在原本的卷积类上用pure oo的方式实现 目前的解决方案是继承原本的卷积,挂载一个we ...
- laravel 伪静态实现
Route::get('show{id}.html',['as'=>'products.detail','uses'=>'companyController@show']) ->wh ...
- 常用加密算法学习总结之数字证书与TLS/SSL
数字证书 对于一个安全的通信,应该有以下特征: 完整性:消息在传输过程中未被篡改 身份验证:确认消息发送者的身份 不可否认:消息的发送者无法否认自己发送了信息 显然,数字签名和消息认证码是不符合要求的 ...
- [bug] C:warning: implicit declaration of function ‘getline’
参考 https://blog.csdn.net/loushuai/article/details/38983793
- [bug] HDFS:DataXceiver error processing WRITE_BLOCK operation
文件格式有误,导致读取错误,我的是把制表符敲成了空格
- 折腾gcc/g++链接时.o文件及库的顺序问题
gcc/g++链接时.o文件以及库的顺序问题 1 写在前面 最近换了xubuntu12.4,把原来的项目co出来编译的时候报"undefined reference to".猜测是 ...