一、简介

路径规划是实现移动机器人自主导航的关键技术,是指在有障碍物的环境中,按照一定的评价标准(如距离、时间、能耗等),寻找到一条从起始点到目标点的无碰撞路径,这里选取最短距离路径规划的评价标准,即最短路径规划问题。

1.路径规划数学模型的建立
将移动机器人周围环境用一组数据进行抽象表达,建立二维或三维的环境模型,得到移动机器人能够理解分析的环境数据,是机器人路径规划的基本前提。我这里用的是栅格法,其原理是将周围环境看成一个二维平面,将平面分成一个个等面积大小的具有二值信息的栅格,每个栅格中存储着周围环境信息量,下图我给出了一个栅格法地图,方便大家更好的理解栅格地图。这里设计的栅格地图为一个20×20的地形矩阵,黑色的地方表示有障碍,白色的地方表示没有障碍。

图1 栅格法地图
在用栅格法建立环境模型时,为了将环境信息转换成移动机器人可以识别的数据,一般采用序号法标记环境地图信息,即将栅格地图中一个个栅格从序号1依次累加直到标记到最后一个栅格。如图2所示。


图3 八叉树搜索策略
那么,怎么判断一个栅格点是否为另一个栅格点的相邻栅格点呢,另外,又怎么判断是否为有障碍栅格呢。这就需建立矩阵D,记录每个栅格点至其相邻栅格点的代价值。本例中栅格地图有20×20个栅格点,则D的大小为400×400,其中列是起点栅格,行是局部终点栅格,各栅格点至其各相邻无障碍栅格点的代价值非零,而有障碍栅格及非相邻栅格设为0。

二、部分源代码

clc
clear
close all
tic
%% 地图
G=[0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0; 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;0 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0; 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0; 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0; 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0; 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0; 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0; 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0; 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0;];
for i=1:20/2for j=1:20m=G(i,j);n=G(21-i,j);G(i,j)=n;G(21-i,j)=m;end
end
%%
S = [1 1];
E = [20 20];
G0 = G;
G = G0(S(1):E(1),S(2):E(2));
[Xmax,dimensions] = size(G);
dimensions = dimensions - 2;             %% 参数设置
max_gen = 200;    % 最大迭代次数
num_polution = 50;         % 种群数量
soft_value = 0.8;        %安全值
recover_Percent = 0.3;  %%发现者比例
scout_Percent = 0.2;  %%侦查者比例
recover_Num = round( num_polution * recover_Percent );    % %发现者
scout_Num = round(num_polution * scout_Percent);      %%侦查者数量
X_min = 1;  %% 初始化
X = zeros(num_polution,dimensions);
for i = 1:num_polutionfor j = 1:dimensionscolumn = G(:,j+1);      % 地图的一列id = find(column == 0); % 该列自由栅格的位置X(i,j) =  id(randi(length(id))); % 随机选择一个自由栅格id = [];end fit( i ) = fitness(X( i, : ),G);%%%行向量
end
fit_person_best = fit;   % 个体最优适应度
person_best = X;      % 个体最优位置
[fit_global_best, best_person_Index] = min( fit );        % 全局最优适应度
global_best = X(best_person_Index, : );    % 全局最优位置
[fit_max,B]=max(fit);
worse_person= X(B,:);
%%
for gene = 1:max_gengene[ans1,sort_Index] = sort(fit);   %适应值度从小到大排序[fit_max,B] = max(fit);worse_person = X(B,:);           %找出适应度最差的个体[~,Index] = sort(fit_person_best);r2 = rand(1);if r2 < soft_value%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for i = 1:recover_Num                                                  r1 = rand(1);  X(Index(i),:) = person_best(Index(i),:)*exp(-(i)/(r1*max_gen));         %%%%%发现者广泛进行搜索操作X(Index(i),:) = Bounds(X(Index(i),:), X_min,Xmax);                      %%%%输出整数路径fit(Index(i)) = fitness(X(Index(i),:),G);endelseX(Index(i),:) = person_best(Index(i),:) + randn(1)*ones(1,dimensions);  %%%%%%%飞往其他地方觅食X(Index(i),:) = Bounds(X(Index(i),:),X_min,Xmax);    fit(Index(i)) = fitness(X(Index(i),:),G);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%发现者%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[fit_MMin,best_best] = min(fit);      best_best_bt = X(best_best,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for i = (recover_Num+1):num_polution                   A = floor(rand(1,dimensions)*2)*2-1;                %%%%%%%%-1到1的随机数if(i>(num_polution/2))X(Index(i),:) = randn(1)*exp((worse_person-person_best(Index(i),:))/(i)^2);%%%%%%%适应度较低的个体没有获得食物,将飞往其他地方随机范围elseX(Index(i),:) = best_best_bt+(abs((person_best(Index(i),:)-best_best_bt)))*(A'*(A*A')^(-1))*ones(1,dimensions); %%%%%%%中等适应度值的个体更新位置endX(Index(i),:) = Bounds(X(Index(i),:),X_min,Xmax);fit(Index(i)) = fitness(X(Index(i),:),G);endp_1 = randperm(numel(sort_Index));p_2 = sort_Index(p_1(1:scout_Num));for j = 1:length(p_2)     if(fit_person_best(Index(p_2(j)))>(fit_global_best))X(Index(p_2(j)),:) = global_best+(randn(1,dimensions)).*(abs((person_best(Index( p_2(j)),:) -global_best)));%%%%%%%%意识到危险的麻雀向种群适应度最高的个体靠拢elseX(Index(p_2(j)),:) = person_best(Index(p_2(j)),:)+(2*rand(1)-1)*(person_best(Index(p_2(j)),:)-worse_person)/( fit_person_best(Index(p_2(j)))-fit_max+1e-50);endX(Index(j),:) = Bounds(X(Index(j),:), X_min, Xmax);fit(Index(j)) = fitness(X(Index(j),:),G);endfor i=1:num_polutionX(i,:) = Bounds(X(i,:),X_min,Xmax);end% 更新个体最优值和全局最优值for i = 1:num_polutionendif(fit_person_best(i) < fit_global_best)fit_global_best = fit_person_best(i);global_best = person_best(i,:);endendglobal_best = LocalSearch(global_best,Xmax,G);%%%%%把全局最优解进行局部搜索,提高全局最优解适应度值fit_global_best = fitness(global_best,G);final_goal(gene,1)=fit_global_best;
end
function fx = fitness(x,G)S = [1 1];       % 新地图的起点E = size(G);     % 新地图的终点route = [S(1) x E(1)];dim = length(route);nB = 0;        % 粒子路径是否经过障碍的数目route=round(route);for j = 2 : dim-1if G(route(j),j) == 1nB = nB + 1;endendif nB == 0     % path=generateContinuousRoute(route,G); % 中点邻域搜索
%         path=shortenRoute(path);path=GenerateSmoothPath(path,G);path=GenerateSmoothPath(path,G);fx = 0;for i = 1:size(path,1)-1fx = fx + sqrt((path(i+1,1)-path(i,1))^2 + (path(i+1,2)-path(i,2))^2);endelsefx = E(1)*E(2) * nB;end

