航迹规划——人工势场算法

人工势场算法简介


  人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过求合力来控制移动机器人的运动。应用势场法规划出来的路径一般是比较平滑并且安全,但是这种方法存在局部最优点问题。
  该算法在网上已经有较多的详细解释,在这里不做具体解释,主要讲解下Matlab下代码的编写。想了解算法原理的可以看最后的参考资料。


人工势场算法缺陷

  1. 当物体离目标点比较远时,引力将变的特别大,相对较小的斥力在甚至可以忽略的情况下,物体路径上可能会碰到障碍物。
  2. 当物体离目标点比较远时,引力将变的特别大,相对较小的斥力在甚至可以忽略的情况下,物体路径上可能会碰到障碍物。
  3. 在某个点,引力和斥力刚好大小相等,方向想反,则物体容易陷入局部最优解或震荡。

缺陷解决方法

缺陷一:对于可能会碰到障碍物的问题,可以通过修正引力函数来解决,避免由于离目标点太远导致引力过大。

(b)目标点附近有障碍物导致目标不可达的问题,引入一种新的斥力函数。
这里写图片描述
缺陷三:局部最优问题是一个人工势场法的一个大问题,这里可以通过加一个随机扰动,让物体跳出局部最优值。类似于梯度下降法局部最优值的解决方案。


重点代码解析


计算目标点和障碍物对智能体所在位置的角度


输入意义
X起点坐标
Xsum目标和障碍的坐标向量,是(n+1)*2矩阵
输出意义
Y是引力,斥力与x轴的角度向量
function Y=compute_angle(X,Xsum,n)%Y是引力,斥力与x轴的角度向量,X是起点坐标,Xsum是目标和障碍的坐标向量,是(n+1)*2矩阵
  for i=1:n+1%n是障碍数目
      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;%保存每个角度在Y向量里面,第一个元素是与目标的角度,后面都是与障碍的角度
  end
end

目标点对智能体所在位置引力计算函数


输入意义
X当前坐标
Xsum障碍的坐标
k增益常数
angle角度分量
bnull
Po障碍影响距离,大于Po时影响力为0
n障碍物数量
输出意义
Yatx引力在智能体当前位置的 X 轴分量
Yaty引力在智能体当前位置的 Y 轴分量
function [Yatx,Yaty]=compute_Attract(X,Xsum,k,angle,b,Po,n)
%把路径上的临时点作为每个时刻的Xgoal
R=(X(1)-Xsum(1,1))^2+(X(2)-Xsum(1,2))^2;%路径点和目标的距离平方
r=sqrt(R);%路径点和目标的距离
Yatx=k*r*cos(angle);%angle=Y(1)
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));%路径点和障碍的距离保存在数组rrei中
    R0=(Xsum(1,1)-Xsum(i+1,1))^2+(Xsum(1,2)-Xsum(i+1,2))^2;
    r0=sqrt(R0);
    if rre(i)>Po%如果每个障碍和路径的距离大于障碍影响距离,斥力令为0
          Yrerx(i)=0;
          Yrery(i)=0;
          Yatax(i)=0;
          Yatay(i)=0;
    else
        %if r0<Po
        if rre(i)<Po/2
       Yrer(i)=m*(1/rre(i)-1/Po)*(1/Rrei(i))*(rat^a);%分解的Fre1向量
       Yata(i)=a*m*((1/rre(i)-1/Po)^2)*(rat^(1-a))/2;%分解的Fre2向量
       Yrerx(i)=(1+0.1)*Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)
       Yrery(i)=-(1-0.1)*Yrer(i)*sin(angle_re(i));
       Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)
       Yatay(i)=Yata(i)*sin(angle_at);
        else
       Yrer(i)=m*(1/rre(i)-1/Po)*1/Rrei(i)*Rat;%分解的Fre1向量
       Yata(i)=m*((1/rre(i)-1/Po)^2)*rat;%分解的Fre2向量
       Yrerx(i)=Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)
       Yrery(i)=Yrer(i)*sin(angle_re(i));
       Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)
       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.机器人路径规划_人工势场法

由于无人机的航迹规划人工势场法的代码可能涉及到不同的编程语言和不同的无人机系统,因此在这里无法提供通用的代码。以下是一个简单的Python示例代码,用于展示如何使用人工势场法规划无人机的航迹。 ```python import numpy as np # 定义目标点和障碍物 goal = np.array([10, 10]) obstacles = np.array([[5, 5], [7, 8], [9, 9]]) # 定义势场参数 kf = 1 # 目标点吸引力系数 ko = 5 # 障碍物斥力系数 q = 1 # 无人机位置惩罚系数 # 计算势场力 def attractive_force(position): return kf * (goal - position) def repulsive_force(position): force = np.zeros(2) for obstacle in obstacles: distance = np.linalg.norm(position - obstacle) if distance < 1e-6: distance = 1e-6 direction = (position - obstacle) / distance force += ko * ((1 / distance) - (1 / 1)) * (1 / (distance ** 2)) * direction return force def total_force(position): return attractive_force(position) + repulsive_force(position) - q * position # 定义无人机初始位置和速度 position = np.array([0, 0]) velocity = np.array([1, 1]) # 迭代计算无人机下一时刻位置和速度 dt = 0.1 # 时间步长 for i in range(100): acceleration = total_force(position) velocity += acceleration * dt position += velocity * dt # 输出无人机当前位置和速度 print("Position:", position) print("Velocity:", velocity) ``` 在这个示例代码中,我们使用了一个简单的二维空间,定义了一个目标点和三个障碍物。我们假设无人机的速度是恒定的,因此只需要计算无人机的加速度即可。迭代计算无人机下一时刻的位置和速度,直到达到最终目标点。在每次迭代中,我们使用人工势场法计算无人机的势场力,并将其转换为加速度。最终,在程序中输出无人机的当前位置和速度。 需要注意的是,这只是一个简单的示例代码,无法直接运行在真正的无人机系统中。在实际应用中,需要根据具体的无人机系统和任务需求,进行适当的修改和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值