参考与前言

Summary: 浩哥推荐的一篇 无人机下的建图 and planning实验

Type: ICRA

Year: 2021

论文链接:https://arxiv.org/abs/2105.04419

youtube presentation video:https://youtu.be/Bojh6ylYUOo

代码链接:https://github.com/zhudelong/VDB-EDT

1. Motivation

Eucliden distance transform EDT 对于机器人运动规划是很重要的,但是生成EDT 是比较费时的一件事,同时需要时刻更新并维护这样一个地图,本篇文章主要 通过优化数据结构和distance transform的过程来提升EDT算法的速度

在本文中,我们采用了树结构进行 hashing-based EDTs,主要是在做规划时发现 最优轨迹其实值需要考虑一定范围的障碍物, full distance information其实对于规划来说是冗余的,所以实际free部分都是一个值。These regions can then be efficiently encoded by a few number of tree nodes. Such a property is called spatial coherency, which can help further reduce memory consumption.

Benefiting from the fast index and caching systems, VDB achieves a much faster random access speed than Octree and also exhibits a competitive performance with the voxel hashing.

Contribution

  • the first time introduce the VDB data structure for distance field representation, which significantly reduces the memory consumption of EDT.
  • we propose a novel algorithm to facilitate distance transform procedure and significantly improve the running speed of conventional EDT algorithms.

2. Method

首先是问题定义,一个典型的distance transform问题 可以表达为如下公式:

\[\begin{array}{ll}d\left(x_i\right)=\min _{x_j} f\left(x_i, x_j\right), \\\text { s.t. } \quad x_i \in \mathcal{M}_f, x_j \in \mathcal{M}_o\end{array}
\]

其中,Mf是指free space,Mo是被占据空间,x为在grid map M中的坐标,目标函数f表示xi到xj之间的距离,目标是搜索对于每个xi都找其最近的xj作为距离

随后问题有了d(x) 后 我们就走到了 要找到一条安全的路径,则问题可表述为如下:

\[\begin{array}{ll}\min _{x_{0: N}} & \sum_{i=0}^N \alpha\left\|x_{i+1}-x_i\right\|+(1-\alpha) \max \left(0, d_{\max }-d\left(x_i\right)\right) \\\text { s.t. } & x_i, x_{i+1} \in \mathcal{M}_f \\& x_0=x_s, x_N=x_f \\& g\left(x_i, x_{i-1}, x_{i+1}\right)<\theta\end{array}
\]

其中,dmax是最大的transform distance,xs起点,xf终点,alpha为balance coefficient,g<theta主要是限制两个连续点之间产生较大的角度,平滑轨迹用的。目标函数中 前者为路径长度的cost,后者为避障的cost

2.1 数据结构

主要是介绍了VDB结构,由Museth[25] 提出的。It sufficiently exploits the sparsity of volumetric data, and employs a variant of B+ tree [32] to represent the data hierarchically.

下图是1D结构下的VDB,其和B+的几个特性是一致的,root node为索引,由hashmap建立,下面为internal node 和 leaf node保存了数据。也有本质上的不同:

it encodes values in internal nodes, called tile value. The tile value and child pointer exclusively use the same memory unit, and a flag is additionally leveraged to identify the different cases. A tile value only takes up tens of bits memory but can represent a large area in the distance field, which is the key feature leveraged to improve memory efficiency.

B+是一种平衡tree,在数据库中常用,主要原因是对于树结构的查询,程序加载子节点都需要进行一次磁盘IO,磁盘IO 比 读内存IO要慢 所以多叉的B+ tree可以减少I/O的次数

参考:b站视频 “索引”的原理 4min 建议感兴趣的可以再查询进阶数据结构书籍了解 实际上代码是直接openvdb库直接构建的

  • VDB: the branching factors are very large and variable, making the tree shallow and wide
  • Octree-based: deep and narrow, thus not fast enough for distance transform.

2.2 VDB-EDT

感觉这个看文中会比较好 主要是针对伪代码的解释

The distance field represented by VDB is essentially a sparse volumetric grid, and each field point is represented by a grid cell s indexed by a 3-D coordinate.

更新部分code:

