薛 瑞 李 易 李文明 安述倩 叶笑春 唐志敏
(∗处理器芯片全国重点实验室(中国科学院计算技术研究所) 北京 100190)
(∗∗中国科学院大学计算机科学与技术学院 北京 100049)
同步定位和建图(simultaneous localization and mapping,SLAM)作为自动驾驶汽车、机器人、无人机、虚拟现实和增强现实等自主系统的关键技术[1-3],能很好地应用在包括路径规划、导航、避障和3D 重建等高级任务中。在过去的几十年,无论在学术界还是工业界,SLAM 一直是研究的热点[4-7],其主要工作是设计自动导航系统、建立和更新周围3D 环境同时估计自身传感器的当前位置。
近年来,基于特征点法的SLAM 系统与其他基于直接法的SLAM 系统相比,对运动较快的场景具有更好的鲁棒性,且系统处理较为稳定,因此受到了特别的关注[8]。在基于特征点法的SLAM 系统中,ORB[9](oriented FAST and rotated BRIEF)特征计算方法相比于尺度不变特征变换(scale-invariant feature transform,SIFT)或加速鲁棒特征(speeded up robust features,SURF)算法具有良好的旋转和缩放不变性,计算效率和鲁棒性更高,因此被广泛采用。
由于ORB-SLAM 系统应用于现实世界的真实场景中,主要输入数据为大量的连续图像帧,因此针对海量的图像帧数据快速处理的需求,提高ORBSLAM 系统的处理性能成为当前亟待解决的问题,因此对ORB-SLAM 系统进行特征分析研究以指导面向ORB-SLAM 系统的底层硬件架构的设计具有重要的意义。目前已有的底层硬件架构设计有eSLAM[8]、HcveAcc[10]和PISCES[11]等。然而这些加速结构没有对算法进行深入的分析,缺乏为后续底层硬件架构设计提供有效的指导。针对上述问题,本文对ORB-SLAM 系统进行了较为全面的应用特征分析,以指导面向ORB-SLAM 系统的底层硬件架构的设计。
本文首先从对ORB-SLAM 系统介绍出发,分别详细阐述ORB-SLAM 系统[12]3 个线程的工作原理及其2个优化版本ORB-SLAM2[13]和ORB-SLAM3[14],并选取ORB-SLAM2 作为本文实验的目标系统。然后通过实验ORB-SLAM2 系统,得到并分析系统的热点函数特征。最后根据对热点函数特征的分析结果,提出设计面向ORB-SLAM 系统的底层硬件架构的需求。
本文的主要贡献包括:(1)完整地介绍了ORBSLAM 系统跟踪、地图构建和回环检测3 个线程的工作原理;(2)实验分析并重点阐述了ORB-SLAM2系统中的热点函数及执行特征;(3)通过对热点函数进行详细的特征分析实验,得到了面向ORBSLAM 系统对底层硬件架构的需求。
当前主流的SLAM 系统由4 个阶段组成,分别为前端视觉里程计(visual odometry,VO)、后端优化(optimization)、回环检测(loop closing)和三维地图建立(mapping)[12-17]。前端视觉里程计阶段用来求解传感器在各个时刻的位置信息;后端优化阶段用来全局优化前端视觉里程计长时间的累计误差;回环检测阶段用来检测传感器是否到达之前到过的位置;三维地图建立阶段用来构建传感器在移动过程中周围的3D 点云地图。
前端视觉里程计有特征点法和直接法2 种求解方法,现有的基于特征点法的SLAM 系统有Mono-SLAM[18]、PTAM[15]、ORB-SLAM[12]及其优化系统ORB-SLAM2[13]和ORB-SLAM3[14]等,基于直接法的有DTAM[19]和LSD-SLAM[17]等;只关注于前端视觉里程计部分的VIO 设计方案有基于半直接法的SVO[16]、基于特征点法的OKVIS[20]和基于直接法的DSO[21]等;只关注于3D 重建部分的系统有Kinect-Fusion[22]、InfiniTAM[23]、ElasticFusion[24]等。表1 总结了最具有代表性的各个SLAM 系统。其中Mono-SLAM 系统是第一个实时的单目视觉SLAM 系统[18],扩展卡尔曼滤波(extended Kalman filter,EKF)作为后端优化的方法,追踪前端稀疏的特征点,以传感器当前状态和所有路标点为状态量,更新特征点的均值和协方差。该方法的缺点是场景窄、路标数有限、稀疏特征点易丢失。PTAM 系统[15]提出并实现了跟踪和建图的并行化,首次区分出前后端概念,即把跟踪需要实时响应的图像数据部分作为前端,地图优化放在后端进行。PTAM 系统是第一个使用非线性优化作为后端的方案,并提出了关键帧机制,该方法的缺点是场景小、跟踪容易丢失。ORBSLAM 系统[12]围绕ORB 特征计算,计算效率比SIFT 和SURF 算法高,且具有良好的旋转和缩放不变性,并创新地使用了3 个线程来完成SLAM 系统,分别为实时跟踪特征点线程、地图构建线程和回环检测线程,该方法的缺点是每幅图像都需要计算ORB 特征,三线程结构给CPU 带来了较重负担。ORB-SLAM2 系统[13]在单目ORB-SLAM 系统基础上增加了双目和RGB-D 传感器的输入,并通过使用光束平差法(bundle adjustment,BA),获得了比基于迭代最近点或者光度和深度误差最小化的方法更高的精度;ORB-SLAM2 系统使用近距离和远距离的特征方法,双目效果比直接法更精确且定位时可以重用地图,是一种轻量级的方法,在CPU 上可以实现实时性;ORB-SLAM2 系统增加的双目和RGB-D 方法可以解决原来ORB-SLAM 系统在单目回环检测时严重的漂移问题。ORB-SLAM3 系统[14]是一种紧密集成的视觉惯性SLAM 系统。对比于ORB-SLAM系统和ORB-SLAM2 系统,ORB-SLAM3 系统在惯性测量单元初始化阶段引入最大后验概率估计思想,同时采用了多子地图系统。
表1 代表性的各个SLAM 系统的总结
随着SLAM 系统需要的处理性能不断提高,近几年学术界和工业界涌现出一些面向SLAM 系统的加速结构设计。对于使用广泛且本文重点关注的基于ORB-SLAM 系统的加速结构设计如针对ORBSLAM 系统中耗时最高的前端视觉里程计的特征提取部分进行基于FPGA 硬件结构设计[25]。文献[26]提出了一种基于CGRA结构的加速器设计,从输入图像帧数据以及跟踪任务和列文伯格-马夸尔特算法(Levenberg-Marquardt,LM)的计算特点进行粗粒度可重构的硬件逻辑设计。文献[8]提出了eSLAM,在FPGA 平台上设计了基于ORB 的特征提取和特征匹配2 部分的高能效加速器。在eSLAM 基础上,文献[10]提出了HcveAcc,针对ORB-SLAM系统的跟踪任务中的高密集度的特征提取和高精度的描述子生成部分设计了基于ASIC 的加速器结构,实现ORB-SLAM 系统运行的高性能和高精度。文献[11]设计了一个基于特征点法SLAM 系统的前端视觉里程计任务的EKF 和ORB 部分以及后端优化任务的BA 部分的流水线结构PISCES,利用其计算稀疏性降低访存功耗和计算延时,提高处理性能。表2 总结了近几年最具代表性的ORB-SLAM系统加速器,并分析各加速器存在的问题。针对表2中存在的问题,本文进行了面向ORB-SLAM 系统的应用特征分析研究,为面向ORB-SLAM 系统的底层硬件架构设计提供了指导性建议。
表2 近几年最具有代表性的ORB-SLAM 系统加速器
ORB-SLAM 系统[12]是一种基于单目的、围绕ORB 特征计算的SLAM 系统,使用跟踪、地图构建和回环检测3 个线程进行同步定位和建图工作。ORB-SLAM 系统流程图如图1 所示。
图1 ORB-SLAM 系统流程图
跟踪线程主要负责定位传感器并确定何时插入新的关键帧,主要由ORB 特征提取、初始位姿估计、局部地图跟踪和关键帧选取4 部分组成。
ORB 特征提取[9]部分是由FAST(features from accelerated segment test)算法[27]改进得到。ORB 利用FAST 算法对插入的新图像帧进行FAST 角点搜索,即搜索整个图像帧中所有与其周围邻域内足够多的像素点的灰度值相差较大的像素点。图2 所示为图像帧中某一个角点和周围邻域内的像素点,给定比较的阈值以及圆圈大小(本文以圆圈大小16为例)。首先比较像素点1 和9,如果其和中心像素的灰度值差的绝对值均小于阈值,则该点不是角点,否则将它作为候选角点;再比较像素点1、5、9 和13与中心像素点灰度值差的绝对值,如果其中有3个绝对值大于阈值,则该点继续作为候选点,否则舍弃;最后比较像素点1~16 与中心像素的灰度值差,如果连续大于或小于阈值的像素点超过8 个,则该点为特征点,否则舍弃。由于此时搜索出的角点过多,因此本文对检测出来的角点群利用非极大值抑制方法进行FAST 角点的筛选,并在保留的FAST 角点上计算方向,以此来实现特征点的旋转不变性,最后计算当前图像帧中角点的BRIEF(binary robust independent elementary features)描述子[28]用于与上一帧中的角点的BRIEF 描述子进行特征匹配。
图2 图像帧中某一角点与其邻域点
初始位姿估计部分首先判断当前帧与上一帧的特征匹配是否成功,若成功则假设传感器为恒速运动模型来预测传感器当前位姿,并搜索与上一帧观察到的地图点进行对应,最后与对应的地图点进行位姿优化。若没有足够的位姿与地图点的匹配对,则使用上一帧中更广泛的位姿附近的地图点的搜索范围。若当前帧与上一帧的特征匹配失败,则需要全局重定位,首先将当前帧转化为词袋向量[29],利用ORB 特征词典与所有关键帧进行匹配,然后对每个关键帧进行随机抽样一致性(random sample consensus,RANSAC)迭代,并使用PnP 算法[30]进行传感器位姿求解。若传感器位姿有足够多可被使用的正确数据,则搜索与所有关键帧观察到的地图点进行对应,通过匹配对进行位姿优化。初始位姿估计部分的流程图如图3 所示。
图3 初始位姿估计部分流程图
局部地图跟踪部分首先更新局部关键帧和局部地图点,将局部地图点与当前帧进行匹配,最后使用最小化重投影误差方法实现对传感器位姿的进一步优化。
关键帧选取部分通过舍弃不满足条件的关键帧,保留满足以下条件的关键帧,保证系统具有鲁棒性。
(1)自上次全局重定位后,必须已经过大于20帧;
(2)地图构建部分处于空闲状态,或自上次插入关键帧后已经过大于20 帧;
(3)当前帧至少跟踪到50 个点;
(4)当前帧比与当前帧共享最多地图点的帧跟踪到少于90%的点。
地图构建线程负责处理新的关键帧并执行BA,以实现传感器周围地图的最佳重建。此部分主要由关键帧插入、地图点验证、新地图点生成、本地BA和本地关键帧选取5 部分组成。
关键帧插入部分首先更新共视图,然后更新与跟关键帧中有大多数共同的点相连接在一起的生成树,最后计算关键帧的词袋向量。
地图点验证部分主要工作是需要地图点必须在创建后的前3 个关键帧期间通过限制性测试,以确保它们是可进行特征匹配的并且不会错误地进行三角化计算。
新地图点生成部分负责从共视图中已连接的关键帧进行三角化计算ORB 特征点来创建新地图点。对于关键帧中每个未匹配的ORB 特征点,在另一个关键帧中搜索与其他不匹配点进行匹配,丢弃不满足对极约束的匹配。最后对ORB 特征点匹配对进行三角化计算生成新地图点。
本地BA 部分主要优化当前关键帧、在共视图中所有连接到当前关键帧的关键帧以及被关键帧观测到的所有地图点。所有其他观测到地图点但未连接到当前关键帧的关键帧均包含在优化中,同时保持固定不变。在优化中间和结束时,将标记为异常值的观测值丢弃。
本地关键帧选取部分主要检测和删除冗余的关键帧以维持重构过程的紧凑。
回环检测线程主要由候选帧选取、相似度计算、回环融合和全局优化4 部分组成。此线程采用了词袋模型来检测回环,若检测到回环,则进行相似度转换的计算,以告知回路中累积的漂移。然后通过建立当前帧和回环帧之间的匹配关系,融合重复的点,最后对相似性约束进行位姿图优化[31],来修正视觉里程计的局部误差,以实现全局一致性。
ORB-SLAM2 系统[13]是在ORB-SLAM 系统基础上提出来的一个支持单目、双目和RGB-D 的完整SLAM 系统方案。它能够实现地图重用、回环检测和重定位功能。同时ORB-SLAM2 系统在后端优化采用了基于单目和双目的BA 方法,此方法允许米制比例尺的轨迹精确度评估。此外,ORB-SLAM2 系统包含一个轻量级的定位模式,该模式能够在允许零点漂移的条件下,利用前端视觉里程计来追踪未建图的区域并匹配特征点。ORB-SLAM2 系统流程图如图4 所示,其中线框部分,即跟踪线程的预处理输入部分和全局BA 部分为ORB-SLAM2 系统在ORB-SLAM 系统的基础上的改进。
图4 ORB-SLAM2 系统流程图
本文采用ORB-SLAM2 系统进行系统特征分析研究的原因如下。
(1)从第3 节可以看出,ORB-SLAM 系统时间占比最大部分为跟踪线程,而ORB-SLAM3 系统相比于ORB-SLAM2 系统的主要优化在于增加了惯性测量单元集成、初始化和缩放修正部分以及地图合并部分,未涉及跟踪线程部分的计算,对系统特征分析影响较小。因此ORB-SLAM3 系统的改进部分并不是本文的研究目标。
(2)相比于ORB-SLAM 系统和ORB-SLAM3 系统,ORB-SLAM2 系统在SLAM 系统优化及底层硬件架构设计等方面均具有更广泛的应用[8,10-11,25-26]。
因此本文实验部分将采用ORB-SLAM2 系统进行系统热点函数及系统特征分析。
本节将对ORB-SLAM2 系统进行整体性能分析,并选取其中的热点函数。
实验平台:本文采用基于Skylake 架构的64 位Intel i5-6500 桌面电脑处理器和基于ARM v8 架构的ARM Neoverse-N1 处理器作为实验平台进行对比实验。
数据集:本文选取3 个典型开源数据集KITTI[32]、EuRoC[33]和TUM RGB-D[34]作为实验数据集。
KITTI 数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集[32],该数据集包含城镇、乡村等自动驾驶可覆盖到的道路及道路周边信息的图像帧序列。EuRoC 数据集是室内微型飞行器和惯性测量单元收集视觉惯性数据[33],包含苏黎世联邦理工学院的machine hall 和一个普通房间vicon room 的室内场景的图像帧序列。TUM RGB-D 数据集是由慕尼黑工业大学计算机视觉实验室公布的[34],该数据集均从实际环境中采集,包含针对纹理丰富的办公室场景以及不同帧数大小、不同运动速度、不同结构纹理等场景的图像帧序列。
处理器各详细参数及数据集分别如表3 和表4所示。
表3 处理器各详细参数
表4 数据集
本文使用Linux 的性能评估软件Perf 进行实验测试,针对ORB-SLAM2 的单目、双目和RGB-D 3 种传感器输入,分别在KITTI、EuRoC 和TUM 数据集上进行了单目实验,KITTI 和EuRoC 数据集上进行了双目实验以及将TUM 作为RGB-D 输入数据集进行ORB-SLAM2 系统实验,得到160 个在表3 所示的Intel 和ARM 处理器下测试ORB-SLAM2 系统中各函数的时间占比。并对这160 个时间占比结果中排名前5 的函数进行了统计得到如图5 所示的热点函数分析结果。
由图5 所示的分析结果可以看出,由于Perf 评估软件统计函数执行时间是统计函数中没有调用其他函数部分的执行时间,因此包含FAST 角点提取函数FAST_t 和角点分数计算以用来进行非极大值抑制筛选角点的函数CornerScore 的ORB 特征提取函数ExtractorORB 执行时间占比最高为67%。由于ExtractorORB 函数为前端视觉里程计部分的热点函数,对于后端非线性优化部分,由图5 可以看出,优化求解器函数Solver 执行时间占比最高为17%,且由于ORB 特征提取函数ExtractorORB 和优化求解器函数Solver 为学术界和工业界热门的研究部分[8,10-11,25-26],因此本节将重点介绍和分析ORB特征提取函数ExtractorORB 和优化求解器函数Solver。
图5 热点函数分析
作为前端视觉里程计阶段的热点函数ExtractorORB,主要由跟踪线程调用,在ORB-SLAM2 系统中,跟踪线程作为主线程首先调用热点函数ExtractorORB 中operator 函数进行ORB 特征点的提取。其中包含ComputePyramid 函数用来计算图像金字塔;ComputeKeyPointsOctTree 函数对图像金字塔进行角点检测,提取图像金字塔中各层图像的关键点;以及ComputeDescriptors 函数对图像金字塔的每层计算BRIEF 描述子。在ComputeKeyPointsOctTree函数中调用了时间占比最高的FAST_t 函数来进行FAST 角点的提取。热点函数ExtractorORB 的函数调用关系如图6 所示。
图6 热点函数ExtractorORB 的函数调用关系
作为后端优化阶段的热点函数优化求解器函数Solver 分别由跟踪线程的GlobalBundleAdjustement、BundleAdjustment 和PoseOptimization 函数、地图构建线程中的LocalBundleAdjustment 函数以及回环检测线程中的OptimizeEssentialGraph 和OptimizeSim3函数调用。这6 个函数均通过调用设置线性求解器LinearSolver 为Dense、PCG、Cholmod 之一的方法;设置块求解器BlockSolver 为是否可变尺寸的方式;设置求解器求解算法SetAlgorithm 为高斯牛顿(Gauss Newton,GN)、列文伯格-马夸尔特算法(LM)和信赖域(Dogleg)之一;初始化稀疏优化器SparseOptimizer,并设置局部关键帧顶点以及地图点顶点和优化对应的边,加入优化器中;最后调用优化器的optimize 函数中的热点函数Solver 进行迭代优化求出传感器位置的最优解。Solver 函数的函数调用关系如图7 所示。
图7 热点函数Solver 的函数调用关系
通过对ORB-SLAM2 系统进行整体性能分析,本节将针对系统中时间占比较高的ORB 特征提取函数ExtractorORB 和优化求解器函数Solver 进行进一步函数特征分析。本文主要从IPC(instruction per clock)、分支预测失效率、一级数据缓存读失效率、最后一级缓存失效率和最后一级缓存MPKI 等指标进行函数特征分析。
图8 和图9 为2 个热点函数ExtractorORB 和Solver 分别在Intel 和ARM 处理器对160 个数据集进行实验得到的IPC 值对比图。图10 所示为在图8和图9 基础上计算得到的2 个热点函数在所有数据集计算得到的IPC 平均值对比图。
图8 两个热点函数在Intel 处理器运行所有数据集的IPC 值对比图
图9 两个热点函数在ARM 处理器运行所有数据集的IPC 值对比图
图10 热点函数的IPC 平均值对比图
由图8、图9 和图10 可以看出,在Intel 处理器中ExtractorORB函数的IPC明显高于Solver函数,是Solver 函数的2 倍多。由于ExtractorORB 函数主要功能是进行ORB 特征提取,在提取FAST 角点和计算BRIEF 描述子时主要指令为简单的位运算和比较指令,而Solver 函数主要功能是进行位姿增量和地标增量的计算,主要指令为矩阵向量的加减乘除运算,相比于ExtractorORB 函数,指令复杂度较高。且由后文4.3 节可知,Solver 函数的一级读缓存失效率明显高于ExtractorORB 函数,则每个cycle 访存命中率低,每个cycle 执行的指令要低于ExtractorORB 函数。而在ARM 处理器中,ExtractorORB 函数的IPC 要低于Solver 函数,主要由于ARM 处理器使用的是精简指令集(reduced instruction set computer,RISC)系统,与Intel 使用的复杂指令集(complex instruction set computer,CISC)系统相比每条指令较为简单。针对Solver 函数中的矩阵向量操作,如乘加操作,ARM 处理器每个cycle 需要执行乘法和加法2 条指令,而Intel 处理器只需要执行1 条乘加指令,因此在ARM 处理中,简单位运算操作较多的ExtractorORB 函数的IPC 要低于复杂的矩阵向量操作的Solver 函数。
图11 和图12 为2 个热点函数ExtractorORB 和Solver 分别在Intel 和ARM 处理器对160 个数据集实验得到的分支预测失效率对比图。图13和图14所示为在图11 和图12 基础上计算得到的2 个热点函数分别在Intel 和ARM 2 台处理器执行所有数据集计算得到的分支预测失效率平均值对比图以及在EuRoC、KITTI 和TUM 3 个数据集的分支预测失效率平均值对比图。
图11 两个热点函数在Intel 处理器运行所有数据集的分支预测失效率对比图
图12 两个热点函数在ARM 处理器运行所有数据集的分支预测失效率对比图
图13 热点函数的分支预测失效率平均值对比图
图14 热点函数在3 个数据集的分支预测失效率平均值对比图
由图11、图12 和图13、图14 实验结果可以看出2 个热点函数失效率相似,由于ExtractorORB函数的分支预测指令主要是在对每帧数据进行FAST角点提取时进行的对帧中每一个像素点进行的for循环遍历操作,Solver 函数的分支预测指令主要是对多组传感器位姿和路标点数据组成得到的雅克比矩阵进行的for 循环遍历得到传感器位姿和路标点的增量值。因此2 个函数的分支预测失效均是由for 循环产生,因此失效率相似,且在Intel 和ARM 2台处理器中执行表现出来的趋势相似。
如图15 所示为热点函数ExtractorORB 和Solver分别在Intel 和ARM 处理器对160 个数据集实验得到的一级数据缓存读失效率平均值对比图。
图15 热点函数的一级数据缓存读失效率平均值对比图
由图15 实验结果可以看出,ExtractorORB 和Solver 函数的一级缓存数据命中率较高,但相比于ExtractorORB 函数,Solver 函数命中率较低。主要由于ORB-SLAM2 系统中的ORB 特征提取函数和优化求解器函数整体均具有较好的数据规则访问特征,但由于ExtractorORB 函数对于数据的访问局部性更好,且数据具有很好的流式读特征;而Solver 函数的输入数据主要为矩阵、向量,在进行矩阵乘加等操作时,由于输入数据为行存储,但读取数据进行计算的方式有列读取,数据访问局部性相比ExtractorORB 函数较差,因此ExtractorORB 函数的一级数据缓存读访问失效率比Solver 函数较高。相比于Intel 处理器,2 个热点函数在ARM 处理器上的一级数据缓存读失效率更低,主要由于ARM 处理器具有更大的一级数据缓存。
如图16 所示为2 个热点函数ExtractorORB 和Solver 分别在Intel 和ARM 处理器对160 个数据集实验得到的最后一级缓存失效率平均值对比结果图。
图16 热点函数的最后一级缓存失效率平均值对比图
由图16 实验结果可以看出,在Intel 处理器中ExtractorORB 函数的最后一级缓存失效率是Solver函数的2 倍。由于ExtractorORB 函数的数据局部性好,且一级缓存命中率高,因此最后一级缓存命中率低于Solver 函数。而ARM 处理器中2 个函数的最后一级缓存失效率明显低于Intel 处理器执行结果,主要由于ARM 处理器的三级缓存大于Intel 处理器的三级缓存。
图17 和图18 所示为2 个热点函数ExtractorORB和Solver 分别在Intel 和ARM 处理器对160 个数据集实验得到的最后一级缓存MPKI 失效率对比图。
由图17 和图18 实验结果可以看出,无论在Intel 处理器还是ARM 处理器执行,Solver 函数的最后一级缓存MPKI 值远大于ExtractorORB 函数。ExtractorORB 函数指令简单,且数据访问规则、局部性好。由图19 所示的2 个热点函数执行所有数据集的访存指令占比的平均值可以看出,Solver 函数的访存指令占比较高,由于Solver 函数中有大量的矩阵向量计算,因此需要对矩阵向量进行多次访存操作;而ExtractorORB 函数主要访存和计算为位运算,因此访存指令占比较高,对于每千条指令的最后一级缓存的失效率相比于Solver 函数较低。Solver 函数相比于ExtractorORB 函数在进行底层硬件架构设计时需要针对Solver 函数的矩阵向量数据设计更规则的数据处理结构,以及在对Solver 函数数据进行运算时设计更有效的向量运算部件以提高Solver函数的运算速度,进而提高ORB-SLAM 系统的性能。
图17 热点函数在Intel 处理器执行所有数据集的最后一级缓存MPKI 值对比图
图18 热点函数在ARM 处理器执行所有数据集的最后一级缓存MPKI 值对比图
图19 热点函数执行所有数据集的访存指令占比平均值
通过算法分析可以得出ORB-SLAM2 系统中的2 个热点函数具有以下运算特点。
(1)对于前端视觉里程计部分中的ExtractorORB 热点函数,其主要为单比特计算,在进行底层硬件架构设计时可通过增加单比特计算逻辑来提高其处理速度。
(2)对于后端非线性优化部分中的Solver 热点函数,其主要为浮点计算,在进行底层硬件架构设计时可通过增加浮点乘加部件来提高其处理性能。其计算模式更适用于Vector 或SIMD 模式。
随着同步定位和建图技术的广泛应用,基于特征点法的同步定位和建图系统ORB-SLAM 系统成为热门的研究方向。目前缺乏面向基于ORB-SLAM系统底层硬件架构设计指导的系统特征分析的研究。因此本文首先针对ORB-SLAM 系统进行了详细的介绍;然后对ORB-SLAM2 系统进行了热点函数实验分析,得到了ExtractorORB 和Solver 2 个热点函数;最后对2 个热点函数进行了IPC、分支预测失效率、一级数据缓存读失效率、最后一级缓存失效率和最后一级缓存MPKI 等特征的评估,为面向ORB-SLAM 系统的底层硬件架构设计提供了指导性建议。