三、运行结果


四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【路径规划】基于matlab麻雀算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1582期】相关推荐

  1. 【Matlab路径规划】蚁群算法求解机器人栅格地图最短路径规划问题【含源码 1580期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]蚁群算法求解机器人栅格地图最短路径规划问题[含源码 1580期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

  2. 【路径规划】基于蚁群算法求解机器人栅格地图路径规划matlab代码

    1 简介 通过栅格法建立栅格地图作为机器人路径规划的工作环境,采用蚁群算法作为机器人路径搜索的规则.将所有机器人放置于初始位置.经过NC次无碰撞迭代运动找到最优路径.到达目标位置.为防止机器人在路径搜 ...

  3. 【机器人栅格地图】基于蚁群优化遗传算法求解机器人栅格地图最短路径规划问题附Matlab源码

    1 简介 通过栅格法建立栅格地图作为机器人路径规划的工作环境,采用蚁群算法结合遗传算法作为机器人路径搜索的规则.将所有机器人放置于初始位置,经过NC次无碰撞迭代运动找到最优路径,到达目标位置.为防止机 ...

  4. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  5. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  6. 【Matlab树叶分类】BP神经网络植物叶片分类【含GUI源码 916期】

    一.代码运行视频(哔哩哔哩) [Matlab树叶分类]BP神经网络植物叶片分类[含GUI源码 916期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  7. 【Matlab水果蔬菜识别】形态学水果蔬菜识别【含GUI源码 919期】

    一.代码运行视频(哔哩哔哩) [Matlab水果蔬菜识别]形态学水果蔬菜识别[含GUI源码 919期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅. ...

  8. 【Matlab青草识别】形态学马唐草+牛筋草识别【含GUI源码 908期】

    一.代码运行视频(哔哩哔哩) [Matlab青草识别]形态学马唐草+牛筋草识别[含GUI源码 908期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  9. 【Matlab限速标志识别】形态学限速标志识别【含GUI源码 1142期】

    一.代码运行视频(哔哩哔哩) [Matlab限速标志识别]形态学限速标志识别[含GUI源码 1142期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  10. 【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 119期】

    ⛄一.简介 路径规划是实现移动机器人自主导航的关键技术,是指在有障碍物的环境中,按照一定的评价标准(如距离.时间.能耗等),寻找到一条从起始点到目标点的无碰撞路径,这里选取最短距离路径规划的评价标准, ...

最新文章

  1. Boost:文字差异的测试程序
  2. swoole安装基本配置
  3. php system 返回值127,php system 返回值 1
  4. 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单
  5. [android视频教程] 传智播客android开发视频教程
  6. 码农小汪-Java Condition
  7. Excel-散点图(相关性及数据分布)分析
  8. 网易面试总结——面试案例9~面试案例12
  9. Netty8# Netty之ByteBuf初探
  10. ArcGIS面矢量挖洞
  11. 敏捷项目中的进度控制
  12. R语言中的cor和cov
  13. 如何运营出一个有吸引力的微信公众号?
  14. 利用 Python + Selenium 自动化快速截图
  15. 老九学堂 学习 C++ 第七、八天
  16. 意甲-因扎吉帽子戏法卡卡传射 AC米兰5-1追平尤文
  17. 光耦p621引脚图_常见光电耦合器(光耦)的内部结构及引脚图
  18. 艾兰岛逻辑-触发区域
  19. The Devil Wears Prada-3
  20. 椭圆的周长与面积_来自一张老外的作业纸

热门文章

  1. MySQL-快速入门(9)视图
  2. Git-第四篇廖雪峰Git教程学习笔记(3)远程仓库,克隆远端库
  3. http客户端-性能比较系列-第二篇-多线程
  4. python基础和软件测试
  5. IO库----IO类,文件输入输出,string流
  6. for循环中的setTimeout()
  7. [php] 表单注意事项
  8. Java基础增强:集合的嵌套案例
  9. Python实战之路-day6
  10. 国家自然科学基金申请书写作攻略