bug演算法是一種避障演算法,思路就是想象從起始點有乙隻小蟲,不停延直線靠近目標,如果遇見障礙物,則沿著障礙物邊界移動,繞過障礙物後繼續沿直線靠近目標。
從上面說的思想就可以認為該演算法由兩種路徑組成,一種直線路徑,一種障礙物環繞路徑。
直線路徑可以認為是起點到終點的線段,不過該線段要去除掉和障礙物相交的部分。
環繞路徑這裡用了取巧的方法,由於這裡用的是柵格圖,因此先用腐蝕膨脹的影象處理方法得到所有障礙物邊緣路徑,然後再做邊界跟蹤,就得到環繞路徑了。
最後合成直線路徑和環繞路徑,即可得到最終結果。
matlab程式如下:
clear all;結果如下:close all;
clc;
path=;
se = strel('
cube
',3);
map = imread('
bg.bmp');
edge = map -imerode(map,se);
flag=zeros(size(edge));
imshow(map);
hold on;
p=ginput(); %選取起始與結束位置
plot(p(:,
1),p(:,2),'ro'
)startp = p(1
,:);
endp = p(2
,:);
curp =startp;
keyp =;
d = norm(endp-startp);
direct = atan2(endp(1)-startp(1),endp(2)-startp(2
));sin_dir =sin(direct);
cos_dir =cos(direct);
for r=0:d %生成起始到終點的直線路徑
p = floor(startp + r*[sin_dir cos_dir]);
if map(p(2),p(1))==255
curp=[curp;p];
endif edge(p(2),p(1))==255 && map(p(2),p(1))==255
if isempty(keyp)==1
keyp =[keyp;p];
endif norm(p-keyp(end,:))<2
keyp(
end,:) =p;
else
keyp =[keyp;p];
endend
endnear=[-1 -1;-1
0; -11;
01;0 -1
;
11;1
0;1 -1
];if isempty(keyp)~=1 %生成環繞障礙物的路徑
pcpcell = cell(length(keyp)/2,1
);
for i=1:2
:length(keyp)
aroundp =keyp(i,:);
endp = keyp(i+1
,:);
flag(aroundp(
2),aroundp(1)) = 1
;
while norm(aroundp(end,:)-endp)>1
tmp = aroundp(end,:)+near;
for j=1:8
if edge(tmp(j,2),tmp(j,1))==255 && flag(tmp(j,2),tmp(j,1))==0
aroundp =[aroundp;tmp(j,:)];
flag(tmp(j,
2),tmp(j,1)) = 1
;
break
;
endend
endpcpcell =aroundp;
endj=1; %對兩類路徑進行合併
for i=1
:length(curp)
if j<=length(pcpcell)
if curp(i,:) == keyp(j*2-1
,:) path=[path;pcpcell];
j = j+1
;
else
path=[path;curp(i,:)];
endelse
path=[path;curp(i,:)];
endend
else
path =curp;
endplot(path(:,
1),path(:,2),'
g.');
計算路徑:
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裡面,...
發現live555中乙個小bug 2
在 發現live555中乙個小bug 一文中所修改的 並不起作用。經測試,rtpsource的socket檢測不到網路出錯的情況。而rtcpinstance中的socket可以檢測到,所以可以利用rtcpinstance通知rtpsource應停止流傳輸了。修改如下 包含的 為修改處 注意,fsou...