人工势场法(APF) 是一种用于机器人路径规划的经典算法,其核心思想是将目标点设为引力源、障碍物设为斥力源,通过计算合力引导机器人运动。
基本原理
-
引力场:目标点对机器人产生吸引力,方向指向目标,大小与距离成正比。常见模型为:
Fatt=katt⋅(pgoal−probot)F_{att}=k_{att}⋅(p_{goal}−p_{robot})Fatt=katt⋅(pgoal−probot)
其中 kattk_{att}katt为引力增益系数。
-
斥力场:障碍物对机器人产生排斥力,方向远离障碍物,大小随距离减小而增大。典型公式为:

其中 d0d_0d0为斥力作用半径,krepk_{rep}krep为斥力增益系数。
-
合力与运动 :机器人沿合力方向(Ftotal=Fatt+FrepF_{total}=F_{att}+F_{rep}Ftotal=Fatt+Frep)移动,通常采用梯度下降法迭代更新位置。
MATLAB 实现步骤
1. 参数初始化
matlab
start = [0, 0]; % 起点
goal = [10, 10]; % 目标点
obstacles = [3,3; 7,7; 5,5]; % 障碍物坐标
k_att = 1; % 引力系数
k_rep = 100; % 斥力系数
d0 = 2; % 斥力作用半径
step_size = 0.1; % 步长
max_iter = 1000; % 最大迭代次数
2. 势场函数定义
引力计算:
matlab
function F_att = attractive_force(robot_pos, goal, k_att)
F_att = k_att * (goal - robot_pos);
end
斥力计算:
matlab
function F_rep = repulsive_force(robot_pos, obstacles, k_rep, d0)
F_rep = [0, 0];
for i = 1:size(obstacles, 1)
obs = obstacles(i, :);
d = norm(robot_pos - obs);
if d < d0
rep_factor = k_rep * (1/d - 1/d0) / d^2;
F_rep = F_rep + rep_factor * (robot_pos - obs);
end
end
end
3. 主循环与路径生成
matlab
robot_pos = start;
path = robot_pos;
for iter = 1:max_iter
F_att = attractive_force(robot_pos, goal, k_att);
F_rep = repulsive_force(robot_pos, obstacles, k_rep, d0);
F_total = F_att + F_rep;
% 更新位置(归一化合力方向)
robot_pos = robot_pos + step_size * F_total / norm(F_total);
path = [path; robot_pos];
% 检查终止条件
if norm(robot_pos - goal) < 0.1
break;
end
end
4. 结果可视化
matlab
figure;
plot(path(:,1), path(:,2), 'b-', 'LineWidth', 1.5); hold on;
plot(start(1), start(2), 'go', 'MarkerSize', 10, 'DisplayName', 'Start');
plot(goal(1), goal(2), 'ro', 'MarkerSize', 10, 'DisplayName', 'Goal');
plot(obstacles(:,1), obstacles(:,2), 'ks', 'MarkerSize', 10, 'DisplayName', 'Obstacles');
legend; grid on; axis equal;
xlabel('X'); ylabel('Y'); title('APF Path Planning');
常见问题与改进方法
局部极小值问题
当合力为零时,机器人可能陷入局部极小点(如障碍物对称包围时)。
改进策略:
-
随机扰动:检测到停滞时添加随机位移。
-
模拟退火:以一定概率接受劣解跳出局部极小,例如:
matlabif delta_U < 0 || exp(-delta_U/T) > rand() robot_pos = new_pos; % 接受新位置 end T = alpha * T; % 降温 -
虚拟目标点:引入临时目标点引导脱困。
目标不可达问题
当障碍物与目标过近时,斥力可能覆盖引力。可通过动态调节增益系数 (如随距离减小降低 krep)或使用速度势场改进。
路径平滑性优化
原始路径常呈锯齿状,可采用:
- B样条曲线拟合:对离散路径点进行平滑处理。
- 梯度平滑:多次迭代平均位置。
参考代码 基于人工势场法的路径规划问题 www.youwenfan.com/contentcso/96883.html
进阶扩展
- 三维路径规划:扩展至无人机等应用,需处理球体、圆柱体等障碍物距离计算。
- 动态环境:引入时间因子更新障碍物位置,实现实时避障。
- 多机器人协同:为每个机器人添加虚拟势场避免碰撞。
总结
人工势场法在MATLAB中实现简便、计算高效,适合实时性要求高的场景,但需注意:
- 参数调整:引力/斥力系数需平衡(过大易震荡,过小收敛慢);
- 局部极小:必须结合随机扰动或全局规划算法改进;
- 动态环境:需融合传感器数据实时更新势场。