作者简介:
易晓东,博士,教授,主要研究方向为操作系统、机器人软件.E-mail:yixiaodong@nudt.edu. cn.
杨思宁,硕士研究生,主要研究方向为视觉SLAM、环境建模、地理空间信息.E-mail:yangsining16@nudt.edu.cn.
杨绍武,博士,助理研究员,主要研究方向为SLAM、环境建模、空间数据库、地理空间信息.E-mail:shaowu.yang@nudt.edu.cn.
在未知的三维环境中,移动机器人自主导航通常需要实时构建与环境全局一致的栅格地图,而现有大部分系统缺少地图更新策略,构建的栅格地图与实际环境不一致.文中将同步定位与建图模块获得的环境信息以点云形式提供给栅格建图模块处理,同时提出基于关键帧的高效数据结构和地图实时更新策略,实时构建可用于移动机器人自主导航的全局一致的地图.室内动态的实验数据测试表明,文中方法可以有效实时更新地图,生成与环境一致的三维栅格地图,支持其后续的自主导航操作.
About the Author:YI Xiaodong, Ph.D., professor. His research interests include operating systems and robotics software.
YANG Sining, master student. Her research interests include visual SLAM, environment modeling and geospatial information.
A real time globally consistent three-dimensional(3D) grid mapping method is usually required for autonomous navigation of mobile robots in complex unknown 3D environments. Grid maps built by the existing simultaneous localization and mapping(SLAM) system are inconsistent with environments due to the lack of updating strategy. In this paper, information of environment provided by SLAM module are processed by the grid mapping module. A real-time updating strategy and an efficient data structure based on keyframe are proposed to produce globally consistent 3D maps and they are suitable for real time navigation of robots. Experimental results in dynamic indoor scenarios demonstrate that the 3D mapping method can update map in real time and build globally consistent 3D grid map to support the autonomous navigation.
移动机器人在接到任务时, 所处的工作环境绝大多数都是未知、非结构、动态变化的, 而绝大多数任务都需要移动机器人能在工作环境中进行自主导航, 这就要求机器人能对环境进行实时建图并且地图可以进行路径规划操作.
同步定位与建图(Simultaneous Localization and Mapping, SLAM)技术可以估计机器人的位姿并得到环境的精确信息[1].目前主流的SLAM系统构建的地图主要分为稠密地图、半稠密地图和稀疏地图[2, 3, 4, 5, 6, 7].这类地图通常是由孤立的点云构成, 未对空间进行划分, 从而不知道障碍物的位置及某个区域是否可以通行.因此如要将SLAM系统生成的地图应用于移动机器人的导航中, 需要实时将其转换成其它可用于路径规划的环境表示形式.
通常二维栅格地图适合应用在路径规划中, 但由于缺少高度上的维度, 不能满足无人机等具有三维机动性的移动机器人的需求[8].在某些特殊情况下, 2.5维栅格地图是一种可行的环境建模方法, 它通常在每个二维栅格中存储对应区域的测量高度以表示环境[9, 10], 但是无法模拟具有多层结构的环境, 如桥梁、隧道等.多层表面地图是对二维栅格地图的扩展, 每个栅格中存储环境的多个高度数值, 可模拟多层环境[11].但是这类地图大部分是在垂直方向上对环境进行离散化, 难以精准表示具有多层结构的环境及难以判断机器人能否在该环境中通行.因此, 对于具有多层结构的复杂环境, 移动机器人要在其中进行路径规划操作, 三维栅格地图是一种较好的环境表示模型.在大范围的环境下, 三维栅格地图将造成内存消耗[12]过多.Payeur等[13]引入基于八叉树的概率模型, 模拟被占用的空间及未被占用的空间, 大幅降低内存消耗, 但没有明确解决地图压缩的相关问题.Fairfield等[14]提出利用八叉树实现地图压缩的方法, 但是执行的最大似然压缩有损, 会周期性丢弃概率信息, 造成地图后期不能更新, 导致路径规划缺乏必要信息.基于概率模型及八叉树压缩方法, Hornung等[15]提出开源系统OctoMap, 可以克服这些相应缺点, 并能生成高效紧凑、信息完整的三维栅格地图, 是一种准确模拟环境的高效模型.
针对SLAM技术生成的地图实时转换为三维栅格地图, 现有方法主要分为两种:1)在收集全部环境信息之后, 将其转换为三维栅格地图.Fairfield 等[14]利用Rao-Blackwellized粒子滤波器计算得到机器人位姿与环境信息, 再使用基于八叉树结构的三维栅格表示环境.这种方法能保证构建的结果地图与滤波计算的环境信息一致, 但是未考虑闭环结构, 不能满足实时性的需求.2)在利用SLAM技术收集环境信息构建环境模型的同时, 转换为三维栅格地图.Maier等[16]使用深度相机实时获取环境信息, 并转换为三维栅格地图.但是当栅格地图建成时, 由于系统缺乏对栅格地图的实时更新策略, 导致地图中系统运行时产生的累计误差无法修正, 最终生成的栅格地图与实际环境不一致.此外, Endres等[2]和Whelan等[17]同样基于SLAM技术, 将得到的环境信息生成栅格地图, 但也存在缺乏对栅格地图实时更新策略的问题.特别是当环境中存在闭环结构时, 无法处理闭环结构在栅格地图中的优化更新显示, 导致生成的栅格地图与实际环境有较大出入.因此, 需要设计能实时处理地图变化并构建与实际环境一致的可用于导航的建图方法.针对该问题, 文献[18]将视觉SLAM技术与栅格建图过程相联成为一个系统, 提出地图更新策略, 并在较小的静态环境中检验该系统的实时性能.
在前期工作的基础上, 本文完善实时更新地图的更新策略, 提出可实时更新的三维栅格建图方法, 生成的三维栅格地图与动态环境全局一致.该系统由视觉SLAM模块及栅格建图模块组成.视觉SLAM模块将环境的精准稠密信息以点云的形式提供给栅格建图模块, 然后栅格建图模块实时处理这些数据并生成全局一致的三维栅格地图.此外, 本文还提出基于关键帧识别码的高效数据结构和地图压缩策略, 加速更新策略的效率.
本文提出的实时更新的三维栅格建图方法由视觉SLAM模块和栅格建图模块组成.基于ORB-SLAM系统[3]构建视觉SLAM模块, 使用深度相机从环境中提取点云信息.在栅格建图模块中, 使用基于关键帧的实时更新策略, 保证与环境全局一致的三维栅格地图构建.同时, 本文提出基于关键帧识别码的高效数据结构和压缩策略, 可同时满足最小化内存消耗要求和保证更新地图相关信息的完整性.
视觉SLAM模块将精确的环境点云信息提供给栅格建图模块.如图1所示, 该模块包括位姿跟踪线程、局部建图线程及闭环处理线程.
位姿跟踪线程负责处理深度相机得到的原始图像, 获得位姿估计, 并决定何时插入新的关键帧.在添加新的关键帧时, 该线程根据深度图像和当前估计的世界坐标系下的位姿计算当前关键帧对应的点云[19].然后, 将点云数据及相应关键帧识别码传给栅格建图模块.
局部建图线程执行局部光束平差(Bundle Ad-justment, BA), 优化关键帧的位姿和地图点的位置.在共视图(Covisibility Graph)[3]中, 当前关键帧与一系列关键帧相关联, 称为关联关键帧.对比当前关键帧的关联关键帧的集合和与上一帧关键帧的关联关键帧集合, 不再在该集合中的关键帧可认为在一段时间内稳定不再更新, 称为稳定关键帧.在执行局部光束平差优化后, 根据优化后的位姿重新计算稳定关键帧对应的点云信息, 并将此传给栅格建图模块.
闭环处理线程主要执行闭环检测和全局位姿图优化(Pose-Graph Optimization).当检测到闭环后, 执行全局位姿图优化.当优化结束后, 发消息给栅格建图模块, 删除旧的八叉树, 同时新建一个新八叉树.同时, 所有点云数据都根据优化后的位姿重新计算, 然后基于关键帧识别码组织并传递给栅格建图模块.
基于实时更新策略, 栅格建图模块处理从视觉SLAM模块接收到的点云数据, 生成全局一致的三维栅格地图.为了系统可以实时运行, 本文还提出基于关键帧识别码的高效数据结构, 以及基于此结构的地图压缩策略.
基于开源项目OctoMap构建栅格建图模块, 因为该模块继承高效的内存实现及占有概率模型[15].当有数据插入八叉树中时, 增加相应节点的占有概率, 直至达到阈值[20].达到阈值的节点认为是稳定占有的.否则, 当有数据从八叉树中删除时, 相应节点占有概率减少, 直到达到阈值.其它占有概率未知的地方认为是未知区域.
另外, 本文将对应于不同关键帧的点云视为空间中的重叠组.由一个关键帧观察到的点云划分到一组, 并认为其中点的相对位置不变.基于关键帧进行视觉SLAM模块的优化, 因此在栅格建图模块中, 考虑将相应的关键帧识别码附加到点云数据上.在视觉SLAM模块执行完光束平差优化后, 可根据更新后的相应关键帧位姿更新点云的位置.
1.2.1 带有关键帧识别码集的八叉树
基于OctoMap 的高效存储方式构建三维栅格地图的数据结构.所有内部节点都只存储地图点本身相关的数据(如被占有概率和颜色信息等)及指向子节点的指针(如果存在)[15].
另外, 本节提出基于关键帧的高效数据结构, 称为关键帧识别码集, 它在数据结构中存储相应的关键帧识别码信息, 结构示意图如图2所示, 节点中包含的一系列数字对应内部点云对应的关键帧识别码.
当八叉树更新时, 数据结构的维护过程如下:首先遍历更新节点的父节点, 将新添加/删除的关键帧识别码在父节点的关键帧识别码集中进行相应的添加/删除.同时, 为了避免机器人碰撞, 涉及到的相关内节点的占有概率采用其子节点的最大占有概率, 颜色采用子节点的平均颜色.
在更新策略中, 涉及到八叉树的查找, 由于本文提出的数据结构维护关键帧识别码集, 查找效率远高于传统的八叉树.具体地, 八叉树中查找方法基于坐标信息或遍历全部节点, 在节点特别多时会有巨大的时间开销, 这在一个对实时性有要求的系统中是不可接受的.而在本文结构中, 如图2中黑体数字所示, 可根据关键帧识别码集直接追溯关键帧识别码, 找到相应的节点, 因此搜索路径可限制在有限的节点中, 查找时间也限制到一个很小的可接受时间范围内.
1.2.2 地图压缩策略
为了使内存消耗最小化, 基于数据结构, 本文提出地图压缩策略.本文认为同一帧中观测到的点云位置相对恒定, 而关键帧识别码集中具有相同关键帧识别码的八叉树节点中的点云, 是被相同关键帧观测到的, 因此可以推断, 它们的相对位置也恒定.因此, 当某个节点的所有子节点的关键帧识别码集都一样时, 这些子节点可合并为一个节点.
因此, 如图2中的灰色节点所示, 压缩策略中的剪枝条件是, 如果关键帧识别码集中八个子节点具有相同的关键帧识别码, 则可以被剪枝.同时, 为了适应路径规划, 它们的父节点采用子节点的最大占有概率及平均颜色值.此压缩策略能保留与路径规划相关的信息, 同时减小地图存储消耗.由于节点数量减少, 地图的更新效率也在一定程度上提高.
1.2.3 实时更新策略
图1中实时更新策略包括如3个过程:初始建图、局部优化建图及闭环建图.
初始建图将世界坐标系下的点云插入八叉树中, 它们是由视觉SLAM模块根据深度图像和相应位姿计算得出.当视觉SLAM模块检测到闭环时, 计算的数据将插入一棵新的八叉树中.此外, 每处理20帧关键帧, 将遍历一次八叉树检测是否满足剪枝条件, 执行压缩策略.
局部优化建图过程是在视觉SLAM模块执行局部优化后, 接收到稳定关键帧的相应关键帧识别码及优化后的点云数据, 然后更新相应的八叉树节点.具体地, 首先根据关键帧识别码搜索到相应节点, 更新相应占有概率, 然后插入更新后的点云数据.和初始建图相同, 当视觉SLAM模块检测到闭环时, 优化后的数据将插入那棵新的八叉树中.
在闭环建图过程中, 在视觉SLAM模块检测到闭环, 并执行全局优化后, 几乎更新所有关键帧的位姿, 因此如果继续采用局部优化建图中的更新策略, 由于节点数巨大, 该过程将无法实时执行.
因此, 此处采取丢弃旧八叉树重建, 同时新的数据插入该棵新八叉树中的策略.具体地, 在视觉SLAM模块中重新计算所有点云的信息并插入一棵新的八叉树中.同时, 初始建图与局部优化建图的新数据也插入这棵八叉树.由于维护关键帧识别码集结构的时间与八叉树节点数量成线性关系, 因此每处理20个关键帧更新一次关键帧识别码集.长期观察发现, 这并不会影响地图健壮性, 并可将耗时降低到一个可接受的较少的时间, 保证该过程可以实时执行.
本文方法在机器人操作系统中实现, 它提供视觉SLAM模块和栅格建图模块之间的通信环境.本文分别在准确性和实时性方面定性和定量评估此方法.
实验使中使用的数据集由实验室装有Kinect传感器的Turtlebot平台提供.该系统在配有Ubuntu 16.04 64位操作系统, Intel Core i5-7400(4 内核@3.0 GHz)CPU和8 GB RAM的电脑上运行.
实验中为了更好地验证系统的鲁棒性, 相比前期工作中的静态实验环境[18], 本文的建图区域为相对较大的会议室, 同时包含动态行走的人.
由于三维环境的模型数据不可得, 而地图性能的定量对比也仍是一个开放性的问题, 所以本文只能定性分析系统建成的栅格地图的性能.
图3(a)为视觉SLAM模块在闭环全局优化后得到的点云形式的稠密地图, 右下为实验环境的完整地图, 红框圈出位置为闭环发生位置, 左边为红框圈出地点的细节放大图, 右上为完整地图的反面图(地板图), 该对应关系在其它子图中也成立.
b)为仅通过初始建图构建的栅格地图, (c)为通过初始建图及局部优化建图构建的栅格地图, (d)为通过完整的更新策略(即初始建图、局部优化建图及闭环建图)构建的全局一致的三维栅格地图.
在实验中, 当实验数据以20帧/秒的速度运行时, 视觉SLAM模块可以正常处理并计算相应点云信息, 因此可假设它计算的点云数据与实际环境全局一致.由于稠密图是根据这些点云生成, 因此认为图3(a)与实际环境保持一致, 可作为定性的环境模型, 评估生成的三维栅格地图的性能.
观察图3(d)右下圈出的动态行人, 可看到(b)中有物体生成的相应栅格块, 而(c)中相应位置没有.这是因为初始建图时观测到行人, 因此相应部 分占有概率增加, 可视化时建出行人相关部分的栅格.而在局部优化时, 根据相邻关键帧信息优化该部分的信息, 由于行人在此区域停留时间过短, 因此未建出行人的栅格块.在(d)中建出行人的栅格块最接近(a).
再观察每个子图左边细节放大图, 可看到, 图3(d)中沙发符合实际情况, 只有一个, 而(b)、(c)中该部分成为两层.这是因为此处为闭环发生处, 初始建图在回到该地点时认为到了一个新的地方, 导致点云数据重叠成两层, 局部优化实现相邻关键帧的姿态的优化, 使得局部地图相对更准确, 因此(c)的分层情况有所缓解, 但仍然与环境不一致.(d)中经过全局闭环优化后, 生成的栅格地图与环境一致, 沙发只有一层, 地面也融合为一层, 最接近(a).
观察每个子图的地面反面图也可得出相同的结论, 图3(b)、(c)地面出现不同程度的分层, 只有(d)与(a)一致, 没有冗余的多层, 是一层.
由此可推断图3(d)中的栅格地图最接近(a)中的点云信息, 可见经过更新策略之后构建的栅格地图与环境的密集点云图一致, 与环境全局一致.
本节分析方法运行的时间开销, 评估方法的实时性, 同时讨论数据结构和地图压缩策略带来的性能提升.此外, 时间开销取决于建图区域大小和栅格地图的分辨率.在该实验中, 建图区域为大会议室(15× 17× 3.3 m3), 分辨率为5 cm.
本文方法包括视觉SLAM模块及栅格建图模块, 因为视觉SLAM模块为基于ORB-SLAM系统构建, 可以实时执行, 所以本节主要分析栅格建图模块的实时性能.在栅格建图模块中, 主要耗时过程有:1)维护数据结构, 2)更新时查找相应的八叉树节点, 3)满足剪枝条件时压缩冗余节点, 4)在检测到闭环全局优化后八叉树重建.
2.3.1 维护数据结构的时间
在初始建图中, 每当新节点插入八叉树时, 将更新相关节点的关键帧识别码集及其占有概率.因此, 维护数据的时间成本理论上会随着节点数的增加线性增加, 而节点数可看成处理关键帧数目的倍数.
如图4所示, 维护数据结构的时间随着处理关键帧数量线性增加, 符合理论分析.偶尔的波动是因为新的节点引入新的关键帧识别码, 导致相关节点都要更新, 从而费时.在关键帧760左右时突然下降, 是因为检测到闭环, 根据本文提出的更新策略, 此时八叉树重建, 所以节点数量短时间内大量减少, 维护数据结构的时间也大幅减少.但并未减少到0, 是因为此时初始建图和局部优化模块仍在运行.此部分每帧的运行时间最大不超过1.6 s, 满足实时需求.
2.3.2 更新时查找八叉树节点的时间
在局部优化建图中, 接收到优化后的点云数据应更新到八叉树中.此时会更新八叉树节点, 即根据关键帧识别码找到之前的数据, 减少相应占有概率, 然后将优化后的数据插入八叉树中.
本节对比3种处理方式下的八叉树节点的查找时间:传统八叉树结构、采用剪枝操作的传统八叉树结构、本文提出采用关键帧识别码集的八叉树结构.
3种方法实验结果如图5所示, 使用添加关键帧识别码集结构查找能在有限时间(小于5 ms)内完成, 不随八叉树节点的增加而增加.而传统八叉树结构的查找时长最大, 其次是采用剪枝操作的传统八叉树结构, 它们都随着八叉树节点数而线性增加(时长突然下降是因为闭环优化后八叉树重建, 暂时减少节点数).这是因为传统八叉树结构需要遍历整棵八叉树, 当节点数很多时查找时间过长.而采用剪枝操作能减少冗余节点, 因此时长会短于不采用剪枝操作的结构.剪枝操作提升大约14%的查找效率.
而使用关键帧识别码集的结构时, 只需根据关键帧识别码追溯到相关节点即可, 这能将搜索路径限制到有限节点中, 查找时间因此也限制在较小的时长内.使用关键帧识别码集结构后, 查找效率提升大约85%~93%, 可以保证系统的实时运行.
2.3.3 剪枝操作的时间
当八叉树节点满足压缩策略中的剪枝条件时, 会进行剪枝操作.剪枝操作的时间如图6所示, 最多不超过6 毫秒/帧.在关键帧数约为433之前线性增加, 之后突然下降.突然下降是因为没有节点满足压缩策略的剪枝条件, 并且通过遍历节点查找它们是否满足时间成本修剪条件非常接近零.另外, 时长波动的原因是新节点的加入使八叉树的子树满足剪枝条件, 压缩操作消耗一些时间.同时, 由于八叉树节点的数量减少, 下一个剪枝操作的时间也相应减少.
2.3.4 闭环优化后八叉树重建的时间
当系统检测到闭环, 并全局优化后, 根据本文的实时更新策略, 应重建八叉树, 这需重新计算构建整个栅格地图.如1.2.3节所述, 每20个关键帧执行1次维护数据结构操作, 可将时间成本降低到一个较小的可接受值, 并不影响数据的正确性.在本次实验中, 可在5.217 s内构建完成434 850个节点, 显然满足实时性的要求.
本文提出实时更新的全局一致的三维栅格建图方法, 同时设计基于关键帧识别码的高效数据结构.本文提出的更新策略保证建图的全局一致性.在相对较大的动态环境中进行实验, 实验表明, 该建图方法可实时处理环境中的闭环结构, 并可实时生成全局一致的三维栅格地图.此外, 本文方法的源代码和数据集都是公开的(https://github.com/daysun/octomap_ros, https://github.com/daysun/ORB-SLAM2, https://pan.baidu.com/s/1u2Xu4t035IXJVRH1011Whg).
与此同时, 本文方法也存在需要改进的方面.首先是实时更新策略, 在环境中存在较多闭环时, 八叉树全部重建的时长可能无法满足实时建图的要求, 因此可考虑闭环相关部分的八叉树重建与初始建图、局部优化建图等过程并行进行, 它们的数据都插入同一棵八叉树, 这样既不影响实时建图, 同时也解决多闭环的问题.
另一个可以考虑的方向为, 闭环相关部分的八叉树同样需要重建, 闭环发生后一个阶段的初始建图、局部优化建图生成的点云数据插入另一棵八叉树中, 然后根据关键帧识别码区分两棵八叉树的重叠部分, 同时两棵八叉树通过索引构建联系.但此种方法存在一些待解决的问题, 如空间中的同一地点在视觉SLAM模块中可能被不同关键帧观测, 于是在多棵树中产生冗余数据.在优化过程中, 可能存在很多冗余操作, 既耗时又耗内存.如何有效处理这些冗余数据, 或如何构建它们之间的联系将其消除, 是未来的研究方向之一.
未来可能的另一个工作为利用建好的三维栅格地图进行实时路径规划.思路大致如下:根据机器人的高度将实时生成的三维栅格地图投影到不同水平高度上, 根据节点的占有概率生成不同高度的可通行地图.然后联系这些可通行地图生成一张全局的可通行地图, 根据可通行地图即可进行实时路径规划.如何实时处理上述操作仍是一个挑战.
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|
[11] |
|
[12] |
|
[13] |
|
[14] |
|
[15] |
|
[16] |
|
[17] |
|
[18] |
|
[19] |
|
[20] |
|