简化可视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应用程序的开发的更多相关文章

  1. Java程序员开发参考资源

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  2. Microsoft Graph Web应用程序极致开发体验

    作者:陈希章 重写于 2017年5月24日 前言 这篇文章最早写于2017年5月2日,当时的想法是从最简单的方式来写如何在一个ASP.NET MVC应用程序中集成Microsoft Graph,但实际 ...

  3. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

  4. 用小程序·云开发两天搭建mini论坛丨实战

    笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数.数据库.存储三大能力.关于云开发,可参考文档:小程序·云开发. 个人感觉云开发带来 ...

  5. Web程序员开发App系列 - 开发我的第一个App,源码下载

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  6. Web程序员开发App系列 - 调试Android和IOS手机代码(补图)

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  7. Web程序员开发App系列 - 申请苹果开发者账号

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  8. Web程序员开发App系列 - 认识HBuilder

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  9. YARN应用程序的开发步骤

    开发基于YARN的应用程序需要开发客户端程序和AppMaster程序: 我们基于程序自带的例子来实现提交application 到YARN的ResourceManger. Distributed Sh ...

随机推荐

  1. 【原创】ansible常用模块整理

    一.Ansible模块帮助 ansible-doc -l # 列出 Ansible 支持的模块 ansible-doc ping # 查看该模块帮助信息 二.远程命令模块 2.1command com ...

  2. PAT 乙级 -- 1006 -- 换个格式输出整数

    题目简述 让我们用字母B来表示"百".字母S表示"十",用"12-n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整 ...

  3. 使用SSH端口做端口转发以及反向隧道

    目录 SSH做本地端口转发 SSH做反向隧道(远程端口转发) 用autossh建立稳定隧道 SSH开启端口转发需要修改 /etc/ssh/sshd_config配置文件,将 GatewayPorts修 ...

  4. 【dependencyManagement版本管理】dependencies.dependency.version is missing

    maven 的gav的v(版本问题) 报错dependencies.dependency.version is missing 出现的场景 一个项目中有多个模块 父模块中出现dependencies. ...

  5. Redis 存储对象信息是用 Hash 还是 String

    Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value,RedisObject 中的 type,则是代表一个 value 对象具体是何种数据类型,它包含字符串(St ...

  6. “深度评测官”——记2020BUAA软工软件案例分析作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 完成一次完整的软件开发经历并以博客的方式记录开发 ...

  7. zimbra安装ssl证书

    zimbra在后台安装证书签发机构签发证书出现时候出现错误:{RemoteManager: mail.domain.com->zimbra@mail.domain.com:22} com.zim ...

  8. 用JIRA管理你的项目——(三)基于LDAP用户管理

    JIRA提供了基于LDAP方式的用户管理,也就是用户密码的管理交给LDAP,而JIRA只管理用户在系统中的角色. 要打开JIRA的LDAP设置,首先需要验证下你的LDAP服务是否正常! 几乎有所有的L ...

  9. 联想ThinkServer服务器安装CentOS7 Redhat7系统 驱动R110i RAID卡

    1.下载对应版本的驱动(因为联想没有CentOS的驱动用redhat的驱动就可以). 2.进入BIOS里,在高级设置里找到SATA设置,把SATA模式改成RAID(重启后配置raid),sSATA模式 ...

  10. 利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶

    一.准备!!! 1.使用拥有足够权限的IAM账号登录AWS控制台 2.创建S3存储桶,给存储桶命名如"my-bucket"(如果使用已有存储桶,本步骤可略过) 3.有该S3存储桶访 ...