一、简介

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

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

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


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

2.机器人最短路径规划的实现步骤
蚁周模型实现机器人最短路径规划的流程图

为了方便大家更好地理解蚁群算法的原理及实现过程,其流程图如图4所示。(流程图较长,我截图了两段。)


图4 基于蚁群算法的机器人最小路径规划流程图
图中公式(3)(4)的具体表达在下边的具体步骤里。

蚁周模型实现机器人最短路径规划的具体步骤

**步骤1:**给出栅格地图的地形矩阵;初始化信息素矩阵 Tau(记录每个栅格至其他栅格的信息素量),最大迭代次数K,蚂蚁个数M,表征信息素重要程度的参数 、表征启发式信息重要程度的参数 ,信息素蒸发系数 ,信息素增加强度系数Q及启发式信息矩阵
**步骤2:**构建启发式信息矩阵。按式(1)和式(2)计算每个栅格至目标点的距离,启发式信息素取为至目标点距离的倒数,距离越短,启发式因子越大,障碍物处的启发式信息为0。建立矩阵D,用以存储每个栅格点至各自相邻无障碍栅格点的代价值。
**步骤3:**对于每一只蚂蚁,初始化蚂蚁爬行的路径及路径长度,将禁忌列表全部初始化为1;蚂蚁从起始点出发开始搜索路径,找出当前栅格点的所有无障碍相邻栅格点(即矩阵D中相应元素不为0的栅格点),再根据禁忌列表筛选出当前可选择的栅格点。
**步骤4:**如果起始点是目标点,且可选栅格点个数大于等于1,则根据式(3)计算蚂蚁从当前栅格点转移到各相邻栅格点的概率,

二、部分源代码

% clear;clc
% 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;];%地图矩阵
n=size(G,1);%n表示地图大小
m=50;    %% m 蚂蚁个数
Alpha=2;  %% Alpha 表征信息素重要程度的参数
Beta=6;  %% Beta 表征启发式因子重要程度的参数
Rho=0.1; %% Rho 信息素蒸发系数
NC_max=200; %%最大迭代次数
Q=1;         %%信息素增加强度系数
Tau=ones(n,n);     %Tau为信息素矩阵
NC=1;               %迭代计数器,记录迭代次数
r_e=1;  c_e=20;%地图终点在矩阵中的位置%可以通过position2rc函数产生
s=n;%路径起始点在矩阵中的位置
position_e=n*(n-1)+1;%路径终点在矩阵中的位置
min_PL_NC_ant=inf;%%蚂蚁最短的行进距离
min_ant=0;%%最短行进距离的蚂蚁坐标
min_NC=0;%%最短行进距离的迭代次数
% 计算邻接矩阵及启发因子%%邻接矩阵作用是计算启发因子
z=1;
for i=1:nfor j=1:nif G(i,j)==0 D(i,j)=((i-r_e)^2+(j-c_e)^2)^0.5;elseD(i,j)=inf;      %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示endend
end
D(r_e,c_e)=0.05;
Eta=1./D;          %Eta为启发因子,这里设为到终点距离的倒数
Tau=10.*Eta;%%%%%创新点%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%计算移动矩阵D_move=zeros(n*n,8);%%D_move每一行代表与行标对应元素,可以前往的下一个节点的位置for point=1:n*nif G(point)==0[r,c]=position2rc(point);move=1;for k=1:nfor m1=1:nim=abs(r-k);jn=abs(c-m1); if im+jn==1||(im==1&&jn==1) if G(k,m1)==0D_move(point,move)=(m1-1)*n+k;move=move+1;endendendendend end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%移动矩阵和邻接矩阵计算完成,检查无误%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%开始迭代
routes=cell(NC_max,m);%%%%存储每次迭代每个蚂蚁的路径
PL=zeros(NC_max,m); %%%%%存储每次迭代每个蚂蚁的路径长度
while NC<=NC_maxNCfor ant=1:mcurrent_position=s;%%%当前位置为起始点path=s;%%路径初始化PL_NC_ant=0;%%长度初始化Tabu=ones(1,n*n);   %%%%禁忌表,排除已经走过的位置Tabu(s)=0;%%排除已经走过的初始点D_D=D_move;%%%%D_D是D_move的中间矩阵,作用是为了不让D_move参与计算,也可不用D_D矩阵,直接用D_moveD_work=D_D(current_position,:);%%%把当前点可以前往的写一个节点的信息传送给D_worknonzeros_D_work=find(D_work);%%%找到不为0的元素的位置for i1=1:length(nonzeros_D_work)if Tabu(D_work(i1))==0D_work(nonzeros_D_work(i1))=[];%%将禁忌表中已走过的元素删除,防止走已经走过的位置D_work=[D_work,zeros(1,8-length(D_work))];%%%保证D_work向量长度为8(每个点最多能往周围的8个点走),为后面for循环做准备endend
%%%%%%%%%%%%%%%%%%%%%%%%%%%%排除走过的第一点(排除起点)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%len_D_work=length(find(D_work));while current_position~=position_e&&len_D_work>=1%%当前点是否为终点或者走进死胡同p=zeros(1,len_D_work);for j1=1:len_D_work[r1,c1]=position2rc(D_work(j1));%%利用自己编的函数把可以前进的点计算为行列表示p(j1)=(Tau(r1,c1)^Alpha)*(Eta(r1,c1)^Beta);%%%%计算每个可以前往的节点的概率endp=p/sum(p);%%%归一化pcum=cumsum(p);%%%概率累加select=find(pcum>=rand);%%%%轮盘赌法选择下个节点to_visit=D_work(select(1));%%%前往下一个节点
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%到达下一个节点%%%%%%%%%%%%%%%%%%%%%%%%path=[path,to_visit];%%%路径累加dis=distance(current_position,to_visit);%%%计算到下个节点的距离PL_NC_ant=PL_NC_ant+dis;%%距离累加current_position=to_visit;%%%当前点设为前往点D_work=D_D(current_position,:);%%%%把当前节点可以前往的下一个节点的信息传给D_workTabu(current_position)=0;%%%禁忌表中排除已经到的点for kk=1:400if Tabu(kk)==0for i3=1:8if D_work(i3)==kkD_work(i3)=[];%%%%排除禁忌表中已经走过的节点D_work=[D_work,zeros(1,8-length(D_work))];%%保证长度为8endendendendlen_D_work=length(find(D_work));%%%计算当前点可以前往的下一个节点的数量end

