第222篇 势场法——经典但仍有生命力的局部规划方法 局部规划方法讲了好几个了DWA、TEB、Lattice Planner。今天讲一个最老牌的——势场法Potential Field。这算法是Khatib在1986年提出的快40年了但面试中还是经常被问到。讲真势场法的思想非常朴素目标点产生引力障碍物产生斥力机器人沿着合力方向走。势场法的核心优势是计算极快——每个控制周期只需要算一次引力和斥力的矢量和。劣势也很明显局部最小值、狭窄通道中振荡、目标点附近不可达。但它的思想影响了很多后续算法理解势场法对学习其他规划方法有帮助。一、势场法的基本原理势场法把机器人看作一个在力场中运动的质点。力场由两部分组成引力场目标点产生引力方向指向目标大小和距离成正比或二次函数。离目标越远引力越大。斥力场障碍物产生斥力方向远离障碍物大小和距离成反比。离障碍物越近斥力越大。超过一定距离后斥力为零。机器人受到的合力 引力 所有障碍物的斥力。沿合力方向移动一步重复这个过程直到到达目标。def potential_field(robot_pos, goal, obstacles): # 引力指向目标 F_att k_att * (goal - robot_pos) # 斥力远离障碍物 F_rep Vector2D(0, 0) for obs in obstacles: d distance(robot_pos, obs) if d rho_0: # 影响范围 F_rep k_rep * (1/d - 1/rho_0) * (1/d**2) * normalize(robot_pos - obs) # 合力 F_total F_att F_rep return normalize(F_total) * max_speed二、势场法的三个经典问题势场法有三个广为人知的问题面试几乎必问。局部最小值引力和斥力可能恰好抵消——机器人卡在一个点上不动了。典型的场景是U型障碍物机器人走到U的底部两边墙壁的斥力和目标的引力平衡卡住了。解决办法加随机扰动跳出局部最小值、用虚拟目标把目标临时移到别处引导机器人绕过去、或者结合全局规划器。狭窄通道振荡机器人通过狭窄通道时两边障碍物的斥力方向相反合力在通道方向上来回摆动。机器人可能在通道口左右抖动无法通过。解决办法增加斥力的方向性只考虑最近障碍物的斥力、或者在通道中用虚拟墙引导。目标不可达当机器人接近目标时如果目标附近恰好有障碍物斥力可能大于引力。机器人到不了目标——在目标附近徘徊。解决办法修改引力函数离目标近时引力用线性函数而不是二次函数或者让斥力在目标距离很近时衰减。# 解决目标不可达的改进引力函数 def attractive_force(pos, goal): d distance(pos, goal) if d threshold: return k_att * d # 线性引力近处 else: return k_att * d**2 / 2 # 二次引力远处三、势场法的工程应用讲真纯势场法在工程中用得不多——问题太多了。但势场法的思想被广泛借鉴。DWA的评价函数中heading和clearance本质上就是引力和斥力。TEB的优化目标中也有避障项思路类似。甚至深度强化学习中的奖励函数设计也经常借鉴势场法的思想。工程上如果要用势场法一般做以下改进结合全局规划器A*或RRT给出粗略路径势场法做局部避障用虚拟子目标避免局部最小值斥力只考虑最近的一个障碍物避免振荡加入阻尼力和速度方向相反的力减少振荡势场法在机械臂中的应用势场法最初就是为机械臂提出的Khatib 1986。在关节空间中目标位姿产生引力障碍物产生斥力。机械臂的关节沿着合力方向移动。这个思路在简单场景中效果不错——特别是障碍物少、空间开阔的场景。但在复杂cluttered环境中关节空间的局部最小值问题很严重。势场法与导航代价地图在ROS导航中代价地图costmap本质上就是一个势场——障碍物中心代价高远处代价低。DWA和TEB在评价轨迹时都参考代价地图。所以可以说代价地图就是势场法的一种离散化实现。改进型势场法学术界提出了很多改进版本。比如Harmonic Potential Field调和势场——用拉普拉斯方程求解势场保证没有局部最小值但计算量大需要求解偏微分方程。Navigation Potential Field——修改斥力函数保证目标点是全局最小值。这些改进版在理论上解决了部分问题但工程上因为计算复杂度太高用得不多。四、面试实战Q势场法的优缺点是什么A优点是计算极快实现简单路径平滑。缺点是局部最小值、狭窄通道振荡、目标不可达。工程上需要配合全局规划器和各种改进策略。Q势场法和DWA有什么区别A势场法在每个点算合力方向沿合力方向走——没有速度概念不考虑运动学约束。DWA在速度空间中采样考虑了速度、加速度限制。DWA路径质量更好但计算量更大。Q势场法在实际项目中用过吗A纯势场法没有直接用过。但势场法的思想在很多地方用到过——比如深度强化学习的奖励函数设计中用距离目标的负值作为引力奖励用碰撞惩罚作为斥力。另外在做路径平滑时用类似势场法的力来把路径推离障碍物。Q怎么解决势场法的局部最小值问题A三种常见方法。一是加随机扰动——给合力加一个随机方向的小力让机器人有机会跳出局部最小值。二是虚拟子目标——检测到机器人卡住时临时设一个中间目标引导机器人绕过障碍物。三是结合全局规划——用A*或RRT给出全局路径势场法只负责局部避障。Q势场法的计算复杂度是多少A每个控制周期O(N)N是障碍物数量。计算每个障碍物的斥力是O(1)求和是O(N)。加上归一化和移动是O(1)。总复杂度O(N)。非常高效——即使有上千个障碍物单次计算也在微秒级。Q势场法能处理动态障碍物吗A能。势场法天然支持动态障碍物——每个控制周期重新计算合力就行。障碍物的速度不影响势场计算标准势场法不考虑障碍物速度。但如果障碍物移动很快机器人可能反应不过来——因为势场法没有预测能力。改进方案是加入速度势场——根据障碍物速度方向调整斥力方向。Q势场法的引力和斥力权重怎么调Ak_att和k_rep的比值决定了机器人的行为。k_att大机器人更积极地朝目标走但可能撞障碍物。k_rep大机器人更保守但可能绕远路。工程上一般k_att取1.0k_rep取100-200斥力影响范围rho_0取0.5-1.0m。具体数值需要根据机器人大小和速度调。Q势场法在面试中怎么回答比较好A先讲基本原理引力斥力再讲三个经典问题局部最小值、振荡、目标不可达和解决方案最后聊工程应用DWA/TEB中的势场思想、代价地图的本质。如果能提到Harmonic Potential Field和改进版本面试官会觉得你理解得比较深。小结势场法的核心目标产生引力障碍物产生斥力机器人沿合力方向移动。计算极快但有局部最小值、振荡、目标不可达三个经典问题。优势计算快实现简单路径平滑。 劣势局部最小值狭窄通道振荡目标不可达。势场法虽然古老但思想影响深远。DWA、TEB等现代方法中都能看到势场法的影子。在深度强化学习中势场法的思想被用来设计奖励函数和课程学习策略。面试中势场法是基础考点——要能讲清楚原理和三个经典问题的解决方案。能聊到改进版本和工程应用就更好了。下一篇讲混合A*——结合A*搜索和非完整约束的规划算法。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第221篇 Lattice Planner——基于状态格子的局部规划下一篇预告第223篇 混合A*——结合A*搜索与非完整约束有任何问题欢迎评论区留言我会尽量回复。