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