1. 程式人生 > >PRM路徑規劃演算法

PRM路徑規劃演算法

%% PRM parameters
map=im2bw(imread('map1.bmp')); % input map read from a bmp file. for new maps write the file name here
source=[10 10]; % source position in Y, X format
goal=[490 490]; % goal position in Y, X format
k=50; % number of points in the PRM
display=true; % display processing of nodes


if ~feasiblePoint(source,map), error('source lies on an obstacle or outside map'); end
if ~feasiblePoint(goal,map), error('goal lies on an obstacle or outside map'); end

imshow(map);
rectangle('position',[1 1 size(map)-1],'edgecolor','k')
vertex=[source;goal]; % source and goal taken as additional vertices in the path planning to ease planning of the robot
if display, rectangle('Position',[vertex(1,2)-5,vertex(1,1)-5,10,10],'Curvature',[1,1],'FaceColor','r'); end % draw circle
if display, rectangle('Position',[vertex(2,2)-5,vertex(2,1)-5,10,10],'Curvature',[1,1],'FaceColor','r'); end


tic; % tic-toc: Functions for Elapsed Time

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  Step 1, Constructs the Map  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%  iteratively add vertices
while length(vertex)<k+2 
    x = double(int32(rand(1,2) .* size(map))); % using randomly sampled nodes(convert to pixel unit)
    if feasiblePoint(x,map), 
        vertex=[vertex;x]; 
        if display, rectangle('Position',[x(2)-5,x(1)-5,10,10],'Curvature',[1,1],'FaceColor','r'); end
    end
end

if display 
    disp('click/press any key');
	% blocks the caller's execution stream until the function detects that the user has pressed a mouse button or a key while the Figure window is active
    waitforbuttonpress;  
end

%%  attempts to connect all pairs of randomly selected vertices
edges = cell(k+2,1);  % edges to be stored as an adjacency list
for i=1:k+2
    for j=i+1:k+2
        if checkPath(vertex(i,:),vertex(j,:),map);
            edges{i}=[edges{i};j]; 
			edges{j}=[edges{j};i];
            if display, line([vertex(i,2);vertex(j,2)],[vertex(i,1);vertex(j,1)]); end
        end
    end
end

if display 
    disp('click/press any key');
    waitforbuttonpress; 
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  Step 2,  Finding a Path using A*  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     
	
% structure of a node is taken as: [index of node in vertex, historic cost, heuristic cost, total cost, parent index in closed list (-1 for source)]
Q=[1 0 heuristic(vertex(1,:),goal) 0+heuristic(vertex(1,:),goal) -1]; % the processing queue of A* algorihtm, open list
closed=[]; % the closed list taken as a list
pathFound=false;
while size(Q,1) > 0 	  % while open-list is not empty
     [A, I] = min(Q,[],1);% find the minimum value of each column
     current = Q(I(4),:); % select smallest total cost element to process
     Q=[Q(1:I(4)-1,:);Q(I(4)+1:end,:)]; % delete element under processing 
	 
     if current(1)==2 				    % index of node in vertex==2(goal)
         pathFound=true;break;
     end
	 
     for mv = 1:length(edges{current(1)}) % iterate through all edges from the node
         newVertex=edges{current(1)}(mv); % move to neighbor node
         if length(closed)==0 || length(find(closed(:,1)==newVertex))==0 % not in closed(Ignore the neighbor which is already evaluated)
             historicCost = current(2) + historic(vertex(current(1),:),vertex(newVertex,:)); % The distance from start to a neighbor
             heuristicCost = heuristic(vertex(newVertex,:),goal);
             totalCost = historicCost + heuristicCost;
			 
             add = true; % not already in queue with better cost
             if length(find(Q(:,1)==newVertex))>=1
                 I = find(Q(:,1)==newVertex);
                 if totalCost > Q(I,4), add=false; % not a better path
                 else Q=[Q(1:I-1,:);Q(I+1:end,:);];add=true; 
                 end
             end
			 
             if add
                 Q=[Q;newVertex historicCost heuristicCost totalCost size(closed,1)+1]; % add new nodes in queue
             end
         end           
     end
     closed=[closed;current]; % update closed lists
end

if ~pathFound
    error('no path found')
end

fprintf('processing time=%d \nPath Length=%d \n\n', toc, current(4)); 

path=[vertex(current(1),:)]; % retrieve path from parent information
prev = current(5);
while prev > 0
    path = [vertex(closed(prev,1),:);path];
    prev = closed(prev, 5);
end

imshow(map);
rectangle('position',[1 1 size(map)-1],'edgecolor','k')
line(path(:,2),path(:,1),'color','r');

相關推薦

路徑規劃: PRM 路徑規劃演算法 (Probabilistic Roadmaps 隨機路標圖)

路徑規劃作為機器人完成各種任務的基礎,一直是研究的熱點。研究人員提出了許多規劃方法如: 1. A* 2. Djstar

PRM路徑規劃演算法

%% PRM parameters map=im2bw(imread('map1.bmp')); % input map read from a bmp file. for new maps write the file name here source=[10 10]; % source position

路徑規劃PRM路徑規劃演算法(Probabilistic Roadmap 隨機路標圖)

