PRN(20201012):Improved updating of Euclidean distance maps and Voronoi diagrams

article/2025/9/18 7:16:29

[*] Lau B , Sprunk C , Burgard W . Improved updating of Euclidean distance maps and Voronoi diagrams[C]// IEEE/RSJ International Conference on Intelligent Robots & Systems. IEEE, 2010.

本文对[*]中的Occupancy Map to Euclidean Distance Maps算法进行python实现。

论文中相关算法如下所示:
在这里插入图片描述

该算法能够根据加入或移除占据栅格地图的障碍物进行更新一幅欧式距离地图。

其中,论文中解释了pop(open)与insert(open, s, d)两个未给出伪代码的函数。文中说,pop(open)是从open中找到距离最小的一个元素返回,并从open中删除。在实现过程中,按照最小距离返回时,当从有多个障碍物的地图中移除掉一个障碍物时,程序会陷入无止尽的循环。经验证,如果按照最大距离返回时,可正常运行。

在这里插入图片描述
论文中也补充到,给每个栅格增加一个属性:process,来达到类似于加入open与移除open队列的目的。
在这里插入图片描述

算法python实现

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
open_list = []dist = 99999.0*np.ones((30, 30))
obst = -1*np.ones((30, 30))
toRaise = np.zeros((30, 30))
process = np.zeros((30, 30))def S2IJ(s):i = int(s//30)j = int(s%30)return i,jdef SetObstacle(i,j):obst[i,j] = i*30+jdist[i,j] = 0process[i,j] = 1
#     open_list.append([i,j])def RemoveObstacle(i,j):obst[i,j] = -1toRaise[i,j] = 1dist[i, j] = 99999.0process[i, j] = 1
#     open_list.append([i,j])def Raise(i,j):for ni in [-1, 0, 1]:for nj in [-1, 0, 1]:if ni == 0 and nj == 0:continuexi = i + nixj = j + njif xi < 0 or xi >= 30 or xj < 0 or xj >= 30:continueif (obst[xi, xj] >= 0) and (toRaise[xi, xj] == 0):oi, oj = S2IJ(obst[xi,xj])  if (oi != xi) or (oj != xj):dist[xi,xj] = 99999.0
#                     print(xi,xj,oi,oj,obst[xi, xj])obst[xi, xj] = -1toRaise[xi, xj] = 1
#                 else:
#                     for i in range(30):
#                         for j in range(30):
#                             toRaise[i,j] = 0process[xi, xj] = 1
#                 open_list.append([xi, xj])toRaise[i,j] = 0def Lower(i, j):si, sj = S2IJ(obst[i, j])for ni in [-1, 0, 1]:for nj in [-1, 0, 1]:if ni == 0 and nj == 0:continuexi = i + nixj = j + njif xi < 0 or xi >= 30 or xj < 0 or xj >= 30:continue            if toRaise[xi, xj] == 0:d = np.sqrt((si-xi)*(si-xi)+(sj-xj)*(sj-xj))if (d < dist[xi, xj]) or (obst[xi, xj] < 0):dist[xi, xj] = dobst[xi, xj] = si*30+sjprocess[xi, xj] = 1
#                     open_list.append([xi, xj])def Pops(): # get the element with max distancemax_index = -1max_dist = -1.0for i in range(30):for j in range(30):if process[i,j] == 1:if dist[i,j] > max_dist:max_dist = dist[i,j]max_index = i*30+jif max_index < 0:return False, max_indexelse:oi, oj = S2IJ(max_index)process[oi, oj] = 0return True, max_indexdef UpdateDistanceMap():not_empty, s = Pops()while not_empty:i,j = S2IJ(s)if toRaise[i,j] == 1:Raise(i,j)   
#             print("raise")
#             print(i,j)else:if obst[i,j] >= 0:Lower(i,j)
#                 print("lower")
#                 print(i,j)not_empty, s = Pops()
从空白地图上加入一个障碍物
SetObstacle(15, 15)
%time UpdateDistanceMap()
plt.imshow(dist)
plt.show()

时间成本:
Wall time: 325 ms

欧式距离地图:
在这里插入图片描述

增加一个障碍物
SetObstacle(5,5)
%time UpdateDistanceMap()
plt.imshow(dist)
plt.show()

时间成本:
Wall time: 93.8 ms

欧式距离地图:
在这里插入图片描述

再增加一个障碍物
SetObstacle(10, 25)
%time UpdateDistanceMap()
plt.imshow(dist)
plt.show()

时间成本:
Wall time: 71.9 ms

欧式距离地图:

从地图上移除一个障碍物
RemoveObstacle(5,5)
%time UpdateDistanceMap()
plt.imshow(dist)
plt.show()

时间成本:
Wall time: 854 ms

欧式距离地图:
在这里插入图片描述

重新加入一个新的障碍物
SetObstacle(25,25)
%time UpdateDistanceMap()
plt.imshow(dist)
plt.show()

时间成本
Wall time: 58.6 ms

欧式距离地图

在这里插入图片描述

补充

欧式距离地图可进一步得到Voronoi地图(如论文中给出的例子):

在这里插入图片描述
我们仔细观察以上程序中生成的欧式距离地图,也发现障碍物之间有类似边界的栅格:
在这里插入图片描述
因此,得到欧式距离地图后,可以很方便的得到Voronoi地图。

结论

欧式距离地图生成的时间成本很高,几乎不能用于无人驾驶局部代价地图生成。但是可以应用于相对静态的场景中。


补充20220622

原问题地址如下:
Improved updating of Euclidean distance maps and Voronoi diagrams问题
将问题引在此处:
通过读您对于这篇论文的解读,想要问您一个问题,即在整个地图中,是否Raise状态是只有碰到了边界或被占用的格子,才会停止传播raise并反向传播lower,并且传播lower的过程,是否为,所有的被占据的格子都要反向传播lower,有更省算力的方案吗

本人给出的解答如下:

有更省力的方案,先贴出更新后的代码:


def Raise(i,j):for ni in [-1, 0, 1]:for nj in [-1, 0, 1]:if ni == 0 and nj == 0:continuexi = i + nixj = j + njif xi < 0 or xi >= 30 or xj < 0 or xj >= 30:continueif (obst[xi, xj] >= 0) and (toRaise[xi, xj] == 0):oi, oj = S2IJ(obst[xi,xj])  if (obst[oi, oj] == -1): # 将原条件  ((oi != xi) or (oj != xj)): 替换dist[xi,xj] = 99999.0obst[xi, xj] = -1toRaise[xi, xj] = 1process[xi, xj] = 1toRaise[i,j] = 0

上面将论文中raise(s)算法中的第17行(原博客Python实现也是与原文献保持一致的)更改如上代码:将if (oi != xi) or (oj != xj): 替换成if (obst[oi, oj] == -1): .。更改后,删除一个障碍物的时间成本由原700ms降低为140ms。

原文献的做法是(和你理解的一样):一旦障碍物被删除,则将地图中所有不被障碍物占据的格子“格式化”,然后再调用距离传播函数lower(s)重新进行距离传播。
我此处给出的做法是:一旦有障碍物被删除,则只将那些被删除障碍标记的格子“格式化”。当存在多个障碍物时,每个障碍物影响不同区域的栅格。只有那些被删除障碍物标记的格子才需要重新计算距离值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(img-8Ewjl95S-1655887054461)(https://img-mid.csdnimg.cn/release/static/image/mid/ask/979829588556156.png "#left")]

如果大家还有更省力的方案,欢迎留言。


http://chatgpt.dhexx.cn/article/MPBgmGdQ.shtml

相关文章

java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...

最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算&#xff0c;而且有很多论文提出了Attention机制&#xff0c;所以这里就介绍一下如何使用tensorflow实现上述各种功能。 这里首先假定我们的输入是两个四维的Tensor&#xff0c;然后我们需要计算的是其…

点云检测--欧式聚类Euclidean Cluster

1.版本要求 版本: >PCL1.3 2.简介 欧式聚类是点云聚类的一种重要方法&#xff0c;利用点云中点与点之间的欧式距离进行聚类&#xff0c;当点与点之间的欧式距离小于设定的阈值则视为一类。欧式聚类是车辆前方障碍物检测的重要方法。 3.数据 本例中使用的点云数据&#…

Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MAV Planning

作者&#xff1a; 19届 lz 日期&#xff1a;2022-3-2 论文&#xff1a;《Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MA V Planning》 整个系统功能分为两部分&#xff1a; 将传入的传感器数据合并到 TSDF 中&#xff08;第 IV 节&#xff09;&…

3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation

文章目录 聚类结果一、论文内容1.1 Ground Surface Removal1.2 Fast Euclidean Clustering题外&#xff1a;欧几里得聚类Fast Euclidean ClusteringFEC利用具有点索引顺序的逐点方案的浅显理解 1.3 源码中问题说明 二、参考 聚类结果 原始代码中采用的是pcl中的搜索方式&#…

euclidean loss

个人感觉相当于L2范式开平方,也相当于针对两个向量的欧氏距离开平方 说的更直白点就是两个向量对应位置相减得到每个位置的差,然后把每个位置的差开平方再相加 前向传播cpp代码: template <typename Dtype> void EuclideanLossLayer<Dtype>::Forward_cpu(const vec…

Euclidean, Manhattan, hop-count distance 区别

欧式距离&#xff08;Euclidean Distance&#xff09; 二维空间的公式 其中&#xff0c; 为点 与点 之间的欧氏距离&#xff1b; 为点 到原点的欧氏距离。 曼哈顿距离&#xff08;Manhattan Distance &#xff09; 两点在南北方向上的距离加上在东西方向上的距离&#xff0c;…

扩展Euclidean算法求乘法逆原理详解与算法实现

【利用扩展Euclidean算法求乘法逆】 1. Equipment &#xff08;1&#xff09; operating system version &#xff1a;WIN 10 &#xff08;2&#xff09; CPU instruction set: x 64 &#xff08;3&#xff09; software &#xff1a;Visual Studio 2019 2. process Probl…

NEO4J-相似度算法04-欧几里得距离算法(euclidean)应用场景简介

说明&#xff1a;使用neo4j算法库时需引入跟neo4j数据库对应的算法库插件或自定义算法库 1.简介 欧几里德距离算法原理是计算n维坐标系中点与点之间地距离&#xff0c;如在三维坐标系中点A(p1,p2,p3),点B(q1,q2,q3),两个点之间得距离则为 &#xff1a;, 如果在n维坐标系中&…

欧几里德算法、拓展欧几里德、中国剩余定理

目录 欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff08;辗转相除法&#xff09;拓展欧几里德算法中国剩余定理作业1&#xff1a;作业2&#xff1a; 欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff08;辗转相除法&#xff09; 欧几里德…

logit回归模型_一文读懂条件Logistic回归

在医学研究中,为了控制一些重要的混杂因素,经常会把病例和对照按年龄,性别等条件进行配对,形成多个匹配组。各匹配组的病例数和对照人数是任意的,比如一个病例和若干个对照匹配即1:1,在医学上称作“1:1病历对照研究”,常见还有1:M(M <=3),即1个病例和1或2或3个对照…

目标检测-定位蒸馏:logit蒸馏与feature蒸馏之争

定位蒸馏 &#xff08;LD, CVPR 2022&#xff09; 先上我们文章和代码&#xff1a; 论文标题&#xff1a; Localization Distillation for Dense Object Detection 论文地址&#xff1a; https://arxiv.org/abs/2102.12252 代码地址1&#xff1a; https://github.com/HikariTJU…

biogeme-nest_logit-cnblog

biogeme-nest_logit 基础数据&#xff1a; optima.dat 变量的描述&#xff1a;出处 OccupStat&#xff1a;职业TimePT&#xff1a;公共交通通行时间TimeCar&#xff1a;小汽车通行时间MarginalCostPT&#xff1a;公共交通总成本CostCarCHF&#xff1a;小汽车的总汽油成本dis…

必看 logit回归分析步骤汇总

Logit回归分析用于研究X对Y的影响&#xff0c;并且对X的数据类型没有要求&#xff0c;X可以为定类数据&#xff08;可以做虚拟变量设置&#xff09;&#xff0c;也可以为定量数据&#xff0c;但要求Y必须为定类数据&#xff0c;并且根据Y的选项数&#xff0c;使用相应的数据分析…

PyTorch logit函数

1.PyTorch vs TensorFlow tensorflow是静态图&#xff0c;需要你把啥都准备好&#xff0c;然后它像个傻子一样执行&#xff0c;tensorflow&#xff0c;目前业界更适合部署&#xff0c;毕竟是静态图&#xff0c;infer的时候速度快。 pytorch&#xff0c;它会在执行的时候&…

logit回归模型_详解 Logit/Probit 模型中的 completely determined 问题

NEW!连享会推文专辑:Stata资源 | 数据处理 | Stata绘图 | Stata程序结果输出 | 回归分析 | 时间序列 | 面板数据 | 离散数据交乘调节 | DID | RDD | 因果推断 | SFA-TFP-DEA文本分析+爬虫 | 空间计量 | 学术论文 | 软件工具 连享会学习群-常见问题解答汇总:👉 WD 主页…

Logit Adjust

Logit Adjust BER 我们在分类问题中常用的误分类函数使得分类器最终学到的分布&#xff1a; P ( y ∣ x ) ∝ P ( y ) P ( x ∣ y ) P(y|x) \propto P(y)P(x|y) P(y∣x)∝P(y)P(x∣y) 假设在一个不平衡猫狗二分类问题中&#xff0c;狗是一个小类&#xff0c;只有整个数据集的…

logit

1.为什么需要logit回归? 线性回归不稳健 异常点对拟合直线的影响很大 so linear不适合做分类问题 2.为什么要sigmoid&#xff1f;sigmoid能做什么&#xff1f; y0&#xff0c;1是离散问题,直接建立方程 函数不连续——损失函数不可导——参数无法用梯度法优化 所以我们由 …

Logit 是怎么算的?

从知乎借几张图来描述&#xff0c;先看看odds 是什么&#xff1f; 然后Logit 就 是 Log of odds&#xff1a;

【计算机网络学习笔记】(汇总目录)

计算机网络学习笔记&#xff08;汇总目录&#xff09; 文章目录 点击以下标题&#xff0c;跳转到对应章节的详细讲解 【计算机网络学习笔记01】计算机网络概述&#xff08;上&#xff09; 【计算机网络学习笔记02】计算机网络概述&#xff08;中&#xff09; 【计算机网络学习…

计算机网络期末总结复习(全)

文章目录 第一章:概述1.1、计算机网络在信息时代的作用我国互联网发展状况1.2、因特网概述1、网络、互连网(互联网)和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成补充:1.3 三种交换方式1、电路交换(Circuit Switching)2、分组交换(Packet Switc…