matlab練習程式(快速搜尋隨機樹RRT)

2022-06-08 19:27:08 字數 3076 閱讀 7998

rrt快速搜尋隨機樹英文全稱rapid-exploration random tree,和prm類似,也是一種路徑規劃演算法。

和prm類似,演算法也需要隨機撒點,不過不同的是,該演算法不是全域性隨機撒點,而是一次撒乙個點,然後判斷當前搜尋樹與隨機點距離,然後找到搜尋樹距離隨機點最近的節點,向該隨機點方向擴充套件。這裡隨機點有一定的概率是終點,所以搜尋樹最終是能夠到達終點的。

演算法流程如下:

1. 首先確定地圖與起始結束點位置,設定搜尋樹,這裡定義了乙個隨機點列表和乙個隨機點索引前驅列表代表搜尋樹。

2. 隨機撒乙個點,該點有可能是最終點,也有可能是全域性中的乙個隨機點,設為nextp。

3. 找到搜尋樹中距離nextp最近的節點,從該節點向nextp方向擴充套件step距離,生成新的路徑。

4. 判斷新生成的路徑是否通過障礙物或者該路徑已經被搜尋過,如果都沒有則該路徑加入到搜尋樹中,否則重新生成隨機點。

5. 不斷迴圈直到搜尋樹最終節點距離終點小於一定閾值,搜尋結束,根據前驅列表畫出搜尋路徑。

matlab**如下:

main.m:

clear all;

close all;

clc;

img = imread('

map.png

'); %空間地圖

imshow(img);

hold on;

[h,w]=size(img);

p=ginput(); %選取起始與結束位置

plot(p(:,

1),p(:,2),'r.'

);pc = p(1,:); %隨機節點列表

step = 20; %隨機擴充套件步長

parent = 1; %所有節點前驅,初始節點前驅為自己

while norm(pc(end,:)-p(2,:))>step %搜尋到距離結束節點一定距離停止

if rand()<0.3 %按30%概率隨機搜尋,70%概率朝著結束位置搜尋

nextp = [rand()*h rand()*w];

else

nextp = p(2

,:);

enddiff = repmat(nextp,length(pc(:,1)),1)-pc; %計算節點樹與待搜尋節點距離

[~,ind] = min(sqrt(diff(:,1).^2+diff(:,2).^2)); %找到距離帶搜尋節點最小的節點樹節點

direct = atan2(nextp(1)-pc(ind,1),nextp(2)-pc(ind,2

)); sin_dir =sin(direct);

cos_dir =cos(direct);

newp = pc(ind,:) + step*[sin_dir cos_dir]; %向著待搜尋節點方向擴充套件節點樹

isobs = check_obs(img,newp,pc(ind,:)); %判斷該路徑是否有障礙物

if isobs==1 %有障礙物重新搜尋

continue;

enddiff = repmat(newp,length(pc(:,1)),1)-pc; %判斷該路徑是否已搜尋過,如果已搜尋過,則重新搜尋

if min(sqrt(diff(:,1).^2+diff(:,2).^2))

continue;

endpc=[pc;newp]; %將新節點加入節點樹

parent = [parent;ind]; %設定新節點的前驅

line([pc(ind,

1) pc(parent(ind),1)],[pc(ind,2) pc(parent(ind),2

)]);

endline([pc(ind,

1) p(2,1)],[pc(ind,2) p(2,2)],'

color

','r');

ind =length(pc);

while ind~=1

ind = parent(ind); %不斷搜尋當前節點的父節點

line([pc(ind,

1) pc(parent(ind),1)],[pc(ind,2) pc(parent(ind),2)],'

color

','r');

end

check_obs.m:

function isobs =check_obs(img,p1,p2)  

[h w]=size(img);

d = norm(p1-p2);

direct = atan2(p1(1)-p2(1),p1(2)-p2(2

));sin_dir =sin(direct);

cos_dir =cos(direct);

for r=0

:d p = floor(p2 + r*[sin_dir cos_dir]);

y = p(2

); x = p(1

);

if y>=1 && y<=h && x>=1 && x<=w

if img(y,x) ==0

isobs = 1

;

return

;

endend

endisobs = 0

;end

結果如下:

原圖:

演算法結果:

matlab練習程式(DBSCAN)

和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...

matlab練習程式(c c 呼叫matlab)

就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...

matlab練習程式(SUSAN檢測)

susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...