当前位置: 首页 > article >正文

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

原来是用栅格地图的方式,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_weight
        elif pos1[1] == pos2[1]:
            return abs(pos1[0] - pos2[0]) + safety_weight * safety_cost + slope_penalty * slope_weight
        else:
            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.kler.cn/a/542522.html

相关文章:

  • Pytest自动化测试框架总结
  • 2025.2.8——一、[护网杯 2018]easy_tornado tornado模板注入
  • CSS3+动画
  • 设计模式-命令模式
  • PDF 文件的安全功能概述
  • vscode无法ssh连接远程机器解决方案
  • 每日一题——有重复项数字的全排列
  • Kafka 中基于 Segment 和 Offset 查找消息的过程
  • 解决 keep-alive 缓存组件中定时器干扰问题
  • STM32、GD32驱动TM1640原理图、源码分享
  • 新数据结构(4)——Java继承
  • Python实现GO鹅优化算法优化支持向量机SVM分类模型项目实战
  • 港中文腾讯提出可穿戴3D资产生成方法BAG,可自动生成服装和配饰等3D资产如,并适应特定的人体模型。
  • Java 读取 PDF 模板文档并替换内容重新生成 PDF
  • CES Asia 2025:科技盛宴助力中国数字经济腾飞
  • 中间件-安装Minio-集成使用(ubantu-docker)
  • Vue项目--动画效果的改变
  • Swift的方法派发机制
  • 模块化的基本概念
  • docker 安装 Prometheus、Node Exporter 和 Grafana
  • 【如何掌握CSP-J 信奥赛中的排序算法】
  • oracle执行grant授权sql被阻塞问题处理
  • 【PromptCoder + Bolt.new】自动生成页面和路由——提升开发效率的利器
  • 简述C#多线程
  • Zookeeper 作注册中心 和nacos 和eruka 有什么差异 ?基于什么理论选择?
  • 第七节 文件与流