概率路图算法(PRM)

 

matlab代码

%*****prm algorithm*****
clc;clear;close all;
figure=imread('..\map\map3.png');
im=rgb2gray(figure);
im(im ~= 0)=255;
imshow(im);
hold on;
title('prm algorithm');

[x,y]=ginput(2);
start=[x(1),y(1)];
goal=[x(2),y(2)];
disp(['start:',num2str(start)]);
disp(['goal:',num2str(goal)]);
plot(start(1),start(2),'mo','MarkerFaceColor','b');
plot(goal(1),goal(2),'rp','MarkerFaceColor','r');

%%
nodesList=[];
startNode.position=start;
startNode.adjecentnodes=[];
startNode.cost=0;
nodesList=[nodesList;startNode];
param.pointNums=100;
param.length=400;
for ii=1:param.pointNums
    node.position=[rand*size(im,2),rand*size(im,1)];
    node.adjecentnodes=[];
    node.cost=inf;
    if node.position(1)<2 || node.position(1)>size(im,2)-1 || node.position(2)<2 || node.position(2)>size(im,1)-1
        continue;
    end
    if im(floor(node.position(2))-1,floor(node.position(1))-1)==0 ||...
            im(floor(node.position(2))-1,ceil(node.position(1))+1)==0 ||...
            im(ceil(node.position(2))+1,floor(node.position(1))-1)==0 ||...
            im(ceil(node.position(2))+1,ceil(node.position(1))+1)==0
        continue;
    end
    plot(node.position(1),node.position(2),'go','MarkerFaceColor','g');
    %drawnow;
    nodesList=[nodesList;node];
end
goalNode.position=goal;
goalNode.adjecentnodes=[];
goalNode.cost=inf; 
nodesList=[nodesList;goalNode];

for kk=1:numel(nodesList)-1
    for ll=kk+1:numel(nodesList)       
        if norm(nodesList(kk).position-nodesList(ll).position)<=param.length
            checkflag=collisionCheck(im,nodesList(kk),nodesList(ll));
            if ~checkflag
                continue;
            end
            nodesList(kk).adjecentnodes=[nodesList(kk).adjecentnodes;nodesList(ll).position];
            nodesList(ll).adjecentnodes=[nodesList(kk).position;nodesList(ll).adjecentnodes];
            plot([nodesList(kk).position(1),nodesList(ll).position(1)],[nodesList(kk).position(2),nodesList(ll).position(2)],...
                'b-','LineWidth',1);
            drawnow;
        end
    end
end

%% use dijkstra to find the path from start to goal
closelist=[];
openlist=[];
nodesList(1).parentPosition=[-1,-1];
openlist=[openlist,nodesList(1)];
findPathFlag=0;
while 1
    if ~numel(openlist)
        break;
    end
    minf=inf;
    minind=0;
    for i=1:numel(openlist)
        if minf>openlist(i).cost
            minf=openlist(i).cost;
            minind=i;
        end
    end
    curNode=openlist(minind);
    openlist(minind)=[];
    closelist=[closelist;curNode];
    for j=1:size(curNode.adjecentnodes,1)
        ind=findind(curNode.adjecentnodes(j,:),nodesList);
        % already in the closelist
        if numel(closelist)
            closeflag=0;
            for k=1:numel(closelist)
                if nodesList(ind).position==closelist(k).position
                    closeflag=1;
                    break;
                end
            end
            if closeflag
                continue;
            end
        end
        % already in the openlist or not
        openind=findind(nodesList(ind).position,openlist);
        if openind
            if curNode.cost+norm(curNode.position-curNode.adjecentnodes(j,:))<openlist(openind).cost
                openlist(openind).cost=curNode.cost+norm(curNode.position-curNode.adjecentnodes(j,:));
                continue;
            else 
                continue;
            end
        end
        nodesList(ind).cost=curNode.cost+norm(curNode.position-curNode.adjecentnodes(j,:));
        nodesList(ind).parentPosition=curNode.position;
        openlist=[openlist;nodesList(ind)];    
        if curNode.adjecentnodes(j,:)==goal
            findPathFlag=1;
            closelist=[closelist;nodesList(ind)];
            openlist(numel(openlist))=[];
            break;
        end
    end
    if findPathFlag
        break;
    end
end

if ~findPathFlag
    disp("fail");
else
    disp(['success',num2str(closelist(end).cost)]);
    path=[];
    pt=closelist(end).position;
    path=[path;pt];
    while 1
        plot([pt(1),closelist(findind(pt,closelist)).parentPosition(1)],[pt(2),closelist(findind(pt,closelist)).parentPosition(2)],...
            'r-','LineWidth',2);
        pt=closelist(findind(pt,closelist)).parentPosition;
        path=[pt;path];
        if pt==start
            break;
        end
    end
end
title(['prm algorithm  cost: ',num2str(closelist(end).cost)]);        

        

%% find the ind function
function ind=findind(node,nodesList)
    ind=0; % if return 0, show that the node isn't in nodesList
    for jj=1:numel(nodesList)
        if node==nodesList(jj).position
            ind=jj;
            return;
        end
    end
end
 
function flag=collisionCheck(map,node1,node2)  %flag==1,collision free
    flag=1;
    theta=atan2(node2.position(2)-node1.position(2),node2.position(1)-node1.position(1));
    if norm(node1.position-node2.position)<=1
        flag=1;
        return;
    end
    for i=0:1:norm(node1.position-node2.position)
        newPoint=node1.position+[i*cos(theta),i*sin(theta)];
        if map(round(newPoint(2)),round(newPoint(1)))==0
            flag=0;
            return;
        end
    end
end
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值