人工势场算法简介
人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过求合力来控制移动机器人的运动。应用势场法规划出来的路径一般是比较平滑并且安全,但是这种方法存在局部最优点问题。 该算法在网上已经有较多的详细解释,在这里不做具体解释,主要讲解下Matlab下代码的编写。想了解算法原理的可以看最后的参考资料。
人工势场算法缺陷
当物体离目标点比较远时,引力将变的特别大,相对较小的斥力在甚至可以忽略的情况下,物体路径上可能会碰到障碍物。 当物体离目标点比较远时,引力将变的特别大,相对较小的斥力在甚至可以忽略的情况下,物体路径上可能会碰到障碍物。 在某个点,引力和斥力刚好大小相等,方向想反,则物体容易陷入局部最优解或震荡。
缺陷解决方法
缺陷一:对于可能会碰到障碍物的问题,可以通过修正引力函数来解决,避免由于离目标点太远导致引力过大。
(b)目标点附近有障碍物导致目标不可达的问题,引入一种新的斥力函数。 缺陷三:局部最优问题是一个人工势场法的一个大问题,这里可以通过加一个随机扰动,让物体跳出局部最优值。类似于梯度下降法局部最优值的解决方案。
重点代码解析
计算目标点和障碍物对智能体所在位置的角度
输入 意义 X 起点坐标 Xsum 目标和障碍的坐标向量,是(n+1)*2矩阵
function Y =compute_angle (X,Xsum,n) %Y 是引力,斥力与x 轴的角度向量,X 是起点坐标,Xsum 是目标和障碍的坐标向量,是(n+1) *2矩阵
for i =1 :n+1
deltaX(i )=Xsum(i ,1 )-X(1 );
deltaY(i )=Xsum(i ,2 )-X(2 );
r(i )=sqrt (deltaX(i )^2 +deltaY(i )^2 );
if deltaX(i )>0
theta=acos (deltaX(i )/r(i ));
else
theta=pi -acos (deltaX(i )/r(i ));
end
if i ==1
angle =theta;
else
angle =theta;
end
Y(i )=angle ;
end
end
目标点对智能体所在位置引力计算函数
输入 意义 X 当前坐标 Xsum 障碍的坐标 k 增益常数 angle 角度分量 b null Po 障碍影响距离,大于Po时影响力为0 n 障碍物数量
输出 意义 Yatx 引力在智能体当前位置的 X 轴分量 Yaty 引力在智能体当前位置的 Y 轴分量
function [Yatx,Yaty] =compute_Attract (X,Xsum,k,angle,b,Po,n)
R=(X(1 )-Xsum(1 ,1 ))^2 +(X(2 )-Xsum(1 ,2 ))^2 ;
r=sqrt (R);
Yatx=k*r*cos (angle );
Yaty=k*r*sin (angle );
end
障碍物对智能体所在位置斥力计算函数
function [Yrerxx,Yreryy,Yataxx,Yatayy] =compute_repulsion (X,Xsum,m,angle_at,angle_re,n,Po,a) %输入参数为当前坐标,Xsum 是目标和障碍的坐标向量,增益常数,障碍,目标方向的角度
Rat=(X(1 )-Xsum(1 ,1 ))^2 +(X(2 )-Xsum(1 ,2 ))^2 ;
rat =sqrt (Rat);
for i =1 :n
Rrei(i )=(X(1 )-Xsum(i +1 ,1 ))^2 +(X(2 )-Xsum(i +1 ,2 ))^2 ;
rre(i )=sqrt (Rrei(i ));
R0=(Xsum(1 ,1 )-Xsum(i +1 ,1 ))^2 +(Xsum(1 ,2 )-Xsum(i +1 ,2 ))^2 ;
r0=sqrt (R0);
if rre(i )>Po
Yrerx(i )=0 ;
Yrery(i )=0 ;
Yatax(i )=0 ;
Yatay(i )=0 ;
else
if rre(i )<Po/2
Yrer(i )=m*(1 /rre(i )-1 /Po)*(1 /Rrei(i ))*(rat ^a);
Yata(i )=a*m*((1 /rre(i )-1 /Po)^2 )*(rat ^(1 -a))/2 ;
Yrerx(i )=(1 +0.1 )*Yrer(i )*cos (angle_re(i ));
Yrery(i )=-(1 -0.1 )*Yrer(i )*sin (angle_re(i ));
Yatax(i )=Yata(i )*cos (angle_at);
Yatay(i )=Yata(i )*sin (angle_at);
else
Yrer(i )=m*(1 /rre(i )-1 /Po)*1 /Rrei(i )*Rat;
Yata(i )=m*((1 /rre(i )-1 /Po)^2 )*rat ;
Yrerx(i )=Yrer(i )*cos (angle_re(i ));
Yrery(i )=Yrer(i )*sin (angle_re(i ));
Yatax(i )=Yata(i )*cos (angle_at);
Yatay(i )=Yata(i )*sin (angle_at);
end
end
end
Yrerxx=sum(Yrerx);
Yreryy=sum(Yrery);
Yataxx=sum(Yatax);
Yatayy=sum(Yatay);
end
完整Matlab代码下载链接
人工势场算法完整“.m”文件下载
参考资料
1.路径规划-人工势场法 2.机器人路径规划_人工势场法