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

人工智能D* Lite 算法-动态障碍物处理、多步预测和启发式函数优化

在智能驾驶领域,D* Lite 算法是一种高效的动态路径规划算法,适用于处理环境变化时的路径重规划问题。以下将为你展示 D* Lite 算法的高级用法,包含动态障碍物处理、多步预测和启发式函数优化等方面的代码实现。

代码实现

import heapq
import math# 地图类,用于管理地图信息和更新
class Map:def __init__(self, grid):self.grid = gridself.rows = len(grid)self.cols = len(grid[0])def get_neighbors(self, node):x, y = nodeneighbors = []for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]:new_x, new_y = x + dx, y + dyif 0 <= new_x < self.rows and 0 <= new_y < self.cols and self.grid[new_x][new_y] == 0:neighbors.append((new_x, new_y))return neighborsdef update_cell(self, x, y, new_value):self.grid[x][y] = new_valuedef is_obstacle(self, node):x, y = nodereturn self.grid[x][y] == 1# 节点类,用于存储节点信息
class Node:def __init__(self, x, y):self.x = xself.y = yself.g = float('inf')self.rhs = float('inf')self.key = [float('inf'), float('inf')]def __lt__(self, other):return self.key < other.key# 优化的启发式函数:考虑对角线移动的欧几里得距离
def heuristic(a, b):dx = abs(a[0] - b[0])dy = abs(a[1] - b[1])return math.sqrt(dx**2 + dy**2)# 计算节点的键值
def calculate_key(node, s_start, k_m):node.key = [min(node.g, node.rhs) + heuristic((node.x, node.y), s_start) + k_m,min(node.g, node.rhs)]return node# 初始化 D* Lite 算法
def initialize(s_start, s_goal):U = []nodes = {}for i in range(map_obj.rows):for j in range(map_obj.cols):node = Node(i, j)nodes[(i, j)] = nodes_goal_node = nodes[s_goal]s_goal_node.rhs = 0s_goal_node = calculate_key(s_goal_node, s_start, 0)heapq.heappush(U, s_goal_node)return U, nodes# 更新节点的 rhs 值
def update_vertex(U, node, s_start, k_m):if node.g != node.rhs:node = calculate_key(node, s_start, k_m)for i, n in enumerate(U):if n.x == node.x and n.y == node.y:U[i] = nodeheapq.heapify(U)breakelse:heapq.heappush(U, node)else:for i, n in enumerate(U):if n.x == node.x and n.y == node.y:U.pop(i)heapq.heapify(U)break# 计算最短路径
def compute_shortest_path(U, s_start, nodes, k_m):while U and (U[0].key < calculate_key(nodes[s_start], s_start, k_m) ornodes[s_start].rhs > nodes[s_start].g):u = heapq.heappop(U)if u.g > u.rhs:u.g = u.rhselse:u.g = float('inf')update_vertex(U, u, s_start, k_m)for neighbor in map_obj.get_neighbors((u.x, u.y)):neighbor_node = nodes[neighbor]if neighbor != s_start:cost = 1if abs(u.x - neighbor[0]) + abs(u.y - neighbor[1]) == 2:cost = math.sqrt(2)  # 对角线移动代价neighbor_node.rhs = min(neighbor_node.rhs,u.g + cost)update_vertex(U, neighbor_node, s_start, k_m)# 动态障碍物处理和多步预测
def handle_dynamic_obstacles(U, nodes, s_start, s_goal, k_m, dynamic_obstacles):for obstacle in dynamic_obstacles:obstacle_node = nodes[obstacle]map_obj.update_cell(obstacle[0], obstacle[1], 1)for neighbor in map_obj.get_neighbors(obstacle):neighbor_node = nodes[neighbor]neighbor_node.rhs = float('inf')update_vertex(U, neighbor_node, s_start, k_m)compute_shortest_path(U, s_start, nodes, k_m)# 路径规划函数
def d_star_lite(s_start, s_goal, dynamic_obstacles=[]):U, nodes = initialize(s_start, s_goal)k_m = 0compute_shortest_path(U, s_start, nodes, k_m)path = []current = s_startwhile current != s_goal:path.append(current)neighbors = map_obj.get_neighbors(current)min_rhs = float('inf')next_node = Nonefor neighbor in neighbors:neighbor_node = nodes[neighbor]if neighbor_node.rhs < min_rhs:min_rhs = neighbor_node.rhsnext_node = neighborif next_node is None:print("未找到可行路径!")return []current = next_nodepath.append(s_goal)# 处理动态障碍物if dynamic_obstacles:handle_dynamic_obstacles(U, nodes, s_start, s_goal, k_m, dynamic_obstacles)path = []current = s_startwhile current != s_goal:path.append(current)neighbors = map_obj.get_neighbors(current)min_rhs = float('inf')next_node = Nonefor neighbor in neighbors:neighbor_node = nodes[neighbor]if neighbor_node.rhs < min_rhs:min_rhs = neighbor_node.rhsnext_node = neighborif next_node is None:print("未找到可行路径!")return []current = next_nodepath.append(s_goal)return path# 示例地图
map_grid = [[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 0, 0, 0, 0],[0, 0, 1, 1, 0],[0, 0, 0, 0, 0]
]
map_obj = Map(map_grid)# 起点和终点
s_start = (0, 0)
s_goal = (4, 4)# 初始路径规划
path = d_star_lite(s_start, s_goal)
if path:print("初始规划的路径:", path)# 模拟动态障碍物出现
dynamic_obstacles = [(2, 2)]
path = d_star_lite(s_start, s_goal, dynamic_obstacles)
if path:print("出现动态障碍物后重新规划的路径:", path)