void VDBMap::update_occmap(FloatGrid::Ptr grid_map, const tf::Vector3 &origin, XYZCloud::Ptr xyz)
{
auto grid_acc = grid_map->getAccessor();
auto tfm = grid_map->transform(); openvdb::Vec3d origin3d(origin.x(), origin.y(), origin.z());
openvdb::Vec3d origin_ijk = grid_map->worldToIndex(origin3d); for (auto point = xyz->begin(); point != xyz->end(); ++point) {
openvdb::Vec3d p_xyz(point->x, point->y, point->z);
openvdb::Vec3d p_ijk = grid_map->worldToIndex(p_xyz);
openvdb::Vec3d dir(p_ijk - origin_ijk);
double range = dir.length();
dir.normalize(); // Note: real sensor range should stractly larger than sensor_range
bool truncated = false;
openvdb::math::Ray<double> ray(origin_ijk, dir);
// openvdb::math::DDA<openvdb::math::Ray<double>, 0> dda(ray, 0., std::min(SENSOR_RANGE, range)); // if (START_RANGE >= std::min(SENSOR_RANGE, range)){
// continue;
// }
openvdb::math::DDA<openvdb::math::Ray<double>, 0> dda(ray, 0, std::min(SENSOR_RANGE, range)); // decrease occupancy
do {
openvdb::Coord ijk(dda.voxel()); float ll_old;
bool isKnown = grid_acc.probeValue(ijk, ll_old);
float ll_new = std::max(L_MIN, ll_old+L_FREE); if(!isKnown){
grid_distance_->dist_acc_->setValueOn(ijk);
} // unknown -> free -> EDT initialize else if(ll_old >= 0 && ll_new < 0){
grid_distance_->removeObstacle(ijk);
} // occupied -> free -> EDT RemoveObstacle grid_acc.setValueOn(ijk, ll_new);
dda.step(); } while (dda.time() < dda.maxTime()); // increase occupancy
if ((!truncated) && (range <= SENSOR_RANGE)){
for (int i=0; i < HIT_THICKNESS; ++i) {
openvdb::Coord ijk(dda.voxel()); float ll_old;
bool isKnown = grid_acc.probeValue(ijk, ll_old);
float ll_new = std::min(L_MAX, ll_old+L_OCCU); if(!isKnown){
grid_distance_->dist_acc_->setValueOn(ijk);
} // unknown -> occupied -> EDT SetObstacle
else if(ll_old < 0 && ll_new >= 0){
grid_distance_->setObstacle(ijk);
} // free -> occupied -> EDT SetObstacle grid_acc.setValueOn(ijk, ll_new);
dda.step();
}
} // process obstacle } // end inserting /* commit changes to the open queue*/
}

3. 实验及结果

各个阈值对时间的影响,其中对比了几个baseline方法如下:

  • A commonly-used general EDT [18] (denoted without -Ex suffix)
  • the proposed algorithm (denoted with -Ex suffix).
  • Two implementations based on the array and VDB data structures to compare their memory efficiency (denoted with Arr- and VDB- prefix, respectively)

可以看到 在时间上-Ex 的耗时都比无Ex的快,虽然VDB的速度上比arr的还是慢了一点 10%-25%,但是从memeory cost上确实节约了30-60%的 Herein, the increment of time cost is inevitable, as VDB is based on tree structures and has a slower random access speed than the array-based implementation

同样表格是在数据集上的表现,在global 和 incremental transform会慢一点,但是在memory上省了不少

还有一个就是无人机在仿真环境中建图并有planning效果:

4. Conclusion

提出了一种VDB-EDT算法去解决 distance transform problem. The algorithm is implemented based on a memory-efficient data structure and a novel distance transform procedure, which significantly improves the memory and runtime efficiency of EDTs.

这项工作突破了通常的EDT的限制,也可以为后面基于VDB-based mapping, distance transform and safe motion planning的研究进行使用


赠人点赞 手有余香 ;正向回馈 才能更好开放记录 hhh

