【路徑規劃】基于人工蜂群和進化算法的移動機器人路徑規劃附matlab代碼

1 簡介

研究機器人路徑規劃優化問題,機器人工作環境復雜,運動路徑上存在許多障礙物.針對提高機器人安全導航性能問題,傳統群智能算法存在早熟,搜索效率低等難題,難以獲得全局最優路徑.為了獲得最優機器人運動路徑,避免碰撞的發生,提出了一種人工蜂群算法的機器人路徑規劃方法.首先采用柵格法對機器人工作環境進行建模,然后機器人路徑規劃目標點作為蜜源,最后蜂群之間信息交換,協作搜索最優機器人運動路徑.結果表明,人工蜂群算法解決了傳統群智能算法存在的難題;加快了機器人路徑規劃求解速度,以較短時間找到最短機器人運動路徑.

2 部分代碼

%

function varargout = robotpath(varargin)

gui_Singleton = 1;

gui_State = struct('gui_Name',? ? ? ?mfilename, ...

? ? ? ? ? ? ? ? ? ?'gui_Singleton',? gui_Singleton, ...

? ? ? ? ? ? ? ? ? ?'gui_OpeningFcn', @robotpath_OpeningFcn, ...

? ? ? ? ? ? ? ? ? ?'gui_OutputFcn',? @robotpath_OutputFcn, ...

? ? ? ? ? ? ? ? ? ?'gui_LayoutFcn',? [] , ...

? ? ? ? ? ? ? ? ? ?'gui_Callback',? ?[]);

if nargin && ischar(varargin{1})

? ? gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

