传统人工势场法的MATLAB实现

传统人工势场法的MATLAB实现

传统人工势场法:通过人工建立势场,将无人机在周围环境中运动抽象成在引力场中运动,目标对无人机产生吸引力,障碍物对无人机产生排斥力,根据力的叠加原理,可以计算出合力的方向,即无人机飞行的方向,以此来进行路径规划。
关于传统人工势场法比较详细的介绍,以及引力势场和斥力势场的公式,大家可以参考以下这一篇博客,在此我就不多说了。
传统人工势场法比较详细的介绍
下面的MATLAB代码可以直接运行出结果,大家可以修改代码中的一些参数。

%初始化车的参数
Xo=[0 0];%起点位置
k=15;%计算引力需要的增益系数
m=3;%计算斥力的增益系数,都是自己设定的。
Po=1.5;%障碍影响距离,当障碍和车的距离大于这个距离时,斥力为0,即不受该障碍的影响。也是自己设定。
n=5;%障碍个数
l=0.2;%步长
J=1000;%循环迭代次数
%如果不能实现预期目标,可能也与初始的增益系数,Po设置的不合适有关。
%end 

%给出障碍和目标信息
Xsum=[4 4;1 0.6;2 2.5;1.4 2.1;3.2 2;2.5 1];
%这个向量是(n+1)*2维,其中第一个点[4 4]是目标位置,剩下的都是障碍的位置。
XXX=Xo;%j=1循环初始,将车的起始坐标赋给XXX
%***************初始化结束,开始主体循环******************
for j=1:J %循环开始
    goal(j,1)=XXX(1); %Goal是保存车走过的每个点的坐标。刚开始先将起点放进该向量。
    goal(j,2)=XXX(2);
    for i=1:n+1   %计算物体和障碍物、目标点的向量
         deltaX(i)=Xsum(i,1)-XXX(1);
         deltaY(i)=Xsum(i,2)-XXX(2);
         r(i)=sqrt(deltaX(i)^2+deltaY(i)^2);
    end
    Rgoal=sqrt((XXX(1)-Xsum(1,1))^2+(XXX(2)-Xsum(1,2))^2);   %路径点和目标的距离
    %目标点对路径点的引力
    Fatx=k*Rgoal*(deltaX(1)/Rgoal);
    Faty=k*Rgoal*(deltaY(1)/Rgoal);
    %各个障碍物对路径点的斥力
    for i=1:n
        if r(i+1)>Po
            Frex(i)=0;
            Frey(i)=0;
        else
            Frex(i)=-m*(1/r(i+1)-1/Po)/r(i+1)/r(i+1)*(deltaX(i+1)/r(i+1));
            Frey(i)=-m*(1/r(i+1)-1/Po)/r(i+1)/r(i+1)*(deltaY(i+1)/r(i+1));
        end
    end
    %计算合力
    Fsumx=Fatx+sum(Frex);
    Fsumy=Faty+sum(Frey);
    F=sqrt(Fsumx^2+Fsumy^2);
    %求解下一个路径点
    Xnext(1)=(XXX(1)+l*Fsumx/F);   %式子中的l是步长
    Xnext(2)=(XXX(2)+l*Fsumy/F);
    XXX=Xnext;
    
    if (sqrt((XXX(1)-Xsum(1,1))^2+(XXX(2)-Xsum(1,2))^2)<0.1)   %当物体接近目标点时
        k=j;   %迭代次数
        break;
    end
end

K=j;
goal(K,1)=Xsum(1,1);%把路径向量的最后一个点赋值为目标
goal(K,2)=Xsum(1,2);

%***********************************画出障碍,起点,目标,路径点*************************
%画出路径
X=goal(:,1);
Y=goal(:,2);
%路径向量Goal是二维数组,X,Y分别是数组的x,y元素的集合,是两个一维数组。
%x=[1 3 4 3 6 5.5 8];%障碍的x坐标
%y=[1.2 2.5 4.5 6 2 5.5 8.5];

x=Xsum(2:n+1,1);
y=Xsum(2:n+1,2);
plot(x,y,'o',4,4,'v',0,0,'ms',X,Y,'.r');


  • 22
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
人工势场法是一种常用的路径规划算法,可以用于机器人、自动驾驶等领域。以下是人工势场法Matlab实现步骤: ```Matlab % 1. 定义目标点和障碍物 goal = [10, 10]; % 目标点坐标 obstacle1 = [5, 5]; % 障碍物1坐标 obstacle2 = [8, 8]; % 障碍物2坐标 % 2. 定义势能函数 k_att = 1; % 引力系数 k_rep = 100; % 斥力系数 q = 2; % 斥力范围 U_att = @(q) 0.5 * k_att * q^2; % 引力势能函数 U_rep = @(q) 0.5 * k_rep * (1/q - 1/q^2); % 斥力势能函数 % 3. 定义机器人初始位置 robot_pos = [0, 0]; % 初始位置 % 4. 迭代计算机器人下一步位置 for i = 1:100 % 迭代100次 % 计算机器人到目标点的距离和方向 d = norm(robot_pos - goal); theta = atan2(goal(2) - robot_pos(2), goal(1) - robot_pos(1)); % 计算机器人受到的引力和斥力 F_att = -k_att * (robot_pos - goal); F_rep = [0, 0]; if norm(robot_pos - obstacle1) < q F_rep = F_rep + k_rep * (1/norm(robot_pos - obstacle1) - 1/q) * (robot_pos - obstacle1)/norm(robot_pos - obstacle1)^3; end if norm(robot_pos - obstacle2) < q F_rep = F_rep + k_rep * (1/norm(robot_pos - obstacle2) - 1/q) * (robot_pos - obstacle2)/norm(robot_pos - obstacle2)^3; end % 计算机器人下一步位置 robot_pos = robot_pos + 0.1 * (F_att + F_rep); % 判断是否到达目标点 if d < 0.1 break; end end % 5. 绘制机器人和障碍物 hold on; plot(goal(1), goal(2), 'ro', 'MarkerSize', 10, 'LineWidth', 2); plot(obstacle1(1), obstacle1(2), 'bx', 'MarkerSize', 10, 'LineWidth', 2); plot(obstacle2(1), obstacle2(2), 'bx', 'MarkerSize', 10, 'LineWidth', 2); plot(robot_pos(1), robot_pos(2), 'go', 'MarkerSize', 10, 'LineWidth', 2); ``` 以上是人工势场法Matlab实现步骤,其中包括定义目标点和障碍物、定义势能函数、定义机器人初始位置、迭代计算机器人下一步位置和绘制机器人和障碍物等步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值