news 2026/4/16 12:58:12

在扩展节点时加入障碍物检测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在扩展节点时加入障碍物检测

基于A星与DWA算法融合的动态路径规划,可实现静态避障碍及动态避障

深夜撸代码的时候突然想到,路径规划这玩意儿不就是既要全局最优又得能躲开外卖小哥吗?传统A星在静态地图里确实好用,但遇到动态障碍物直接傻眼。DWA(Dynamic Window Approach)虽然能实时避障,可全局路线容易跑偏。这俩货要是能组CP,效果应该不错吧?

先整点A星的干货。核心思想其实就一句话:把地图网格化,用优先队列找最短路径。咱们用Python简单实现个节点类:

class Node: def __init__(self, parent=None, position=None): self.parent = parent self.position = position self.g = 0 # 实际代价 self.h = 0 # 启发式估计 self.f = 0 # 总代价 def __eq__(self, other): return self.position == other.position def __lt__(self, other): return self.f < other.f

重点在代价计算这块,g值是真实走过的距离,h值用曼哈顿距离做启发。有个小技巧是在计算相邻节点时,可以给障碍物设置惩罚项,让路径自然远离危险区域:

if grid[new_x][new_y] > obstacle_threshold: current_node.g += penalty_cost # 惩罚系数根据实际情况调整

然后是DWA的骚操作,这算法像老司机开车——不断根据当前速度预测未来轨迹。速度采样是关键,别傻乎乎全遍历,用动态窗口缩小范围:

def velocity_samples(v_current, w_current, dt): # 速度增量控制在物理极限内 v_samples = np.linspace(max(0, v_current - a_max*dt), min(v_max, v_current + a_max*dt), num=5) w_samples = np.linspace(max(-w_max, w_current - alpha_max*dt), min(w_max, w_current + alpha_max*dt), num=5) return [(v, w) for v in v_samples for w in w_samples]

评价函数得兼顾目标导向、速度和障碍物距离。有个坑要注意——别把动态障碍物当静态处理,得预测它们的运动轨迹:

def evaluation(v, w, robot_pose, goals, dynamic_obstacles): traj = simulate_trajectory(robot_pose, v, w) # 预测轨迹 heading_score = angle_to_goal(traj[-1], goals) # 朝向目标得分 velocity_score = v # 速度得分 obstacle_score = 0 for obs in dynamic_obstacles: predicted_pos = obs.predict(traj[-1][2]) # 根据当前时间戳预测障碍物位置 obstacle_score += 1.0 / (distance(traj, predicted_pos) + 1e-5) return heading_score + velocity_score - obstacle_score * 10

融合的核心在于让A生成全局航点,DWA负责局部跟踪。但直接这么搞会翻车——当动态障碍物挡住全局路径时,得让A重新规划。这里用了个状态机机制:

class HybridPlanner: def __init__(self): self.global_path = [] self.current_waypoint = 0 def update(self, obstacles): if need_replan(obstacles): # 检测是否被障碍物阻断 self.global_path = a_star_replan() self.current_waypoint = find_nearest_waypoint() local_goal = self.global_path[self.current_waypoint] dwa_velocity = dwa_plan(current_pose, local_goal, obstacles) if reach_threshold(current_pose, local_goal): self.current_waypoint += 1

实测时发现个有趣现象:当动态障碍物速度超过机器人最大速度时,系统会自动生成绕行路径,而不是死磕原路线。这得益于DWA的实时避障和A*的周期重规划形成的正反馈。

最后丢个调参经验:A*的启发式权重别设太高,否则容易贴着障碍物走;DWA的障碍物惩罚系数要和传感器刷新率匹配,否则会抽搐。代码里那些magic number最好做成配置文件,实测时改参数比改代码频繁多了。

这种融合方案在实验室小车上跑出了不错的效果,但放到真实停车场环境还是得考虑点云噪声和通信延迟的问题。下次有机会再聊聊怎么用IMU数据做运动补偿吧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 7:40:44

ManySpeech —— 使用 C# 开发人工智能语音应用

跨平台部署的兼容性问题不同场景&#xff08;实时 / 离线、多语言&#xff09;下的模型适配难题复杂工具链的集成门槛作为一套平衡 “易用性、功能性与部署灵活性” 的解决方案&#xff0c;ManySpeech 能够有效提升开发效率&#xff0c;为 .NET 生态下的语音处理需求提供强有力…

作者头像 李华
网站建设 2026/4/12 16:35:32

最长公共子序列(LCS)

题目描述给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。一个字符串的「子序列」是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何字符&#xff09;后组成的新字…

作者头像 李华
网站建设 2026/4/10 9:39:51

算法驱动搜索变革:亚马逊新规则,卖家如何赢下曝光争夺战?

亚马逊搜索排名的算法&#xff0c;始终是卖家运营的核心变量&#xff0c;随着Cosmo新算法的深度应用&#xff0c;一场围绕搜索曝光的规则变革正在重塑流量分配的底层逻辑。 一、规则重构&#xff1a;从“单点突破”到“矩阵压制” 过去&#xff0c;亚马逊对一个商品父体通常只…

作者头像 李华
网站建设 2026/4/11 18:18:40

绩效反馈与辅导的流程

绩效反馈与辅导是绩效管理体系中的核心环节。**要实现绩效反馈的真正价值&#xff0c;关键在于构建科学的沟通流程与辅导机制&#xff0c;使员工在理解反馈的同时获得成长的动力。**绩效管理不只是评分与总结&#xff0c;更重要的是通过有效的反馈与辅导&#xff0c;帮助员工发…

作者头像 李华
网站建设 2026/4/14 11:01:44

夸克 AI 眼镜全链路“无切换体验“:当AI助手真正走进日常

当我们还在讨论AI能否真正融入生活时&#xff0c;有些产品已经悄然给出了答案。最近上手了夸克最新推出的AI眼镜&#xff0c;说实话&#xff0c;在戴上之前我把预期降到了很低——毕竟市面上打着"智能"旗号却体验糟糕的产品实在太多了。但戴上去的那一刻&#xff0c;…

作者头像 李华
网站建设 2026/4/16 10:36:53

C语言学习第五天

掌握了C语言中goto循环的基本用法&#xff0c;并编写了一个关机程序&#xff1a;当用户输入特定指令才能终止关机操作。此外还练习了数组操作&#xff0c;实现了从两端向中间汇聚的动画效果&#xff0c;配合清屏命令可以呈现出字符逐渐显现的视觉效果。 完成了猜数字游戏的开发…

作者头像 李华