第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:势场法的引力和斥力权重怎么调? A:k_att和k_rep的比值决定了机器人的行为。k_att大,机器人更积极地朝目标走,但可能撞障碍物。k_rep大,机器人更保守,但可能绕远路。工程上一般k_att取1.0,k_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*搜索与非完整约束
有任何问题欢迎评论区留言,我会尽量回复。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)