实时扩展空间KinectFusion:动态映射与密集三角网格构建

需积分: 11 1 下载量 69 浏览量 更新于2024-09-06 收藏 746KB PDF 举报
本文档探讨了"Kintinuous Spatially Extended KinectFusion"(连续扩展空间Kinect融合)这一高级算法在实时高密度三维建模领域的应用。作者Thomas Whelan、John McDonald来自爱尔兰Maynooth的National University of Ireland,而Michael Kaess、Maurice Fallon、Hordur Johannsson和John J. Leonard则来自美国麻省理工学院的Computer Science and Artificial Intelligence Laboratory (CSAIL)。 KinectFusion是一种基于Kinect传感器的实时3D重建技术,最初用于创建静态室内环境的精确模型。然而,原始算法有一定的局限性,它假设一个固定的映射区域。为了克服这个限制,本文提出了一种改进方法,允许实时动态地扩展被Kinect Fusion算法处理的空间范围。这种扩展包括以下三个关键步骤: 1. **动态区域扩展**:通过修改算法设计,使其能够适应实时变化的空间需求,不再受限于预设的固定体积。这提高了系统的灵活性,使得系统能够适应更大的场景和移动过程中的环境变化。 2. **密集点云提取**:当空间范围变化时,从新纳入的区域内获取大量点云数据。这些数据是3D重建的基础,包含了丰富的几何信息。 3. **增量三角网格构建**:将收集到的点云逐次添加到环境的三角网格模型中,实现了动态且持续的3D模型更新。这种方法不仅保持了模型的实时性,还保证了模型的细节丰富度。 为了实现这一系统,作者们构建了一个基于层次结构的多线程组件架构,这显著提升了算法的性能并使其能够在实时环境中稳定运行。这种模块化设计使得新功能的添加和集成变得简单,有助于保持系统的可扩展性和易用性。 "Kintinuous Spatially Extended KinectFusion"算法革新了传统的KinectFusion技术,为实时三维建模在大型、动态场景的应用提供了强大的工具,对于诸如机器人导航、增强现实以及虚拟现实等领域具有重要意义。

class Path(object): def __init__(self,path,distancecost,timecost): self.__path = path self.__distancecost = distancecost self.__timecost = timecost #路径上最后一个节点 def getLastNode(self): return self.__path[-1] #获取路径路径 @property def path(self): return self.__path #判断node是否为路径上最后一个节点 def isLastNode(self, node): return node == self.getLastNode() #增加加点和成本产生一个新的path对象 def addNode(self, node, dprice, tprice): return Path(self.__path+[node],self.__distancecost + dprice,self.__timecost + tprice) #输出当前路径 def printPath(self): for n in self.__path: if self.isLastNode(node=n): print(n) else: print(n, end="->") print(f"最短路径距离(self.__distancecost:.0f)m") print(f"红绿路灯个数(self.__timecost:.0f)个") #获取路径总成本的只读属性 @property def dCost(self): return self.__distancecost @property def tCost(self): return self.__timecost class DirectedGraph(object): def __init__(self, d): if isinstance(d, dict): self.__graph = d else: self.__graph = dict() print('Sth error') #通过递归生成所有可能的路径 def __generatePath(self, graph, path, end, results, distancecostIndex, timecostIndex): current = path.getLastNode() if current == end: results.append(path) else: for n in graph[current]: if n not in path.path: self.__generatePath(graph, path.addNode(n,self.__graph[path.getLastNode()][n][distancecostIndex][timecostIndex]), end, results, distancecostIndex, timecostIndex) #搜索start到end之间时间或空间最短的路径,并输出 def __searchPath(self, start, end, distancecostIndex, timecostIndex): results = [] self.__generatePath(self.__graph, Path([start],0,0), end, results,distancecostIndex,timecostIndex) results.sort(key=lambda p: p.distanceCost) results.sort(key=lambda p: p.timeCost) print('The {} shortest path from '.format("spatially" if distancecostIndex==0 else "temporally"), start, ' to ', end, ' is:', end="") print('The {} shortest path from '.format("spatially" if timecostIndex==0 else "temporally"), start, ' to ', end, ' is:', end="") results[0].printPath() #调用__searchPath搜索start到end之间的空间最短的路径,并输出 def searchSpatialMinPath(self,start, end): self.__searchPath(start,end,0,0) #调用__searc 优化这个代码

2023-06-07 上传