代码解释

1. 地图类(Map
  • get_neighbors:不仅考虑上下左右移动,还考虑了对角线移动,扩大了节点的搜索范围。
  • is_obstacle:判断节点是否为障碍物。
2. 节点类(Node
  • 存储节点的坐标、g 值(从起点到该节点的实际代价)、rhs 值(到该节点的最短路径的估计代价)和键值 key
3. 启发式函数(heuristic
  • 采用考虑对角线移动的欧几里得距离作为启发式函数,更准确地估计节点到目标节点的代价。
4. D* Lite 算法核心函数
  • initialize:初始化算法,创建节点字典和优先队列 U,将目标节点加入队列。
  • calculate_key:计算节点的键值,用于优先队列的排序。
  • update_vertex:更新节点的 rhs 值,并根据情况更新优先队列。
  • compute_shortest_path:计算最短路径,不断更新节点的 grhs 值,直到找到最短路径或队列为空。
5. 动态障碍物处理和多步预测
  • handle_dynamic_obstacles:处理动态障碍物的出现,更新受影响节点的 rhs 值,并重新计算最短路径。
6. 路径规划函数(d_star_lite
  • 主路径规划函数,先进行初始路径规划,若存在动态障碍物,则调用 handle_dynamic_obstacles 重新规划路径。

注意事项

  • 代码中的动态障碍物处理是简单模拟,实际应用中需要结合传感器数据实时更新障碍物信息。
  • 启发式函数和移动代价的计算可以根据具体场景进行调整,以提高路径规划的效率和准确性。
  • 代码中未考虑车辆的运动学约束,实际智能驾驶中需要进一步考虑车辆的转弯半径、速度限制等因素。

相关文章:

人工智能D* Lite 算法-动态障碍物处理、多步预测和启发式函数优化

在智能驾驶领域&#xff0c;D* Lite 算法是一种高效的动态路径规划算法&#xff0c;适用于处理环境变化时的路径重规划问题。以下将为你展示 D* Lite 算法的高级用法&#xff0c;包含动态障碍物处理、多步预测和启发式函数优化等方面的代码实现。 代码实现 import heapq impo…...

MySQL 8版本认证问题

目录 问题&#xff1a; Public Key Retrieval is not allowed原因&#xff1a; mysql 8.0 调整身份认证机制解决方法&#xff08;三种&#xff09; 问题&#xff1a; Public Key Retrieval is not allowed 连接MySQL8数据库的时候&#xff0c;报错内容如下&#xff1a;“Publi…...

Android 开发APP中参数配置与读取总结

以使用MQTT配置的参数 MQTT_BROKER_UR 、MQTT_USER_NAME、 MQTT_PASSWORD为例&#xff0c;说明配置设置和读取应用 项目中使用系统参数&#xff08;如环境变量和gradle.properties文件中的属性&#xff09;在Gradle构建脚本中&#xff0c;以下是一个详细的操作文档资料&…...

Scala 语法入门

Scala语法入门 1. 定义变量2. 定义方法3. 闭包4. 声明字符串5. 声明数组6. 声明集合7. 异常处理 1. 定义变量 &#xff08;变量的类型在变量名之后等号之前声明&#xff09; 不可变变量(val) 类似于 Java 中的 final 变量&#xff0c;即一旦赋值后&#xff0c;其值不能再被改…...

python中的flask框架

Flask 是一个用Python编写的轻量级Web应用框架 基于WSGI和Jinja2模板引擎 被称为“微框架”&#xff0c;其核心功能简单&#xff0c;不捆绑数据库管理、表单验证等功能&#xff0c;而是通过扩展来增加其他功能 Flask提供最基本的功能&#xff0c;不强制使用特定工具或库 通…...

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践&#xff0c;按重要程度分层说明&#xff1a; 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析&#xff1a; 是否需要排序&#xff1f;&#xff1a; zset&#xff08;有序集合&#xff09;用…...

归一化与伪彩:LabVIEW图像处理的区别

在LabVIEW的图像处理领域&#xff0c;归一化&#xff08;Normalization&#xff09;和伪彩&#xff08;Pseudo-coloring&#xff09;是两个不同的概念&#xff0c;虽然它们都涉及图像像素值的调整&#xff0c;但目的和实现方式截然不同。归一化用于调整像素值的范围&#xff0c…...

DeepSeek大模型本地部署实战

1. 下载并安装Ollama 打开浏览器&#xff1a;使用你常用的浏览器&#xff08;如Chrome、Firefox等&#xff09;访问Ollama的官方网站。无需特殊网络环境&#xff0c;直接搜索“Ollama”即可找到。 登录与下载&#xff1a;进入Ollama官网后&#xff0c;点击右上角的“Download…...

deepseek+kimi自动生成ppt

打开deepseek官网&#xff0c;输入详细的需求&#xff0c;让他生成个ppt 接着deepseek开始思考生成了 接着复制生成了的内容 打开kimi粘贴刚才deepseek生成的内容 可以一键生成啦&#xff0c;下载编辑使用吧...

集成SwanLab与HuggingFace TRL:跟踪与优化强化学习实验

文章目录 1. 引入SwanLabCallback2. 传入Trainer3. 完整案例代码4. GUI效果展示 TRL (Transformers Reinforcement Learning&#xff0c;用强化学习训练Transformers模型) 是一个领先的Python库&#xff0c;旨在通过监督微调&#xff08;SFT&#xff09;、近端策略优化&#xf…...

cefsharp131升级132测试(WinForms.NETCore)

一、升级&#xff08;Nuget&#xff09; 版本说明&#xff08;readme&#xff09;:最低.NET Core3.1 (NET5.0) Visual C 2019 Redist 二、试运行、兼容性测试 三、后记说明 支持H264版本推荐版本63,79,84,88,100,111,125&#xff08;支持h264和pdf预览&#xff09; 其他H264版…...

Gitee AI上线:开启免费DeepSeek模型新时代

Gitee Al上线&#xff0c;并宣布开启免费DeepSeek模型的时代&#xff0c;这是一个非常值得关注的消息&#xff0c;因 为它标志着国内在AI领域的一个重要发展。DeepSeek模型是由阿里巴巴达摩院开发的&#xff0c;旨 在提供强大的自然语言处理(NLP)能力。下面是一些关于这一事件…...

nginx常用命令及补充

在Linux环境下nginx常用命令如下&#xff1a; 1、查看nginx版本号命令 nginx -v 2、查找nginx配置文件路径已经检查配置文件是否正确 nginx -t 3、查找nginx安装目录 which nginx 4、查看nginx进程 ps -ef|grep nginx 5、进入到nginx的sbin目录后&#xff0c;执行一下…...

自动驾驶---聊聊传统规控和端到端

1 背景 在自动驾驶领域中&#xff0c;端到端模型的兴起确实对传统的规划控制方法&#xff08;笔者并不同意网上以Rule-Base称呼传统规控&#xff0c;传统的规控其实也使用了很多优化算法和博弈算法&#xff09;产生了挑战&#xff0c;但这就意味着传统规控方法就完全没有应用了…...

node.js + html + Sealos容器云 搭建简易多人实时聊天室demo 带源码

node.js html Sealos容器云 搭建简易多人实时聊天室demo 带源码 前言功能介绍&#xff08;demo演示&#xff09;sealos官网配置node.js 编写服务端代码前端ui 调用接口整体项目目录部署到服务器 前言 hello哦盆友们&#xff0c;这次我们来十几行代码做一个超简单的多人聊天…...

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时&#xff0c;如果接口返回的是 List 类型的数据&#xff0c;可以通过以下方式处理&#xff1a; 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化&#xff0c;如果服务端返回的是 List的JSON格式数据&#xff0c;可以直接在 Feig…...

PCL 计算多边形的面积【2025最新版】

目录 一、算法原理1、概述2、主要函数3、函数源码二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月17日。 一、算法原理 1、概述 根据给定的多边形的点云计算多边形的面积 A r e a = 1 2 ∑...

著名大模型评测榜单(不同评测方式)

在评估大语言模型的性能时&#xff0c;一种主流的途径就是选择不同的能力维度并且构建对应的评测任务&#xff0c;进而使用这些能力维度的评测任务对模型的性能进行测试与对比。由大型机构或者研究院所排出榜单。 评测指标 不同评测任务有不同的评指标&#xff0c;衡量模型的…...

国内知名Deepseek培训师培训讲师唐兴通老师讲授AI人工智能大模型实践应用

课程名称 《Deepseek人工智能大模型实践应用》 课程目标 全面了解Deepseek人工智能大模型的技术原理、功能特点及应用场景。 熟练掌握Deepseek大模型的提示词工程技巧&#xff0c;能够编写高质量的提示词。 掌握Deepseek大模型在办公、营销等领域的应用方法&#xff0c;提升…...

【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;冷启动数据的作用冷启动数据设计 &#x1f4af;多阶段训练的作用阶段 1&#xff1a;冷启动微调阶段 2&#xff1a;推理导向强化学习&#xff08;RL&#xff0…...

如何打造一个更友好的网站结构?

在SEO优化中&#xff0c;网站的结构往往被忽略&#xff0c;但它其实是决定谷歌爬虫抓取效率的关键因素之一。一个清晰、逻辑合理的网站结构&#xff0c;不仅能让用户更方便地找到他们需要的信息&#xff0c;还能提升搜索引擎的抓取效率 理想的网站结构应该像一棵树&#xff0c;…...

【ROS2】RViz2自定义面板插件(rviz_common::Panel)的详细步骤

【ROS】郭老二博文之:ROS目录 1、简述 RViz2 的插件基于 ROS2 的插件库(pluginlib)机制,通过动态加载共享库实现功能扩展。 注意:RViz2 使用 QT 作为 UI 框架,虽然 QT 也有插件机制,但是 RViz2 并没有使用QT的插件机制,而是通过 pluginlib 加载功能模块来实现。 2、…...

漏洞分析 Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿&#xff08;VMware&#xff09;公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期&#xff0c;监测到Spring Framework在特定条件下&#xff0c;存在目录遍历漏洞&#xff08;网宿评分&am…...

《手札·避坑篇》2025年传统制造业企业数字化转型指南

一、引言 在数字化浪潮的推动下,传统制造业企业正加速向智能化、数字化转型。开源软件技术与制造MES(制造执行系统)产品的结合,为企业提供了高效、灵活且低成本的转型路径。本指南旨在为传统制造业企业的信息化负责人提供一套完整的数字化转型方案,助力企业实现高效、智能…...

MySQL中DDL操作是否支持事务

MySQL中DDL不支持事务。 传统MySQL&#xff08;5.7及以前版本&#xff09;&#xff1a; DDL操作不支持事务执行DDL操作时会隐式提交当前会话的事务无法回滚DDL操作 MySQL 8.0版本&#xff1a; 引入了原子DDL特性&#xff08;Atomic DDL&#xff09;DDL操作变为原子性的&…...

GWO优化决策树回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是模仿灰狼社会的结构与行为模式。 在本…...

掌握Spring @SessionAttribute:跨请求数据共享的艺术

SessionAttribute注解在Spring中的作用&#xff0c;就像是一个“数据中转站”。 在Web应用中&#xff0c;我们经常需要在多个请求之间共享数据。比如&#xff0c;用户登录后&#xff0c;我们需要在多个页面或请求中保持用户的登录状态。这时&#xff0c;SessionAttribute注解就…...

python读取Excel表格内公式的值

背景&#xff1a;在做业务周报的时候&#xff0c;有一个Excel模板&#xff0c;表里面包含了一些公式&#xff0c;dataframe写入到Excel的时候&#xff0c;有公式的部分通过python读出来的结果是None&#xff0c;需要进行优化参考链接&#xff1a; 如何使用openpyxl读取Excel单元…...

第三十八章:阳江自驾之旅:挖蟹与品鲜

经历了惠州海边那趟温馨又欢乐的自驾之旅后&#xff0c;小冷和小颖心中对旅行的热情愈发高涨。闲暇时&#xff0c;两人总会坐在客厅里&#xff0c;翻看着旅行杂志&#xff0c;或是在网上搜索各地的美景&#xff0c;那些充满魅力的地方不断吸引着他们&#xff0c;也让他们对下一…...

C++小等于的所有奇数和=最大奇数除2加1的平方。

缘由 三种思路解题&#xff1a;依据算术推导得到一个规律&#xff1a;小等于的所有奇数和等于最大奇数除以2加1的平方。将在后续发布&#xff0c;总计有十种推导出来的实现代码。 int a 0,aa 1,aaa 0;cin >> a; while (aa<a) aaa aa, aa 2;cout << aaa;i…...