matlab練習程式(Bug2演算法)

2022-06-08 17:09:12 字數 2569 閱讀 9599

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...