【论文阅读】ICRA2021: VDB-EDT An Efficient Euclidean Distance Transform Algorithm Based on VDB Data Struct的更多相关文章

  1. 【论文阅读】ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

    ShuffleNet: An Extremely Efficient Convolutional Neural Network for MobileDevices

  2. 论文阅读笔记六十四: Architectures for deep neural network based acoustic models defined over windowed speech waveforms(INTERSPEECH 2015)

    论文原址:https://pdfs.semanticscholar.org/eeb7/c037e6685923c76cafc0a14c5e4b00bcf475.pdf 摘要 本文研究了利用深度神经网络 ...

  3. 【论文阅读】An Anchor-Free Region Proposal Network for Faster R-CNN based Text Detection Approaches

    懒得转成文字再写一遍了,直接把做过的PPT放出来吧. 论文连接:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1804.09003v1. ...

  4. 论文阅读之:Deep Meta Learning for Real-Time Visual Tracking based on Target-Specific Feature Space

    Deep Meta Learning for Real-Time Visual Tracking based on Target-Specific Feature Space  2018-01-04  ...

  5. 论文阅读-Temporal Phenotyping from Longitudinal Electronic Health Records: A Graph Based Framework

  6. 论文阅读:《Bag of Tricks for Efficient Text Classification》

    论文阅读:<Bag of Tricks for Efficient Text Classification> 2018-04-25 11:22:29 卓寿杰_SoulJoy 阅读数 954 ...

  7. 论文阅读笔记 Improved Word Representation Learning with Sememes

    论文阅读笔记 Improved Word Representation Learning with Sememes 一句话概括本文工作 使用词汇资源--知网--来提升词嵌入的表征能力,并提出了三种基于 ...

  8. [置顶] 人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)

    这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...

  9. 论文阅读(Xiang Bai——【PAMI2017】An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition)

    白翔的CRNN论文阅读 1.  论文题目 Xiang Bai--[PAMI2017]An End-to-End Trainable Neural Network for Image-based Seq ...

  10. BITED数学建模七日谈之三:怎样进行论文阅读

    前两天,我和大家谈了如何阅读教材和备战数模比赛应该积累的内容,本文进入到数学建模七日谈第三天:怎样进行论文阅读. 大家也许看过大量的数学模型的书籍,学过很多相关的课程,但是若没有真刀真枪地看过论文,进 ...

随机推荐

  1. 8.7K+ Star!快速搭建个人在线工具箱

    大家好,我是 Java陈序员. 作为一名 "CV 工程师",每天工作中需要用到各种各样的工具来提高效率. 之前给大家安利过一款离线的开发工具集合,今天给大家推荐一款在线的开发工具箱 ...

  2. C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)

    前言 本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考. 用 ...

  3. 网络拓扑—DNS服务搭建

    目录 DNS服务搭建 网络拓扑 配置网络 DNS PC 安装DNS服务 配置DNS服务 创建正向查找区域 创建反向查找区域 创建子域名 PC机DNS域名解析 DNS服务搭建 网络拓扑 为了节省我的U盘 ...

  4. 简易的 Linux 流量实时监控工具 watch+ifstat

    非常简单小巧的流量实时监控工具,贵在不需要安装,Linux 操作系统自带,在不出外网的环境中很是实用. watch -d ifstat eth1 如果连 ifstat 都没有的环境中也可以使用 ifc ...

  5. 自动化部署elasticsearch三节点集群

    什么是Elasticsearch? Elasticsearch 是一个开源的分布式搜索和分析引擎,构建在 Apache Lucene 的基础上.它提供了一个分布式多租户的全文搜索引擎,具有实时分析功能 ...

  6. springcloud整合stream解决项目升级的多个消息中间件的收发问题

    cloud stream (一)简介Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架.它可以基于 Spring Boot 来创建独立的.可用于生产的 Spring ...

  7. fabric compose文件解读(Orderer篇)

    orderer在fabric中的作用是排序,另外orderer有点像是管理节点一样,通道之类的都是在orderer的基础之上建立的,有点像比特币,以太坊上面的全节点一样,不过责任比全节点少很多,甚至都 ...

  8. Aspire项目发布到远程k8s集群

    前提 你必须会创建aspire项目,不会的请先看微服务新体验之Aspire初体验 Aspirate (Aspir8) Aspirate 是将aspire项目发布到k8s集群的工具 安装aspirate ...

  9. 深入解读Prometheus Adapter:云原生监控的核心组件

    本文详述了Prometheus Adapter的部署与配置,通过三个实践案例展示其在Kubernetes环境中的应用,帮助用户实现基于自定义指标的自动扩展和跨集群统一监控. 关注作者,分享AI全维度知 ...

  10. 后端给前端rtmp和flv直播 播放方法

    const suffixal = this.videoObj.videoServer .split('?')[0] .split('.') .pop() var router = this.$rout ...