人工智能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:计算最短路径,不断更新节点的g和rhs值,直到找到最短路径或队列为空。
5. 动态障碍物处理和多步预测
handle_dynamic_obstacles:处理动态障碍物的出现,更新受影响节点的rhs值,并重新计算最短路径。
6. 路径规划函数(d_star_lite)
- 主路径规划函数,先进行初始路径规划,若存在动态障碍物,则调用
handle_dynamic_obstacles重新规划路径。
注意事项
- 代码中的动态障碍物处理是简单模拟,实际应用中需要结合传感器数据实时更新障碍物信息。
- 启发式函数和移动代价的计算可以根据具体场景进行调整,以提高路径规划的效率和准确性。
- 代码中未考虑车辆的运动学约束,实际智能驾驶中需要进一步考虑车辆的转弯半径、速度限制等因素。
相关文章:
人工智能D* Lite 算法-动态障碍物处理、多步预测和启发式函数优化
在智能驾驶领域,D* Lite 算法是一种高效的动态路径规划算法,适用于处理环境变化时的路径重规划问题。以下将为你展示 D* Lite 算法的高级用法,包含动态障碍物处理、多步预测和启发式函数优化等方面的代码实现。 代码实现 import heapq impo…...
MySQL 8版本认证问题
目录 问题: Public Key Retrieval is not allowed原因: mysql 8.0 调整身份认证机制解决方法(三种) 问题: Public Key Retrieval is not allowed 连接MySQL8数据库的时候,报错内容如下:“Publi…...
Android 开发APP中参数配置与读取总结
以使用MQTT配置的参数 MQTT_BROKER_UR 、MQTT_USER_NAME、 MQTT_PASSWORD为例,说明配置设置和读取应用 项目中使用系统参数(如环境变量和gradle.properties文件中的属性)在Gradle构建脚本中,以下是一个详细的操作文档资料&…...
Scala 语法入门
Scala语法入门 1. 定义变量2. 定义方法3. 闭包4. 声明字符串5. 声明数组6. 声明集合7. 异常处理 1. 定义变量 (变量的类型在变量名之后等号之前声明) 不可变变量(val) 类似于 Java 中的 final 变量,即一旦赋值后,其值不能再被改…...
python中的flask框架
Flask 是一个用Python编写的轻量级Web应用框架 基于WSGI和Jinja2模板引擎 被称为“微框架”,其核心功能简单,不捆绑数据库管理、表单验证等功能,而是通过扩展来增加其他功能 Flask提供最基本的功能,不强制使用特定工具或库 通…...
【redis】缓存设计规范
本文是 Redis 键值设计的 14 个核心规范与最佳实践,按重要程度分层说明: 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析: 是否需要排序?: zset(有序集合)用…...
归一化与伪彩:LabVIEW图像处理的区别
在LabVIEW的图像处理领域,归一化(Normalization)和伪彩(Pseudo-coloring)是两个不同的概念,虽然它们都涉及图像像素值的调整,但目的和实现方式截然不同。归一化用于调整像素值的范围,…...
DeepSeek大模型本地部署实战
1. 下载并安装Ollama 打开浏览器:使用你常用的浏览器(如Chrome、Firefox等)访问Ollama的官方网站。无需特殊网络环境,直接搜索“Ollama”即可找到。 登录与下载:进入Ollama官网后,点击右上角的“Download…...
deepseek+kimi自动生成ppt
打开deepseek官网,输入详细的需求,让他生成个ppt 接着deepseek开始思考生成了 接着复制生成了的内容 打开kimi粘贴刚才deepseek生成的内容 可以一键生成啦,下载编辑使用吧...
集成SwanLab与HuggingFace TRL:跟踪与优化强化学习实验
文章目录 1. 引入SwanLabCallback2. 传入Trainer3. 完整案例代码4. GUI效果展示 TRL (Transformers Reinforcement Learning,用强化学习训练Transformers模型) 是一个领先的Python库,旨在通过监督微调(SFT)、近端策略优化…...
cefsharp131升级132测试(WinForms.NETCore)
一、升级(Nuget) 版本说明(readme):最低.NET Core3.1 (NET5.0) Visual C 2019 Redist 二、试运行、兼容性测试 三、后记说明 支持H264版本推荐版本63,79,84,88,100,111,125(支持h264和pdf预览) 其他H264版…...
Gitee AI上线:开启免费DeepSeek模型新时代
Gitee Al上线,并宣布开启免费DeepSeek模型的时代,这是一个非常值得关注的消息,因 为它标志着国内在AI领域的一个重要发展。DeepSeek模型是由阿里巴巴达摩院开发的,旨 在提供强大的自然语言处理(NLP)能力。下面是一些关于这一事件…...
nginx常用命令及补充
在Linux环境下nginx常用命令如下: 1、查看nginx版本号命令 nginx -v 2、查找nginx配置文件路径已经检查配置文件是否正确 nginx -t 3、查找nginx安装目录 which nginx 4、查看nginx进程 ps -ef|grep nginx 5、进入到nginx的sbin目录后,执行一下…...
自动驾驶---聊聊传统规控和端到端
1 背景 在自动驾驶领域中,端到端模型的兴起确实对传统的规划控制方法(笔者并不同意网上以Rule-Base称呼传统规控,传统的规控其实也使用了很多优化算法和博弈算法)产生了挑战,但这就意味着传统规控方法就完全没有应用了…...
node.js + html + Sealos容器云 搭建简易多人实时聊天室demo 带源码
node.js html Sealos容器云 搭建简易多人实时聊天室demo 带源码 前言功能介绍(demo演示)sealos官网配置node.js 编写服务端代码前端ui 调用接口整体项目目录部署到服务器 前言 hello哦盆友们,这次我们来十几行代码做一个超简单的多人聊天…...
OpenFeign远程调用返回的是List<T>类型的数据
在使用 OpenFeign 进行远程调用时,如果接口返回的是 List 类型的数据,可以通过以下方式处理: 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化,如果服务端返回的是 List的JSON格式数据,可以直接在 Feig…...
PCL 计算多边形的面积【2025最新版】
目录 一、算法原理1、概述2、主要函数3、函数源码二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月17日。 一、算法原理 1、概述 根据给定的多边形的点云计算多边形的面积 A r e a = 1 2 ∑...
著名大模型评测榜单(不同评测方式)
在评估大语言模型的性能时,一种主流的途径就是选择不同的能力维度并且构建对应的评测任务,进而使用这些能力维度的评测任务对模型的性能进行测试与对比。由大型机构或者研究院所排出榜单。 评测指标 不同评测任务有不同的评指标,衡量模型的…...
国内知名Deepseek培训师培训讲师唐兴通老师讲授AI人工智能大模型实践应用
课程名称 《Deepseek人工智能大模型实践应用》 课程目标 全面了解Deepseek人工智能大模型的技术原理、功能特点及应用场景。 熟练掌握Deepseek大模型的提示词工程技巧,能够编写高质量的提示词。 掌握Deepseek大模型在办公、营销等领域的应用方法,提升…...
【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯冷启动数据的作用冷启动数据设计 💯多阶段训练的作用阶段 1:冷启动微调阶段 2:推理导向强化学习(RL࿰…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
