无人机避障——基于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_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_weight | 0.3-0.8 | 安全避障权重 |
slope_penalty | 0.1-0.3 | 地形起伏惩罚 |
安全距离阈值 | 3-5 cells | 拒绝进入该距离内的区域 |
效果对比
指标 | 原始A* | ESDF-A* |
---|---|---|
路径长度 | 最短 | 略长1-5% |
安全距离 | 可能贴障碍物 | 保持安全距离 |
计算时间 | 快 | 增加20-40% |
适用场景 | 简单环境 | 动态/复杂环境 |
仿真结果
相关文章:

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

【MQ】RabbitMQ 高可用延时功能的探究
延迟消息如果使用延时交换机来实现,如果数据量过大,就会很占 CPU 资源,轻则时间误差大,重则 RabbitMQ 宕机 一、针对一个 RabbitMQ 节点 (1)利用队列 ttl,将延迟消息根据 delay 的时间进行分级…...

Maven入门核心知识点总结
Maven 1. POM(Project Object Model)2. 坐标(Coordinates)3. 依赖管理(Dependency Management)4. 常用五个生命周期(Life Circle)5. Maven 仓库(Maven Repository&#x…...

【力扣】138.随机链表的复制
AC截图 题目 代码 使用哈希存储<旧节点,新结点> /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRandomList(Node* hea…...

编程语言的深度剖析:从语法到性能优化
引言 随着软件开发的不断进化,编程语言的选择对项目的成功与否具有关键影响。今天的开发者面临着丰富多样的编程语言选择:每一种语言都有独特的优势、特性和适用场景。然而,语言的设计理念、运行机制和优化技巧背后的技术细节却常常被忽视。本…...

台湾精锐APEX减速机在半导体制造设备中的应用案例
半导体制造设备对传动系统的精度、可靠性和稳定性要求极高,台湾精锐APEX减速机凭借其低背隙、高精度和高刚性等优势,在半导体制造设备中得到了广泛应用。 案例一:晶圆切割设备 1.应用场景 在晶圆切割过程中,设备需要高精度的运…...

Rocketmq 和 Rabbitmq ,在多消费者的情况下,可以实现顺序消费吗
在多消费者的情况下,RocketMQ 和 RabbitMQ 都可以实现顺序消费,但它们的实现机制和适用场景有所不同。以下是对两者的详细分析和对比: 1. RocketMQ 的顺序消费 1.1 实现机制 顺序消息:RocketMQ 支持顺序消息(Orderly …...

Springboot原理(面试高频)
目录 一、 配置优先级 编辑 二、Bean管理 2.1:获取Bean 编辑 2.2:Bean作用域 2.3:第三方Bean 三、Springboot底层原理 3.1:起步依赖 3.1.1:ma…...

2024 Rust现代实用教程:1.1Rust简介与安装更新
文章目录 一、Rust安装二、更新Rust三、Rust的Stable与Nightly版本四、卸载ubuntu安装的cargo和rustup五、rust源设置六、rust交叉编译工具链说明 rustup稳定版交叉编译步骤 步骤 1:安装目标组件步骤 2:安装交叉编译工具链步骤 3:配置环境变…...

yolov11模型在Android设备上运行【踩坑记录】
0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) :将xxx.pt模型转化成 xxx.onnx ONNX(Ope…...

提示工程:少样本提示(Few-shot Prompting)
少样本提示(Few-shot Prompting)是一种利用大语言模型从少量示例样本中学习并处理任务的方法。它的核心思想是利用大语言模型的上下文学习能力,通过在提示中增加“示例样本”来启发大语言模型达到举一反三的效果。这种方法避免了重新训练或者…...

方舟字节码原理剖析:架构、特性与实践应用
方舟字节码原理剖析:架构、特性与实践应用 一、引言 在当今软件行业高速发展的大背景下,应用程序的性能、开发效率以及跨平台兼容性成为了开发者们关注的核心要素。编译器作为软件开发流程中的关键工具,其性能和特性直接影响着软件的质量和…...

深入Linux系列之环境变量
深入Linux系列之环境变量 那么在之前的内容中,我们已经介绍了我们Linux进程的一些关键属性,例如进程编号以及进程状态和进程优先级,那么本篇文章接介绍Linux的环境变量这一知识点,那么废话不多说,我们进入环境变量的讲…...

国产编辑器EverEdit - Web预览功能
1 Web预览 1.1 应用场景 在编辑HTML文件时,可以通过EverEdit的Web预览功能,方便用户随时观察和调整HTML代码。 1.2 使用方法 1.2.1 使用EverEdit内部浏览器预览 选择主菜单查看 -> Web预览,或使用快捷键Ctrl B,即可打开Ev…...

C#中的Frm_Welcome.Instance.Show(),是什么意思
Frm_Welcome.Instance.Show() 是一种常见的单例模式(Singleton Pattern)实现方式,通常用于在应用程序中确保某个窗体(Form)只有一个实例,并通过该实例显示窗体。以下是对这段代码的详细解释: 代…...

07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)
课程内容 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 功能实现:缓存商品、购物车 效果图: 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压…...

C++开发(软件开发)常见面试题
目录 1、C里指针和数组的区别 2、C中空指针请使用nullptr不要使用NULL 3、http/https区别和头部结构? 4、有了mac地址为什么还要ip地址?ip地址的作用 5、有了路由器为什么还要交换机? 6、面向对象三大特性 7、友元函数 8、大端小端 …...

人工智能-A*算法与卷积神经网络(CNN)结合实现路径规划
以下是一个将 A* 算法与卷积神经网络(CNN)结合实现路径规划的代码示例。主要思路是使用 A* 算法生成训练数据,然后用这些数据训练一个 CNN 模型,让 CNN 学习如何预测路径,最后使用训练好的 CNN 模型进行路径规划。 代码实现 import numpy as np import heapq import tor…...

蓝桥杯备赛——进制转化相关问题
目录 一、基础概念 二、问题研究(1) 代码解读: 1. transfer 函数 代码功能概述 详细步骤 2. main 函数 代码功能概述 详细步骤 三、运用递归解决 (一) 代码如下: 代码解读: &#…...

DevOps的个人学习
一、DevOps介绍 软件开发最初是由两个团队组成: 开发团队:负责设计和构建系统。运维团队:负责测试代码后部署上线,确保系统稳定安全运行。 这两个看似目标不同的团队需要协同完成一个软件的开发。DevOps整合了开发与运维团队&a…...

使用Pytorch训练一个图像分类器
一、准备数据集 一般来说,当你不得不与图像、文本或者视频资料打交道时,会选择使用python的标准库将原始数据加载转化成numpy数组,甚至可以继续转换成torch.*Tensor。 对图片而言,可以使用Pillow库和OpenCV库对视频而言…...

《ARM64体系结构编程与实践》学习笔记(四)
MMU内存管理 1.MMU内存管理(armv8.6手册的D5章节),MMU包含快表TLB,TLB是对页表的部分缓存,页表是存放在内存里面的。 AArch64仅仅支持Long Descriptor的页表格式,AArch32支持两种页表格式Armv7-A Short De…...

01-SDRAM控制器的设计——案例总概述
本教程重点▷▷▷ 存储器简介。 介绍 SDRAM 的工作原理。 详细讲解SDRAM 控制的Verilog 实现方法。 PLL IP和FIFO IP 的调用,计数器设计,按键边沿捕获,数码管控制。 完成SDRAM控制器应用的完整案例。 Signal Tap 调试方法。 准备工作▷…...

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性
京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域,分布式拒绝服务(DDoS)攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…...

uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式
新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…...

RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决
RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决 1、报错情况 下载:https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle 用idea打开,启动: 日志有报错: 点右侧m图标,maven有以下报误 &…...

python脚本实现windows电脑内存监控内存清理(类似rammap清空工作集功能)
import ctypes import psutil import time import sys import os from datetime import datetime import pyautogui# 检查管理员权限 def is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return False# 内存清理核心功能 def cleanup_memory(aggressivene…...

【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量
嘿,朋友们!喜欢这个并查集的讲解吗 记得点个关注哦,让我们一起探索算法的奥秘,别忘了一键三连,你的支持是我最大的动力! 欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:深度剖析并查…...

SpringBoot中实现动态数据源切换
SpringBoot中实现动态数据源切换 文章目录 SpringBoot中实现动态数据源切换SpringBoot中实现动态数据源切换基础知识1. 什么是数据源?2. 动态数据源切换的概念3. Spring Boot 中的默认数据源配置4. 动态数据源的挑战5. Spring 中的数据源切换方式 设计思路1. 明确应…...

数据结构及排序算法
数据结构 线性结构 ◆线性结构:每个元素最多只有一个出度和一个入度,表现为一条线状。线性表按存储方式分为顺序表和链表。 存储结构: ◆顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻。 ◆链式存储:存储各数据元素的结点…...