三、运行结果


四、matlab版本及参考文献

1 matlab版本
2014a

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

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

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

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

  2. 【路径规划】基于matlab蚁群优化遗传算法机器人栅格地图最短路径规划【含Matlab源码 1581期】

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

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

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

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

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

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

    ⛄一.蚁群算法及栅格地图简介 1 蚁群算法 1.1 蚁群算法的提出 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来寻找优化路径的机率型算法.它由Marc ...

  6. 【ACO TSP】基于matlab蚁群算法求解31城市旅行商问题【含Matlab源码 1147期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab蚁群算法求解31城市旅行商问题[含Matlab源码 1147期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  7. 【Matlab指纹识别】指纹识别匹配门禁系统【含GUI源码 587期】

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

  8. 【TWVRP】基于matlab蚁群算法求解带时间窗车辆路径规划问题【含Matlab源码 1930期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  9. 【无人机】基于matlab蚁群算法求解含危险源的无人机路径规划【含Matlab源码 2059期】

    一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下 ...

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

    ⛄一.蚁群算法简介 1 引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法.其中, 模拟蚁群觅食过程的蚁群优化算 ...

最新文章

  1. java/android 做题中整理的碎片小贴士(5)
  2. HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)
  3. python __reduce__魔法方法_Python魔法方法指南
  4. 华为S5700交换机开启telnet远程登陆配置(推荐)
  5. h5 input 阴影_html5中input表单加边框,阴影效果
  6. 火山视窗调用易语言DLL实现返回文本
  7. 计算机进管理提示找不到入口,如何解决Win10提示找不到入口点dllregisterserver
  8. java 打包加密_java打包、加密、发布(源代码保护)
  9. 运维技术相关基础面试
  10. jquery-seat-charts 使用-自定义座位号 及 重新加载数据
  11. 在 X11 中实现 GTK+ 3 的 OpenGL 支持
  12. PHP Screw php代码解密,运用php screw进行源代码加密
  13. [CTSC2010]珠宝商
  14. 神州优车开源业界领先的增量数据同步中间件——DataLink
  15. 突破Flutter私有化仓库100M限制-Hosted packages must be smaller than 100 MB
  16. 亚马逊16条领导力原则
  17. Qt编写安防视频监控系统11-动态换肤
  18. 计算机教师面试专业技能部分,教师招聘专业技能测试
  19. matlab 降低计算精度,MATLAB 计算精度控制
  20. vs中readfile的作用_VC 中 ReadFile 和 WriteFile 函数读写串口超时机制

热门文章

  1. Java-集合第二篇Set集合
  2. jieba库初识与运用
  3. WebStorm中常用的快捷键及使用技巧
  4. 8.2 GOF设计模式一: 单实例模式 SingleTon
  5. P2986 [USACO10MAR]伟大的奶牛聚集(思维,dp)
  6. xshell使用隧道
  7. 构建手机apk的过程
  8. jsp之jsp内置对象
  9. pd 生成mysql数据库sql时加上备注
  10. 2021-07-13 CNN池化理解学习