机器人导航,人工势场法的地图导航规划

@[Matlab]人工势场法的导航规划示例

20*20二维地图,
随机给出障碍点,
能否到达目标点有提示,
除了地图底子以外其他参数都在第一个模块可以自己改,
代码有注释,斥力公式是改进人工势场的
作业来着,肝了挺久的吧,纯手打。

`主程序:main.m

%main.m
clf
clear;

%设置参数模块
x0(1)=0;    %起始点坐标
y0(1)=0;    
xg=20;      %目标点坐标
yg=20;      
Kat=10;     %引力增益		%引力增益不宜过大
Kre=1000;   %斥力增益
Q=1;        %安全距离		%安全距离Q不得小于步长h
h=0.01;     %前进步长		%步长可调,越小效果越好,时间会增加;
Hmax=10000; %步长容限		%步长过小则还需增大步长容限;		
Nobc=20;    %障碍点数量(这道题设为20)


%绘制地图模块
%障碍点位置使用随机数生成,所以可能有导航无解情况,不要慌
xob=[];
yob=[];     
for i=1:Nobc
    xob(i)=randperm(20,1);
    yob(i)=randperm(20,1);
    %不让障碍点重合于出发点和目标点
    while ((xob(i)==x0(1))&&(yob(i)==y0(1))||((xob(i)==xg)&&(yob(i)==yg)))      
        xob(i)=randperm(20,1);
        yob(i)=randperm(20,1);
    end
end
scatter(xob,yob,'k');hold on;
xlim([0,20]),ylim([0,20]);
xticks(0:1:20);
yticks(0:1:20);
grid;hold on;
plot(xg,yg,'*g');hold on;
xlabel('地图横坐标');
ylabel('地图纵坐标');
title('人工势场法20*20地图导航轨迹图');

%正式的步进搜索模块:
x0=[];
y0=[];
Frex=[;];
Frey=[;];
Fatx=[]';
Faty=[];
Fsumx=[];
Fsumy=[];
Cos=[];
Sin=[];
%步长搜索循环:
for j=1:Hmax
    x0(1)=0;
    y0(1)=0;
    Fsumx(j)=0;
    Fsumy(j)=0;
%若已到达目标点或者超界或者步进尺度用完则终止搜索
    if(abs(x0(j)-xg)<10^-1)&&(abs(y0(j)-yg)<10^-1) 
        fprintf('到达目的地,停止搜索\n');
        %成功到达目的点的话显示障碍物信息
        fprintf('障碍点:\n');                                                      
        for kdispx=1:20
            fprintf('%d\t',xob(kdispx));
        end
        fprintf('\n');
        for kdispy=1:20
            fprintf('%d\t',yob(kdispy));
        end
        fprintf('\nj=%d\n',j);
        break
    end
    if((x0(j)<0)||(x0(j)>20)||(y0(j)<0)||(y0(j)>20))                               
        %轨迹点超界条件,超界了就终止搜索
        fprintf('行车点超界,终止搜索\n');
        fprintf('j=%d\n',j);
        break
    end
    if(j==Hmax)
        fprintf('步进尺度已用完,运气不好再走一次\n');
        fprintf('x0(i)=%d,y0(j)=%d,j=%d\n',x0(j),y0(j),j);
    end  
%调用计算斥力模块
    for k=1:Nobc
        [Frex(j,k),Frey(j,k)]=compute_Repulso(x0(j),y0(j),xob(k),yob(k),Kre,Q);
    end
    Fsumx(j)=sum(Frex(j,1:Nobc));
    Fsumy(j)=sum(Frey(j,1:Nobc));
%调用计算引力模块
    [Fatx(j),Faty(j)]=compute_Attract(x0(j),y0(j),xg,yg,Kat);
    Fsumx(j)=Fsumx(j)+Fatx(j);
    Fsumy(j)=Fsumy(j)+Faty(j);    
%调用计算角度模块
    %求每一次所在点在步长半径内受到合力正交值指示角度
    [Cos(j),Sin(j)]=compute_Angle(Fsumx(j),Fsumy(j));                               
%作用力步进,计算下一个定位点位置
    %根据正交后x,y各方向要走的距离得到下一个点位置
    x0(j+1)=x0(j)+h*Cos(j);
    y0(j+1)=y0(j)+h*Sin(j);
%撞上障碍点警告
    for z=1:20
        if( abs(x0(j+1)-xob(z))<10^-1)&&(abs(x0(j+1)-xob(z))<10^-1)  
            fprintf('障碍点重合,j=%d,k=%d\n',j,k);
        end
    end    
end
plot(x0,y0,'r');

根据障碍物位置与当前位置,计算引力函数:compute_Attract.m:

%compute_Attract.m
%Kat:引力增益,(x0,y0):所在位置
function [fatx,faty]=compute_Attract(x,y,xg,yg,Kat)   
dgx=x-xg;
dgy=y-yg;
%Uat=1/2*K*dg2;Fat=Uat的各方向偏导
fatx=-Kat*dgx;
faty=-Kat*dgy;
end

根据障碍物位置与当前位置,计算斥力函数:compute_Repulso.m:

%compute_Repulso.m
%Kre:斥力增益,(x0,y0):所在位置
function [frex,frey]=compute_Repulso(x,y,xr,yr,Kre,Q)
drx=x-xr;
dry=y-yr;
dr2=drx^2+dry^2;
dr=sqrt(dr2);
if(dr>Q)
    frex=0;
    frey=0;
else
    %dr<=Q
    %原版人工势场法斥力公式:Ure=1/2*Kre*(1/dr-1/Q)^2;
    %之后发现求偏导用改进的人工势场法出来的斥力均衡正常一些
    frex=Kre*(1/dr-1/Q)^2*drx;
    frey=Kre*(1/dr-1/Q)^2*dry; 
end

计算下一步前进方向的角度函数:%compute_Angle.m

%compute_Angle.m
function [cos,sin]=compute_Angle(a,b)
c=sqrt(a^2+b^2);
cos=a/c;
sin=b/c;        %最基本的直角三角形求角度
end

附上程序打包:

https://download.csdn.net/download/LXT13592800607/86399866

载入Matlab添加至路径—>点击<运行>即可观察生成坐标地图上导航规划结果,命令行输出生成的障碍点横、纵坐标,可能存在有的随机地图生成使得导航陷入局部最优解而未跑至终点的情况,效果很直观。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 完整版人工势场法 (Artificial Potential Field) 是一种路径规划方法,它模拟了物理学中的势能和力的概念来计算机器人或车辆的运动路径。它的基本思想是将机器人视为一个能量粒子,遵循从高势能到低势能的物理规律,从而找到最优路径。 在完整版人工势场法中,机器人会受到两种势能的影响:引力势能和斥力势能。引力势能使机器人被吸引到目标点,而斥力势能则将机器人从障碍物上推离,以避免碰撞。这种势能的计算涉及到物理学中的梯度和力的概念。 具体而言,在完整版人工势场法中,首先需要建立地图,并根据目标点和障碍物的位置设置相应的势能场。然后,在每个时刻,机器人会根据当前位置来计算合力,并根据合力的方向和大小来选择下一步的运动方向。这个过程会一直进行,直到机器人到达目标点。 完整版人工势场法的优点是简单易实现,适用于实时路径规划。但也存在一些问题,比如容易陷入局部最优解、可能会出现震荡等。因此,在实际应用中,通常需要结合其他方法来进行改进和优化。 Matlab是一种功能强大的数值计算和科学建模软件,广泛应用于科学计算、工程设计、数据分析等领域。许多国外的研究者使用Matlab来编写完整版人工势场法的路径规划算法,并通过仿真和实验证明了其有效性和可行性。 总之,完整版人工势场法是一种基于物理学概念的路径规划方法,其原理是模拟物体在势能场中移动的行为。通过引力势能和斥力势能的计算,机器人可以找到一条避开障碍物的最优路径。Matlab是一种常用的科学计算软件,被广泛用于这种方法的实现和验证。 ### 回答2: 人工势场法是一种常用的路径规划方法,常见于机器人导航、自动驾驶等领域。在路径规划中,人工势场法利用了势场的概念,将环境中的障碍物视为势场并设计了引力场和斥力场。 在完整版的人工势场法中,首先,我们需要了解目标位置和当前位置之间的距离,并计算引力场的大小和方向。引力场使机器人朝目标位置移动,这可以通过设定目标位置作为引力场中心,计算机器人受到的引力大小和方向来实现。 其次,我们需要考虑障碍物对机器人路径的影响。障碍物被视为斥力场,当机器人靠近障碍物时,斥力场会增加,并使机器人远离障碍物。斥力场的计算可以根据机器人与障碍物的距离来确定。 将引力场和斥力场叠加起来,就得到了机器人所处位置的总势场。机器人根据总势场来选择下一步的移动方向,通常是选择总势场梯度的方向,即朝向梯度下降的方向移动。 在Matlab中,我们可以使用数值计算和图形绘制的函数库来实现人工势场法。通过定义机器人和障碍物的初始位置、目标位置以及相关参数,然后使用迭代计算的方法来不断更新机器人的位置,直到机器人到达目标位置。 国外的人在该领域做出了许多重要的研究和贡献。他们提出了很多优化算法和改进方法,例如引入随机扰动来避免局部极小值、改进斥力场的计算等。他们还将人工势场法与其他路径规划算法结合,使其更加适用于复杂的实际应用场景。 这些研究成果使得人工势场法在路径规划领域得到了广泛的应用,并且在实际机器人导航、自动驾驶等领域取得了良好的效果。在未来,人工势场法还有很大的发展空间,可以进一步优化算法,提高路径规划的效率和准确性。 ### 回答3: 完整版人工势场法路径规划是一种被国外学者提出并使用MATLAB编程实现的路径规划算法。在传统的人工势场法基础上,该方法针对局部极小值和不可达问题进行了改进和优化。 完整版人工势场法首先构建了一个人工势场,其中包括吸引势场和斥力势场。吸引势场通过设置目标点的吸引力,使路径朝着目标点方向前进。斥力势场则通过障碍物的斥力,阻止路径靠近障碍物。 使用MATLAB编程实现完整版人工势场法路径规划,首先需要将整个地图离散化为一个格点网格,然后计算每个格点处的斥力。 在计算路径时,起点处由吸引势场主导,它会引导路径朝着目标点方向移动。但同时考虑到斥力势场的影响,路径会避开障碍物。 路径规划算法通常会使用递归进行迭代,直到找到一条连接起点和目标点的路径。在每一次迭代过程中,根据起点和目标点周围的势场分布,选择一个局部最优的方向,然后进行路径搜索。 国外学者的完整版人工势场法路径规划算法相对于传统的人工势场法更加高效和准确。通过使用MATLAB进行编程实现,可以很方便地进行路径规划的可视化和仿真实验,进一步验证和改进该算法的性能。 总之,完整版人工势场法路径规划是一种由国外学者提出,基于MATLAB编程实现的路径规划算法。该算法通过构建吸引势场和斥力势场,实现路径规划并解决局部极小值和不可达问题。它的优势在于高效、准确且易于可视化和仿真实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值