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

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

基于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数据做运动补偿吧。

http://www.cnnetsun.cn/news/115274.html

相关文章:

  • 【参数辨识】基于卡尔曼滤波(KF)估计离散线性系统对垂直起降(VTOL)飞行器的鲁棒辨识附matlab代码
  • 桥梁与隧道安全守护者 抗冰冻型风速监测方案
  • 05-FreeRTOS的内存管理
  • 基于改进蛇优化算法(GOSO/ISO)优化随机森林数据回归预测模型(含初始化种群混沌映射、减法...
  • 基于大数据的人脸识别系统设计与实现开题报告
  • 车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南
  • 气象在线监测系统助力智慧环境管理,金叶仪器专业气象监测解决方案
  • 【TVM 教程】交叉编译与 RPC
  • 腾讯云国际站代理商的QAPM服务能提供哪些专属服务?
  • 网安副业怎么选?漏洞挖掘、技术博客、竞赛奖金实战,哪个更适配你?
  • 量子计算验证方法:软件测试从业者的转型指南
  • 突破 Oracle/MySQL 瓶颈:金仓数据库以三重革新,筑牢业务转型 “数据底座”
  • 【学习神器】NotebookLM“播客”功能实战指南:四六级、考研党高效复习秘籍
  • 如何解决 pip install 网络报错 ERROR: No matching distribution found for requests
  • 12 Ways to Find User Account Info and Login Details in Linux
  • 紧急警告:错误的导出格式正毁掉你的量子实验成果,速查正确方式
  • 35 岁职场焦虑蔓延?为什么网络安全行业越老越值钱?
  • 内网渗透实战干货:12 个优质靶场平台精选,附避坑指南 + 实操技巧合集!
  • 新型电力系统下多分布式电源接入配电网承载力评估方法研究附Matlab代码
  • 50天学习FPGA第16天-verilog的模块与端口
  • 50天学习FPGA第15天-verilog基本概念
  • 基于Docker容器化部署Lsky Pro私有图床系统
  • GRPO不香了?小米ICPO横空出世,专治大模型“不会思考”,推理能力飙升!
  • Windows找不到xenroll.dll文件 如何下载修复?
  • 软件测试文档标准化编写指南
  • Paperzz AI:毕业论文写作的 “隐形助攻”,让学术输出告别 “抓瞎”
  • BypassAV通过Patch白文件实现Bypass,没有添加其他免杀手法
  • 鸿蒙:一个操作系统的生态远征与多行业渗透之路
  • 游戏启动缺少X3DAudio1_3.dll文件问题 下载修复
  • java毕业设计之基于数据安全的旅游民宿租赁系统源代码(java+springboot+mysql)