2026/4/18 15:02:05
网站建设
项目流程
青岛网站制作服务,有网站吗推荐一下,建一个营销网站多少钱,金华网站制作企业人工势场法#xff0c;可刀
人工势场法路径规划加避障#xff0c;自己改编#xff0c;定义双车道#xff0c;车道中心线具有斥力势场#xff0c;可设定不通过车道中心线#xff0c;障碍物包含动态障碍物与静态障碍物#xff0c;可输出势能图。
参数可自调def lane_repul…人工势场法可刀 人工势场法路径规划加避障自己改编定义双车道车道中心线具有斥力势场可设定不通过车道中心线障碍物包含动态障碍物与静态障碍物可输出势能图。 参数可自调def lane_repulsion(x, y, lane_center): d abs(y - lane_center) return 0.5/(d0.1) if d 3 else 0 # 横向距离越大斥力越小这个骚操作让车辆自然避开车道中线参数0.5控制斥力强度。当横向偏移超过3米时斥力归零相当于允许变道但需要额外能量。加点matplotlib三维可视化X, Y np.meshgrid(np.arange(0,100,1), np.arange(-5,5,0.2)) Z np.array([lane_repulsion(x,y,0) for x,y in zip(X.flatten(), Y.flatten())]) plt.contourf(X, Y, Z.reshape(X.shape), alpha0.6)动态障碍物处理更带劲。咱们给障碍物类加个移动方法class DynamicObstacle: def __init__(self, x, y, vx): self.x x self.y y self.vx vx # 横向速度 def move(self, dt): self.y self.vx * dt # 横向蛇形走位 if abs(self.y) 3.5: # 车道边界约束 self.vx * -1实测中发现当障碍物与车辆相对速度超过阈值时传统势场法容易震荡。解决办法是给斥力场加个速度修正项def dynamic_repulsion(x_car, y_car, obstacle): dx obstacle.x - x_car dy obstacle.y - y_car distance np.hypot(dx, dy) # 速度方向投影修正 relative_v np.array([0, obstacle.vy]) # 假设车辆纵向匀速 proj_v np.dot([dx, dy], relative_v) / (distance 1e-5) return 1.0/(distance**2 proj_v*0.1) # 运动方向势能修正最后来个路径规划主循环。注意要处理局部极小值问题这里用随机扰动法while np.hypot(target_x - car.x, target_y - car.y) 1: # 计算合力 total_force attraction_force() sum(repulsion_forces()) # 随机扰动跳出局部极小 if np.linalg.norm(total_force) 0.1: total_force np.random.normal(0, 0.3, 2) # 更新位置 car.x total_force[0] * dt car.y total_force[1] * dt实际跑起来发现当动态障碍物突然变道时参数调节需要权衡响应速度和平滑性。建议把斥力系数设为速度的函数eta min(2.0, 0.5 abs(relative_v)*0.1)。这样高速接近障碍物时斥力更强避免碰撞。完整代码在Github仓库的dynamic_apf分支调参时记得把势能场可视化打开肉眼观察势能谷走向最靠谱。遇到路径震荡就调小时间步长车开得太肉就加大引力系数。这玩意儿跟开车一样参数调教才是灵魂。