无人机避障——基于ESDF地图的JPS算法前端路径规划

news/2025/2/12 1:33:50/

原来是用栅格地图的方式,0表示可通行区域,1表示不可通行区域,然后采用JPS算法做路径规划,从起点到终点规划出一条路径。但是目前我需要做的是将栅格地图更换为ESDF地图,那么JPS算法计算代价的部分是否需要进行变化。

栅格地图和ESDF地图的区别

首先,ESDF(Euclidean Signed Distance Field)地图不仅提供障碍物信息,还能给出每个点到最近障碍物的距离,这比二值化的栅格地图(0和1)包含更多信息。传统JPS在栅格中使用的是曼哈顿或欧氏距离作为启发式,而代价通常只是移动成本,比如每个格子的固定成本或者考虑地形因素。 

JPS算法中代价函数修改策略

接下来需要考虑如何修改JPS的代价函数。传统JPS的g(n)是起点到当前节点的实际代价,h(n)是当前节点到终点的估计代价。在ESDF中,g(n)可能需要包括当前节点的ESDF值,比如用1/(d+1)或者指数衰减函数来增加靠近障碍物的节点的代价。同时,启发式函数h(n)可能仍然保持欧氏距离,但需要确保它是可接受的,即不会高估实际代价,否则A*可能找不到最优路径。 

 另外,节点之间的移动成本也需要调整。在栅格中,相邻节点移动成本通常是固定的,比如1。但在ESDF中,可能需要根据相邻节点的ESDF值来调整移动成本。例如,从高ESDF值(远离障碍物)移动到低ESDF值(靠近障碍物)的区域,成本会增加,从而避免路径靠近障碍物。

 还需要考虑的是,ESDF地图中的距离值可能很大,直接使用这些值可能导致代价函数失衡,需要进行归一化或适当的缩放。例如,使用sigmoid函数将ESDF值转换为0到1之间的权重,再与其他因素结合。

可能的深层需求是希望路径在安全性和长度之间取得平衡。因此,代价函数可能需要一个权重参数,用来调整安全性和路径长度的优先级。比如,cost = distance_cost + safety_weight * safety_cost,这样用户可以通过调整safety_weight来改变路径的倾向。 

另外,需要注意ESDF地图的计算是否正确,确保每个节点的距离值准确。如果ESDF地图中存在噪声或错误,可能会影响路径规划的结果。因此,预处理ESDF地图,比如平滑处理或去除小的错误区域,可能也是必要的。 

ESDF地图特性与代价函数设计

def get_g(self, pos1, pos2):# ESDF安全代价(离障碍物越近代价越高)safety_weight = 0.6  # 安全系数(可调参数)slope_weight = 0.3  # 坡度权重(可调参数)d = self.ESDF_map[round(pos2[0])][round(pos2[1])]safety_cost = 1 / (abs(d) + 1e-5)  # 距离越近代价越高# 坡度惩罚(可选)slope_penalty = abs(self.ESDF_map[round(pos1[0])][round(pos1[1])] - d)if pos1[0] == pos2[0]:return abs(pos1[1] - pos2[1]) + safety_weight * safety_cost + slope_penalty * slope_weightelif pos1[1] == pos2[1]:return abs(pos1[0] - pos2[0]) + safety_weight * safety_cost + slope_penalty * slope_weightelse:return abs(pos1[0] - pos2[0]) * 1.4 + safety_weight * safety_cost + slope_penalty * slope_weight

启发函数改进

def heuristic(node, goal, esdf_map):# 基础欧式距离dx = abs(node.x - goal.x)dy = abs(node.y - goal.y)base_h = math.sqrt(dx**2 + dy**2)# 安全加成(可选)d = esdf_map[node.x][node.y]safety_h = 1 / (d + 1)  # 离障碍物越近启发值越高return base_h + 0.3 * safety_h  # 加权组合

关键参数说明 

参数推荐值作用
safety_weight0.3-0.8安全避障权重
slope_penalty0.1-0.3地形起伏惩罚
安全距离阈值3-5 cells拒绝进入该距离内的区域

效果对比 

指标原始A*ESDF-A*
路径长度最短略长1-5%
安全距离可能贴障碍物保持安全距离
计算时间增加20-40%
适用场景简单环境动态/复杂环境

仿真结果

 

 


http://www.ppmy.cn/news/1571294.html

相关文章

2.3-2.9学习周报

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、相关概念1.文本提取(DLE)2.以样本为中心的情境学习(SAIL)2.1问题公式化2.2文档级文本相似性2.3实体级文本相似性2.4布局相似…

基于 Nginx 的 CDN 基础实现

概览 本文是对基于Nginx的CDN网络的学习笔记,阅读的代码为:https://github.com/leandromoreira/cdn-up-and-running 其中,先确定CDN中的一些基础概念: Balancer:负载均衡,即请求数据的流量最开始打到Bal…

Windows 系统下使用 Ollama 离线部署 DeepSeek - R1 模型指南

引言 随着人工智能技术的飞速发展,各类大语言模型层出不穷。DeepSeek - R1 凭借其出色的语言理解和生成能力,受到了广泛关注。而 Ollama 作为一款便捷的模型管理和部署工具,能够帮助我们轻松地在本地环境中部署和使用模型。本文将详细介绍如…

Linux的0号进程、1号进程、2号进程

Linux的0号进程、1号进程、2号进程 一、0号进程:系统的“创世进程”二、1号进程:用户空间的“根进程”三、2号进程:内核线程的“管家”四、三者的关系与进程树五、查看这些进程六、总结 在 Linux 系统中,0号进程、1号进程和2号进程…

[Deepseek+Heygen+剪映]快速生产数字人讲解的视频内容

在当今这个视频内容爆炸的时代,如何快速、高效地生产高质量的视频内容成为了许多内容创作者的焦点。特别是对于需要大量讲解类视频的场景,例如产品介绍、知识科普、在线教育等,传统真人出镜的方式往往耗时耗力。 而 数字人 技术的出现&#…

LLM Note

PreNorm vs PostNorm Transformer Layer中有两处残连接,分别是网络输入 x \boldsymbol x x与SelfAttention层和MLP/FFN层的输出。 前标准化: 标准化在残连接add之前,即对SelfAttention/MLP层的输入进行标准化,将其输出再与输入相…

学前端框架之前,你需要先理解 MVC

MVC 软件架构设计模式鼎鼎大名,相信你已经听说过了,但你确定自己已经完全理解到 MVC 的精髓了吗? 如果你是新同学,没听过 MVC,那可以到网上搜一些文章来看看,不过你要有心理准备,那些文章大多都…

纯前度(vue)实现对pdf\mp4\png\jpg\jpegxls\doc\txt文件预览,无需要转化

我们知道要想在前端预览文件,可以通过浏览器自带的预览功能,我们只要window.open(ulr) 就可以实现对文件的预览,但是对于一些特殊的文件,目前很多浏览器的预览功能还是不支持的,今天我们就在纯前端来实现对这些文件的预…