简化可视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)中的功能来加速产品开发。