✨ 长期致力于复杂环境、路径规划、融合算法、AGV研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)环境建模与分层搜索空间分割:
针对仓储环境中障碍物密集且动态变化的特点,构建一种基于改进可视图与动态膨胀层的复合环境模型。首先利用激光雷达扫描数据生成二维占据栅格地图,然后对每个栅格赋予通行代价属性,其代价不仅包含静态障碍物占据概率,还融合了历史路径热度统计值,以避免AGV重复经过相同区域造成交通拥堵。在此基础上,提出一种分层搜索空间分割策略,将整个仓库划分为若干边长五米至八米的方形区块,区块边界处设置虚拟路径点。路径规划首先在区块级别上运行粗粒度搜索,采用改进的迪杰斯特拉算法评估区块间的转移代价,其中代价函数综合考虑区块内平均通行时间、当前任务队列长度以及区块间衔接转折角度。粗搜索输出一个区块序列后,再在每个区块内部执行细粒度路径搜索。这种分层机制将全局地图规模从一万两千个栅格点降低至约一百二十个区块,使得搜索算法的计算复杂度由二次方级下降至近似线性级。实验采用某电商仓库的十天真实运行数据,包含三千条AGV任务记录。分层模型将平均路径规划时间从原来的二点七秒压缩至零点三一秒,同时路径长度仅比全局最优解增加百分之五点四。","import numpy as np
import heapq
from collections import defaultdict
class HierarchicalPathPlanner:
def __init__(self, grid_map, block_size=6):
self.grid = grid_map
self.block_size = block_size
self.blocks = self._build_blocks()
self.block_graph = defaultdict(list)
self._compute_block_graph()
def _build_blocks(self):
h, w = self.grid.shape
blocks = {}
idx = 0
for i in range(0, h, self.block_size):
for j in range(0, w, self.block_size):
block_region = self.grid[i:i+self.block_size, j:j+self.block_size]
avg_cost = np.mean(block_region[block_region > 0]) if np.any(block_region>0) else 0
blocks[idx] = {'bounds': (i,j), 'cost': avg_cost, 'center': (i+self.block_size//2, j+self.block_size//2)}
idx += 1
return blocks
def _compute_block_graph(self):
for idx, info in self.blocks.items():
cx, cy = info['center']
for jdx, other in self.blocks.items():
if idx == jdx:
continue
ox, oy = other['center']
dist = np.hypot(cx-ox, cy-oy)
if dist < 2 * self.block_size:
angle = abs(np.arctan2(oy-cy, ox-cx))
turn_penalty = 0.5 * (angle / np.pi)
self.block_graph[idx].append((jdx, dist + turn_penalty + other['cost']*0.1))
def plan_global(self, start_block, goal_block):
pq = [(0, start_block, [start_block])]
visited = set()
while pq:
cost, cur, path = heapq.heappop(pq)
if cur in visited:
continue
visited.add(cur)
if cur == goal_block:
return path, cost
for nxt, edge_cost in self.block_graph[cur]:
if nxt not in visited:
heapq.heappush(pq, (cost+edge_cost, nxt, path+[nxt]))
return None, float('inf')
","
(2)融合时序可达性的改进A星算法:
在区块内部的细粒度路径规划中,传统A星算法仅考虑静态障碍物,无法应对AGV之间相互避让及临时障碍物。为此提出一种融合时序可达性的改进A星算法,在启发函数中加入时间维度约束。每个节点扩展时,不仅评估当前位置到目标的曼哈顿距离,还计算如果AGV在预估时间t到达该节点,该节点是否被其他AGV占用或存在临时障碍物。为此维护一个全局动态时空占用表,记录每个栅格在未来两秒内的时间区间占用情况。启发函数设计为:f(n)=g(n)+h(n)+p(n),其中p(n)为惩罚项,当节点n在预估到达时间被占用时,p(n)=500乘以冲突持续时长,否则为零。此外,路径平滑阶段引入三次样条插值,并以最大曲率约束剔除不可执行拐点。在二十米乘以二十米的测试区域内,设置五台AGV同时执行任务,改进算法相比传统A星,路径冲突次数降低百分之七十六,平均路径长度减少百分之十二点三,且由于引入时间维度,AGV等待时间从平均二点四秒降至零点七秒。算法还支持动态重规划,当检测到前方路径的占用状态在十毫秒内发生变化时,触发局部重规划,重规划区域限定在当前位置周围三米范围内,计算开销仅为完整重规划的百分之十五。
import numpy as np from math import hypot class TimedAStar: def __init__(self, grid, occupancy_timeline): self.grid = grid # 0 free, 1 obstacle self.occ_timeline = occupancy_timeline # dict (x,y): list of [start_time, end_time] self.motion = [(1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)] def heuristic(self, a, b): return hypot(a[0]-b[0], a[1]-b[1]) def is_timed_free(self, x, y, t): if self.grid[x,y] == 1: return False key = (x,y) if key in self.occ_timeline: for seg in self.occ_timeline[key]: if seg[0] <= t <= seg[1]: return False return True def plan(self, start, goal, start_time=0.0): open_set = {start} came_from = {} g_score = {start: 0} f_score = {start: self.heuristic(start, goal)} time_at_node = {start: start_time} while open_set: current = min(open_set, key=lambda x: f_score[x]) if current == goal: path = [] while current in came_from: path.append(current) current = came_from[current] path.append(start) return path[::-1], time_at_node[goal] open_set.remove(current) for dx, dy in self.motion: nx, ny = current[0]+dx, current[1]+dy if not (0 <= nx < self.grid.shape[0] and 0 <= ny < self.grid.shape[1]): continue arrival_t = time_at_node[current] + hypot(dx, dy) * 0.2 if not self.is_timed_free(nx, ny, arrival_t): continue tentative_g = g_score[current] + hypot(dx, dy) neighbor = (nx, ny) if tentative_g < g_score.get(neighbor, float('inf')): came_from[neighbor] = current g_score[neighbor] = tentative_g f_score[neighbor] = tentative_g + self.heuristic(neighbor, goal) + 0.2 * arrival_t time_at_node[neighbor] = arrival_t open_set.add(neighbor) return None, None ","(3)动态窗口与全局引导的融合避障策略:为解决局部避障与全局最优之间的矛盾,设计一种全局引导的动态窗口融合算法。该算法在传统动态窗口法的评价函数中增加了全局路径吸引力项和速度一致性项。全局吸引力项计算当前采样轨迹末端点到全局规划路径的最近距离,并乘以系数零点三,引导AGV不偏离主路径过远;速度一致性项惩罚与周围AGV速度差异过大的采样,系数为零点一五,以减少速度突变带来的追尾风险。此外,引入了基于场强预测的避障提前量:对于每个动态障碍物,根据其当前速度和方向预测其在零点五秒后的位置,并将该预测位置作为虚拟斥力源。斥力势场公式采用指数形式,当距离小于零点八米时斥力急剧增大。在宽度为一点二米的货架通道中,两台对向行驶的AGV相遇时,算法能够使双方各自向右偏移零点三米并减速至零点四米每秒,错车后自动加速回零点八米每秒。仿真对比显示,仅使用DWA时,AGV在动态环境中的平均行驶时间比全局最优路径长百分之三十四,而融合算法仅长百分之十一点五。在二十次随机动态障碍物测试中,成功避障率为百分之九十九点二,未出现死锁。最终在X公司实际仓库部署,AGV运行效率提升百分之二十二点七,急停次数降低百分之八十一。