rrt快速搜尋隨機樹英文全稱rapid-exploration random tree,和prm類似,也是一種路徑規劃演算法。
和prm類似,演算法也需要隨機撒點,不過不同的是,該演算法不是全域性隨機撒點,而是一次撒乙個點,然後判斷當前搜尋樹與隨機點距離,然後找到搜尋樹距離隨機點最近的節點,向該隨機點方向擴充套件。這裡隨機點有一定的概率是終點,所以搜尋樹最終是能夠到達終點的。
演算法流程如下:
1. 首先確定地圖與起始結束點位置,設定搜尋樹,這裡定義了乙個隨機點列表和乙個隨機點索引前驅列表代表搜尋樹。
2. 隨機撒乙個點,該點有可能是最終點,也有可能是全域性中的乙個隨機點,設為nextp。
3. 找到搜尋樹中距離nextp最近的節點,從該節點向nextp方向擴充套件step距離,生成新的路徑。
4. 判斷新生成的路徑是否通過障礙物或者該路徑已經被搜尋過,如果都沒有則該路徑加入到搜尋樹中,否則重新生成隨機點。
5. 不斷迴圈直到搜尋樹最終節點距離終點小於一定閾值,搜尋結束,根據前驅列表畫出搜尋路徑。
matlab**如下:
main.m:
clear all;check_obs.m: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
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。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...