【规划】算法全景图:从全局寻路到局部避障

【规划】算法全景图:从全局寻路到局部避障 1. 全局规划与局部规划的核心差异第一次接触路径规划时最让我困惑的就是全局和局部规划的区别。直到在机器人项目里踩过几次坑才明白全局规划像用高德地图导航局部规划像自己握方向盘躲开突然出现的行人。全局规划依赖完整环境地图典型场景是扫地机器人构建房间地图后规划清扫路线局部规划则像自动驾驶车辆实时处理雷达检测到的障碍物。实测项目中两者的技术边界非常清晰数据依赖全局算法需要预先加载完整的栅格地图或拓扑图而DWA等局部算法只需要当前传感器半径5-10米内的数据计算频率A*这样的全局算法通常1-2秒运行一次而DWA需要以10Hz以上频率持续更新避障逻辑全局规划遇到新障碍物必须重新计算整条路径局部算法则像老司机打方向自然绕开去年给仓库AGV做导航时我混合使用A和DWA的效果最好A每5分钟根据最新货架位置计算全局路线DWA以20Hz频率处理动态障碍。这种组合既能应对叉车突然出现又不会因频繁全局重算导致CPU过载。2. 经典全局搜索算法演进史2.1 Dijkstra的奠基性工作1956年Dijkstra提出的算法现在看依然惊艳用广度优先搜索保证找到最短路径。我复现时发现它的核心是维护两个集合已确定最短路径的节点集合Q和待处理的节点集合U。每次从U中选出距离起点最近的节点加入Q并更新其邻居的距离值。def dijkstra(graph, start): Q set() dist {node: float(inf) for node in graph} dist[start] 0 while Q ! set(graph): u min((node for node in graph if node not in Q), keylambda x: dist[x]) Q.add(u) for v, w in graph[u].items(): if dist[v] dist[u] w: dist[v] dist[u] w return dist但在100x100栅格地图实测中Dijkstra需要遍历约80%的节点才能找到路径。后来项目改用A*后搜索范围立即缩小到30%以下。2.2 A*算法的启发式突破A*最精妙的是那个启发函数h(n)。我在无人机项目中测试发现欧几里得距离作为h(n)时搜索效率比曼哈顿距离高23%但要注意在三维空间计算时需加上高度差权重。有个坑是启发函数必须满足可纳性admissible即不能高估实际成本否则会丢失最优解。算法改进的实战经验打破平局技巧当f(n)相同时优先选择h(n)更小的节点路径长度平均减少7%动态加权在远离目标时增大启发式权重接近时降低权重搜索速度提升40%跳点搜索利用网格对称性跳过冗余节点特别适合游戏地图2.3 D*家族的动态适应能力当给野外机器人使用D* Lite时其反向搜索特性展现出巨大优势。有次测试中突然出现的石块让传统A需要300ms重新规划而DLite仅用50ms就完成路径修正。核心在于它保存了之前计算的rhs值遇到障碍时只需局部更新# 关键更新逻辑 def update_node(u): if u ! goal: rhs[u] min([c(u,v)g(v) for v in neighbors(u)]) if u in open_list: open_list.remove(u) if g(u) ! rhs(u): insert_to_open(u)实测数据显示在动态环境中D* Lite的规划耗时只有A*的15%-20%但内存占用会多30%左右。3. 基于采样的规划算法实战3.1 RRT的快速探索特性给机械臂做运动规划时RRT*的表现让我印象深刻。相比基础RRT其渐进最优特性使得路径成本随时间持续降低。测试数据表明算法版本100次迭代路径长1000次迭代路径长收敛速度RRT4.2m3.8m慢RRT*3.9m2.7m快30%实际应用时要特别注意步长参数机械臂适合0.1-0.3m步长无人机可用0.5-1m偏置采样每10次随机采样后向目标点采样1次收敛速度提升明显动态调整当扩展失败时自动缩小步长成功率提高60%3.2 Informed RRT*的优化技巧在狭窄通道场景中基础RRT成功率只有40%改用Informed RRT后达到92%。其秘诀在于将采样限制在椭圆区域内def informed_rrt_star(start, goal): # 初始搜索 solution rrt_star(start, goal) if not solution: return None # 计算椭圆区域 c_min distance(start, goal) x_center (start goal)/2 C rotation_matrix_to_ellipse(start, goal) # 在椭圆内继续优化 while time_remaining(): x_rand sample_from_ellipse(c_min, x_center, C) solution try_improve(solution, x_rand) return solution实测显示这种优化使路径成本降低速度提升3倍特别适合手术机器人等高精度场景。4. 局部避障算法的工程细节4.1 DWA的参数调优经验动态窗口法最关键的三个参数是速度分辨率线速度和角速度的采样间隔通常设为0.05m/s和0.1rad/s模拟时间1.5-2.5秒为佳太短缺乏前瞻性太长计算量大障碍物权重0.8-1.2效果最好过高会导致机器人胆小在餐厅服务机器人项目中我们通过大量测试得出最佳参数组合场景类型最大速度模拟时间障碍权重狭窄走廊0.6m/s1.8s1.1开阔大厅1.2m/s2.2s0.9人流量大区域0.4m/s2.0s1.34.2 轨迹优化的实用技巧局部规划生成的原始路径往往有抖动用这三个技巧可大幅改善贝塞尔平滑对路径点做二次贝塞尔插值计算量小适合嵌入式设备速度规划根据路径曲率动态调整速度转弯时自动降速30%紧急制动当检测到突然出现的障碍物时采用S曲线减速而非急刹在物流AGV上实施后电机磨损减少45%货物移位投诉下降80%。核心代码片段void smooth_trajectory(Trajectory raw) { const int n raw.size(); for(int i1; in-1; i) { raw[i].x 0.25*raw[i-1].x 0.5*raw[i].x 0.25*raw[i1].x; raw[i].y 0.25*raw[i-1].y 0.5*raw[i].y 0.25*raw[i1].y; } }这些年在不同项目中使用过几乎所有主流规划算法最大的体会是没有万能算法只有合适场景的算法。室内机器人用A*DWA组合最稳自动驾驶更适合LatticeRRT*而机械臂则需要STOMP等考虑动力学的算法。关键要理解每个算法的数学本质和工程边界才能做出最佳选择。