? ? [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

? ? gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before fpp is made visible.

function robotpath_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.

function varargout = robotpath_OutputFcn(hObject, eventdata, handles)?

% varargout? cell array for returning output args (see VARARGOUT);

% hObject? ? handle to figure

% eventdata? reserved - to be defined in a future version of MATLAB

% handles? ? structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure

varargout{1} = handles.output;

%% Initialize map

function pushbutton1_Callback(hObject, eventdata, handles)

cla reset

% current_pos is a robot path including starting point, in which

% current_pos(:,1) represents the start position

current_pos= [-1;-1];

setappdata(0,'current_pos',current_pos);

% target is a robot goal position

target = [-1 ;-1];

setappdata(0,'target',target);

% map is a collection of obstacle in 2d?

% each row of the map defines an obstacle

% first column is a x position of obstacle

% second column is a y position of obstacle

% third column defines the length of the obstacle in x axis

% fourth column defines the length of the obstacle in y axis

map=[];

setappdata(0,'map',map);

axes(handles.axes2) % Select the proper axes

axis([-5,100,-5,100])

set(handles.axes2,'XMinorTick','on')

%% Insert obstacles

function pushbutton2_Callback(hObject, eventdata, handles)

%% Initialize Axes

axes(handles.axes2) % Select the proper axes

set(handles.axes2,'XMinorTick','on')

axis([1 100 1 100]);

? ? %%

? ? hold on

? ? h=msgbox('Draw a wall by using the left mouse button for start and right mouse button for ending the wall');

? ? ?uiwait(h,5);

? ? ?if ishandle(h)==1

? ? ? ? ?delete(h);

? ? ?end


? ? but=0;

? ? %but=1 left? ? ?but=3 right

? ? while((but~=1)&&(but~=3))

? ? ? ? [xs,ys,but]=ginput(1);

? ? end

%%

xs=round(xs);

ys=round(ys);

? ? if(xs <10)

? ? ? ? xs = xs-10;

? ? end

? ? if(ys < 10)

? ? ? ? ys = ys -10;

? ? end

width = 10;

height = 45;

map = getappdata(0,'map');

axes(handles.axes2) % Select the proper axes

%% Draw obstacle

? ? if(but == 1)

? ? rectangle('Position',[xs,ys,width,height],'FaceColor',[0 0 0])

? ? [m,n] = size(map);

? ? map(m+1,:) = [xs ys width height];

? ? setappdata(0,'map',map);

? ? else

? ? ?rectangle('Position',[xs,ys,height,width],'FaceColor',[0 0 0])??

? ? ?[m,n] = size(map);

? ? map(m+1,:) = [xs ys height width];

? ? setappdata(0,'map',map);

? ? end


set(handles.axes2,'XMinorTick','on')

map = getappdata(0,'map');

% Draw target

function pushbutton3_Callback(hObject, eventdata, handles)

but=0;

while(but~=1)

? ? [xval,yval,but]=ginput(1);

end

pos=[xval,yval];

setappdata(0,'target',pos);

axes(handles.axes2)?

hold on

post = [xval yval 4 4];

rectangle('Position',post,'FaceColor','r','Curvature',[1 1])

hold off

%% Start robot path finding procedure

function pushbutton4_Callback(hObject, eventdata, handles)

map = getappdata(0,'map');

target = getappdata(0,'target');

current_pos = getappdata(0,'current_pos');

if(target == [-1 -1])? ??

? ? msgbox('Please select the target position first');


elseif(current_pos(:,1) == [-1 ;-1])? ? ?


? ? ?msgbox('Please select the start position first');

else



? ? %% Find Coolision free path using Artificial Bee Colony Algorithm

? ? ?Vxy? = Create_Food_Points(map, target, 500,5,95 );

? ? ? ? ? ? ? ? hold on

? ? ? ? plot(Vxy(:,1),Vxy(:,2), 'go')??

? ? ? ? pause(1)

? ? ? ? refresh?

? ?abc_plot_handle = [];? ? ?

? ?for i = 1:50?

? ? ? ? [m n] = size(current_pos);

? ? ? ? [cost pos] = artificial_bee_colony(map, Vxy);? ? ? ? ? ??

? ? ? ? current_pos(:,n+1) = pos.Position';

? ? ? ? setappdata(0,'current_pos',current_pos);

? ? ? ? ?hold on


? ? ? ?abc_plot_handle(i) = plot(current_pos(1,:),current_pos(2,:),'--rs','LineWidth',2,...

? ? ? ? ? ? ? ? 'MarkerEdgeColor','k',...

? ? ? ? ? ? ? ? 'MarkerFaceColor','g',...

? ? ? ? ? ? ? ? 'MarkerSize',10)

? ? ? ? ? ? ? ? ? ? pause(2)


? ? ? ? if ((cost < 5))

? ? ? ? ? ? [M N] =size(map)

? ? ? ? ? ? collide = 0;

? ? ? ? ? ? ? ?for i=1:M


? ? ? ? ? ? ? ? ?collide = is_collide( map(i,:), current_pos(:,n+1), target');

? ? ? ? ? ? ? ? ?if collide == 1

? ? ? ? ? ? ? ? ? ? ?break;

? ? ? ? ? ? ? ? ?end

? ? ? ? ? ? ? ?end

? ? ? ? ? ? ? ?if(collide == 0)

? ? ? ? ? ? ? ? ?break;

? ? ? ? ? ? ? ?end

? ? ? ? end

? ?end



? ?[m n] = size(current_pos);

? ?post = [current_pos(n) current_pos(n) 4 4];

? ?hold on

? ?plot(current_pos(1,:),current_pos(2,:),'*')??


? ? ? ? %% Optimize path usin EP algorithm

? ? ? ? for i = 1:20


? ? ? ? ? ? current_pos = ep_algorithm( map, current_pos );

? ? ? ? end

? ? ? ? delete(abc_plot_handle);

? ? ? ? ? ? ? ? ? ? ? ? plot(current_pos(1,:),current_pos(2,:),'--rs','LineWidth',2,...

? ? ? ? ? ? ? ? ? ? ? ? 'MarkerEdgeColor','k',...

? ? ? ? ? ? ? ? ? ? ? ? 'MarkerFaceColor','g',...

? ? ? ? ? ? ? ? ? ? ? ? 'MarkerSize',10)

? ? ? ? ? ? ? ? ? ? ? ? ? ? pause(2)




end

% --- Executes on button press in pushbutton5.

function pushbutton5_Callback(hObject, eventdata, handles)

%% Draw starting point

function pushbutton9_Callback(hObject, eventdata, handles)

but=0;

while(but~=1)

? ? [xval,yval,but]=ginput(1);

end

current_pos=[xval;yval];

setappdata(0,'current_pos',current_pos);

axes(handles.axes2)?

hold on

post = [xval yval 4 4];

rectangle('Position',post,'FaceColor',[0 0.5 0.3],'Curvature',[1 1])

hold off

3 仿真結果

4 參考文獻

[1]黎竹娟. "人工蜂群算法在移動機器人路徑規劃中的應用." 計算機仿真 29.12(2012):4.

博主簡介:擅長智能優化算法、神經網絡預測、信號處理、元胞自動機、圖像處理、路徑規劃、無人機等多種領域的Matlab仿真,相關matlab代碼問題可私信交流。

部分理論引用網絡文獻,若有侵權聯系博主刪除。完整代碼獲取關注微信公眾號天天matlab

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容