路径规划人工势场法以及改进人工势场法matlab代码,包含了斥力,引力,合力势场图
·
路径规划人工势场法以及改进人工势场法matlab代码,包含了斥力,引力,合力势场图,成功解决了机器人在目标点周围徘徊动荡的问题。

人工势场法在机器人路径规划里属于老江湖了,原理就是把目标点当磁铁吸引机器人,障碍物当同极磁铁产生排斥。最近折腾Matlab复现的时候发现个邪门事儿——机器人到了目标点附近就开始鬼畜摇摆,活像在跳机械舞。

先上传统方法的代码骨架,引力计算简单粗暴:
function F_att = attractive_force(q, q_goal, k_att)
r = norm(q - q_goal);
F_att = -k_att * (q - q_goal); % 线性引力
end
斥力部分带安全距离保护层:
function F_rep = repulsive_force(q, obstacle, k_rep, d0)
r = norm(q - obstacle);
if r > d0
F_rep = [0; 0];
else
F_rep = k_rep*(1/r - 1/d0)*(1/r^2)*(q - obstacle)/r;
end
end
画出来的势场图看着挺合理(图1),但实际跑起来机器人就像喝了假酒——离目标点越近越抽搐。问题出在引力与斥力的平衡点:当机器人接近目标时,斥力导数项(1/r²)会导致合力震荡。

改进方案在斥力函数里埋了个彩蛋——增加目标距离衰减因子:
function F_rep = improved_repulsion(q, obstacle, q_goal, k_rep, d0, n)
r = norm(q - obstacle);
to_goal = norm(q - q_goal);
if r > d0
F_rep = [0; 0];
else
% 关键改进:引入目标距离衰减项
decay_term = to_goal^n;
F_rep = (k_rep*(1/r - 1/d0)*(1/r^2) * decay_term) * (q - obstacle)/r;
end
end
这里的n是衰减指数,实测取2效果最佳。改进后的势场图(图2)明显看到目标点附近的势能井变深了,相当于给机器人脚底装了磁铁。

主循环里需要同时计算多个障碍物的合力:
while norm(robot_pos - goal) > 0.1
F_total = attractive_force(robot_pos, goal, 1.5);
for obs = 1:size(obstacles,2)
F_rep = improved_repulsion(robot_pos, obstacles(:,obs), goal, 2, 3, 2);
F_total = F_total + F_rep;
end
robot_pos = robot_pos + 0.2*F_total/norm(F_total); % 步长控制
end
参数调试有个小技巧:先把斥力系数调小,让机器人能走到目标点附近,再逐步增大直到避开障碍物。最后对比改进前后的运动轨迹(图3),原来的螺旋逼近路线变成了干净利落的直线刹车。

这种改进相当于给斥力加了智能衰减——离目标越近,障碍物的影响力越弱。就像快到终点时自动关闭障碍物雷达,避免过分敏感的操作抖动。实际在Matlab里跑,原本需要5秒的震荡收敛现在1秒内就能稳如老狗。
更多推荐
所有评论(0)