算法流程
- 将每一张新输入的深度图融合到哈希表中,同时去除无效的体素来保持存储的稀疏性。
- 渲染生成当前位姿的深度图和彩色图用于下一帧的ICP计算位姿,采用渲染图的目的是保证定位是frame-to-model的。
数据结构
- 在表面附近创建体素快,每个体素块包含83个体素,每个体素中存储sdf值,RGB值和权重。
- hash表中每一个元素存储对应的三维坐标值,指向对应体素快的指针和为了处理重复冲突的指向其他hash表的指针。hash表的序号由三维坐标x,y,z,三个大素数p1,p2,p3和哈希表长度n计算得到: H ( x , y , z ) = ( x ⋅ p 1 ⨁ y ⋅ p 2 ⨁ z ⋅ p 2 ) m o d n H(x,y,z)=(x \cdot p1 \bigoplus y \cdot p2 \bigoplus z \cdot p2) ~ mod ~ n H(x,y,z)=(x⋅p1⨁y⋅p2⨁z⋅p2) mod n
冲突处理
在出现冲突时,在hash表的同一个哈希块中找到空位插入。
元素插入
根据x,y,z计算出位置,在hash中找到目标位置进行融合和创建体素。查找过程可能需要便利冲突处理的链表。在并行计算时,锁住正在处理的哈希块避免处理冲突,这可能会导致一些插入操作有延时,但不影响最终的效果。
元素删除
在删除无效的体素时,需要维护链表。
体素块更新
对于每一帧图像的每一条射线,根据截断的距离生成和插入所有的体素块。便利哈希表,并行处理所有需要更新,删除的体素。
本地体素快的管理
为了加快计算,在每个流程的开始,将不在视野中的体素块移出,并加入新进入视野的体素块。