MAV构建ESDF来规划轨迹以及避障。本文提出使用TSDF来生成ESDF。此方法比octomap快,准确。代码开源,可以实时在CPU运行。
路径规划算非常快,可以deal复杂环境。但是需要环境中每个障碍物距离信息,以及距离梯度。octomap可以计算这些,但是map大小必须事先给定,不能增量建图。
TSDF和ESDF不同:使用了projective distance。只在truncation radius内计算距离。
OCtree只有occupancy的信息,不完全。像CHMOP等需要距离信息。
本文方法基于kinect fusion, 也就是用volumetric方法生成TSDF图。但这种方法无法增量构建,于是本文使用voxel hashing方法动态构建地图。
我们的目标不是构建高精地图,而是给motion planning使用。因此分辨率都比较大,来达到实时。
我们和gpgpu不同的是,不是完整构建TSDF之后才增量构建ESDF,而是二者都为增量,这样就比batch methods快。
使用深度相机得到彩色点云作为输入。
每个voxel有自己的layer,每个layer有独立的block,block在地图中有编号。hashing就是在block 位置和内存位置之间有映射关系。因此可以growing map。
把点云raycast到全局地图中,然后把每个voxel中的点的投影距离作平均。weighting就是如何把测量给平均,merging就是如何把data分组整合。
通常方法是从sensor中心ray-cast,更新weight和distance。每个scan中有1k+点整合到一个voxel里。
KinectFusion 使用了constant weight来更新。然而,本文结合了相机模型,设计了一个W_quad,其中在surface后面的话就会==0.
在多视角观察到表面的时候,减少了没观察到的voxel的影响。
有两种方法把pointcloud group到voxel中:raycasting 和projection mapping。raycasting从相机光心发出,之后更新所有照射到的区域。projection mapping把提速project到图片上,比较voxel–center的距离和depth。这个方法更快,但是对大体素会产生混叠效应。
本文方法,grouped raycasting,加速了raycasting。对每一个scan,将其投影到一个voxel,之后将同一个voxel中所有point取平均,只作一次raycasting。
用了wave-front, 就是BFS, 周围格子是26联通。两种传播方法:raise和lower。当TSDF中新距离比之前ESDF中距离大的时候,将Voxel加到raise queue中。则voxel以及其children都要是invalidated。如此传播直到没有voxel的parent是invalidated。
lower传播就是一个新voxel进来,或者之前观测到的voxel比当前值要小。邻近的voxel更新,根据与当前voxel的距离。当没有voxel距离可以比邻居更小,传播停止。
grouped octomap虽然比原本快,但还是没有TSDF方法快,因为tree是层级结构,查找用时还是O(logn),而TSDF是O(1).
比较了不同weight的效果差异,不同方法(raycast, octomap)带来的时间差异。
使用了一个球,三个平面,一个立方体来进行仿真。
euroc结果。
得出结论,单voxel band,quansi-euclidean distance,优先队列,这些技术更好。
4hz,。
无人机5min的球,球内un-obsv的voxel为occupied。
因为无法知道自己所处位置的情况,设一个1m的球,球内所有un-obsv的voxel为free。