global_planner: A*、Dijstra、prm、人工勢場、單元分解、快速搜尋樹(RRT)等 local_planner: eband_local_planner、asr_ftc_local_planner、dwa_local_planner、teb_loc

常用的地圖導航和路徑規劃演算法

作者:李傳學 連結:https://www.zhihu.com/question/24870090/answer/73834896 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。   明確一點,基本的圖搜尋演算法dijkstra是無法滿足網際網路地圖檢

Field D*路徑規劃演算法

Field D*路徑規劃演算法 1.柵格法路徑規劃存在的問題 2.Filed D*演算法主要思想解析 3.Filed D*演算法虛擬碼 4.演算法優化 5.演算法總結 參考文獻 緊接著上一篇D* Lite路徑規劃演算法

移動機器人D*Lite路徑規劃演算法設計、模擬及原始碼

轉自:https://blog.csdn.net/ayawaya/article/details/70155932 Dstar Lite路徑規劃演算法簡介 D*Lite演算法是Koenig S和Likhachev M基於LPA*演算法基礎上提出的路徑規劃演算法。 LPA

淺談路徑規劃演算法之Dijkstra演算法

 迪傑斯特拉(dijkstra)演算法是典型的用來解決最短路徑的演算法,也是很多教程中的範例,由荷蘭電腦科學家狄克斯特拉於1959年提出,用來求得從起始點到其他所有點最短路徑。該演算法採用了貪心的思想,每次都查詢與該點距離最的點,也因為這樣,它不能用來解決存在負權邊的圖。解

路徑規劃演算法之Bellman-Ford演算法

最近由於工作需要一直在研究Bellman-Ford演算法,這也是我第一次用C++編寫程式碼。 1、Bellman-Ford演算法總結 (1)Bellman-Ford演算法計算從源點(起始點)到任意一點的最短路徑的長度,初始化陣列m_Dist[m_Segment[i].m_StartPoint] = m_M

ROS中的路徑規劃演算法dijkstra和A*

ROS Navigation包裡面的GlobalPlanner自帶是提供了兩種全域性路徑規劃的方法,dijkstra和A* dijkstra 大家都知道了,A*在之前的一篇部落格裡面有介紹 A* 評估函式 為 f(n) = g(n) + h(n) g(

RRT路徑規劃演算法

%%%%% parameters map=im2bw(imread('map2.bmp')); % input map read from a bmp file. for new maps write the file name here source=[10 10]; % source position

路徑規劃演算法初步認識

資料 上面那個論文把uav的路徑規劃分為以下5類: sampling-based algorithms node-based algorithms mathematical model based algorithms Bio-inspired algorithms multi-fusion based

AI與遊戲——吃豆人(3)基本的路徑規劃演算法(上)

這次我們來講一下程式碼中涉及的一些路徑規劃演算法,在這個遊戲中,路徑規劃雖然不屬於人工智慧但是確實實現AI演算法不可或缺的基礎方法,下面就來大致介紹一下有哪些主要的方法以及這些方法的實現。 (1)getApproximateNextMoveTowardsTar

圖論動態規劃演算法——Floyd最短路徑

前言 推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。 Floyd演算法 Floyd是一種經典的多源最短路徑演算法,它通過動態規劃的思想來尋找給定加權圖中的多源

手把手教用matlab做無人駕駛(二)-路徑規劃A*演算法

對於路徑規劃演算法-A*演算法在matlab中模擬,首先我們在matlab中構建地圖: 先給出matlab主函式程式: % editor: Robert.Cao % 2018.9.1 clc clear all close all disp('A Star

Dijkstra演算法(D演算法)實現路徑搜尋matlab GUI 實現 路徑規劃

Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結

手把手教用matlab做無人駕駛(三)-路徑規劃A*演算法

這裡,我們更新主程式如下: % editor: Robert.Cao % 2018.9.1 clc clear all close all disp('A Star Path Planing start!!') p.start=[1,1]; %起始點 p.goa

路徑規劃Dijkstra演算法

Dijkstra搜尋最短路徑: 整體思路 從起始節點開始,將鄰域節點進行遍歷,標註好鄰域節點最小的累計路徑長度,直到遍歷到終止節點。 演算法複雜度 naive的方式,演算法複雜度為O(|V|2),其中|V|是節點數量 聰明的方式,使用優先佇

路徑規劃(最短路徑演算法C#實現

    ///<summary>/// RoutePlanner 提供圖演算法中常用的路徑規劃功能。     /// 2005.09.06     ///</summary>publicclass RoutePlanner     {         public RoutePlan

路徑/運動規劃演算法計算複雜度

1. 演算法的計算時間複雜度 相關連結: (1). “我們假設計算機執行一行基礎程式碼需要執行一次運算”。但這和矩陣的運算複雜度的關係呢?如果矩陣運算就是一行程式碼,那這就不對了?十分鐘搞定時間複雜度 (2).  Wiki :computational complexity o

路徑規劃之 A* 演算法

演算法介紹 A*(念做:A Star)演算法是一種很常用的路徑查詢和圖形遍歷演算法。它有較好的效能和準確度。本文在講解演算法的同時也會提供Python語言的程式碼實現,並會藉助matplotlib庫動態的展示演算法的運算過程。 A*演算法最初發表於1968年,由Stanford研究院的Peter Hart