在使用栅格法进行移动机器人路径规划时,需要将机器人工作的环境地图—栅格矩阵,转换成邻接矩阵,这里介绍一下栅格地图转换成邻接矩阵的具体函数方法。

在栅格地图中,每一个栅格相当于一个节点;而在一条路径中,各个栅格是相邻的或者是对角的。比如一个4*4栅格,如下

对于其中一条路径1-2-7-11-16,它的每一个节点对应的栅格是相邻的或者是对角的。
也就是说这里的路径不可能是1-3或2-11或1-16这种不是相邻也不是对角。

如果此时在这样的栅格地图中加上障碍物,对于有障碍物的地图,障碍栅格和任何栅格都不相邻。如下图,假设7和10号栅格是障碍,认为6和7是不相邻的,6和10不相邻等。

此时定义一个邻接矩阵D,邻接矩阵D就是每个栅格之间的距离。对于上述4x4矩阵,有16个栅格,那么每一个栅格到其他所有(15个)栅格,就得到15个距离。且一般算上自己到自己的距离。这样每个栅格到其他栅格的距离就有16个,于是便构成16*16的矩阵。

对于上述障碍栅格地图,邻接矩阵D是16*16的矩阵,为了更好的理解,在此用可行性来代替距离,即0表示两个栅格不相邻不对角,即不可行,1表示两个栅格相邻或对角,即可行,且规定自己到自己的为不可行。这个和距离正好成倒数关系,即0表示距离为无穷大,1表示单位距离(对角距离根号2,这里近似为单位1),如D的第一行表示栅格1到其他各栅格的可行性如下:

栅格6到其他栅格的可行性如下:

其中7和10与栅格6不可行是以为7和10是障碍栅格,其他不可行是因为二者不相邻。
用上面方法可以分别得到栅格1~栅格16到其他栅格的可行性,得到16*16的邻接矩阵。

其中需要注意:寻找栅格地图的直角坐标表示法和序号表示法的映射关系。
如果是下面这样的映射方法:

上述两种标识方法的映射关系见式:

具体的映射方式根据自己的选择设计!

下面展示两种方法使用Matlab代码将栅格地图转换成邻接矩阵

方式一:

%% 栅格地图G转换成邻接矩阵D,G2D函数
% 在D矩阵中元素行下标第一个节点在栅格G中的位置,列下标代表第二个节点在栅格G中的位置,
% 若这两个节点在栅格地图中是自由栅格且是相邻或者对角的,则两点的距离则为邻接矩阵D的元素值,否则D的元素值为0
% 通过对栅格矩阵G的两次搜索遍历,寻找两个相邻或对角的自由栅格,计算它们之间的距离
function D=G2D(G)
h=size(G,1);
D=zeros(h*h,h*h);
%用i表示矩阵G的行下标,j表示矩阵G的列下标。这是外层嵌套循环,表示第一个自由栅格
%用m表示矩阵G的行下标,n表示矩阵G的列下标。这是内层嵌套循环,表示第二个自由栅格
for i=1:h      %外层嵌套,遍历矩阵Gfor j=1:hif G(i,j)==0    %判断是否是自由栅格,确定第一个自由栅格for m=1:h       %内层嵌套,遍历矩阵Gfor n=1:hif G(m,n)==0        %判断是否是自由栅格,确定第二个自由栅格%分别计算这两个自由栅格在栅格地图中x方向距离和y方向距离im=abs(i-m);jn=abs(j-n);if im+jn==1||(im==1&&jn==1)%用矩阵D中的部分元素存储栅格地图中两相邻或对角自由栅格在矩阵G中的位置和距离,其他元素值为0%矩阵D的下标分别表示两个自由栅格在矩阵G中的位置,D中元素的值表示两个自由栅格的距离D((i-1)*h+j,(m-1)*h+n)=(im+jn)^0.5;endendendendendend
end
end

方法二:

%% 栅格地图G转换成邻接矩阵D,G2D函数
function D=SecondG2D(G)   %邻接矩阵就是每个栅格之间的距离
[m,n]=size(G);  %返回矩阵G的尺寸并将行返回到m中,列返回到n中
N=m*n;  %元素个数
D=zeros(N,N);   %生成一个N*N的0矩阵
for Dx=1:Nfor Dy=Dx:N   x1=ceil(Dx/n);  %ceil向上取整,返回不小于x的最小整数值y1=mod(Dx,n);   %mod取余,Dx对n取余if y1==0y1=n;end      x2=ceil(Dy/n);y2=mod(Dy,n);if y2==0y2=n;end      if Dx==DyD(Dx,Dy)=inf;elseif (G(x1,y1)==1) || (G(x2,y2)==1);D(Dx,Dy)=inf;elseif (mod(Dx,n) ==1)if(Dx==1)if (Dy-Dx==1) || (Dy-Dx==n)D(Dx,Dy)=1;elseif (Dy-Dx==n+1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endelseif(Dx==N-n+1)if (Dy-Dx==1) || (Dx-Dy==n)D(Dx,Dy)=1;elseif (Dx-Dy==n-1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endelseif (Dy-Dx==1) || (Dy-Dx==n) || (Dx-Dy==n)D(Dx,Dy)=1;elseif (Dx-Dy==n-1) || (Dy-Dx==n+1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endendelseif mod(Dx,n) ==0if(Dx==n)if (Dx-Dy==1) || (Dy-Dx==n)D(Dx,Dy)=1;elseif (Dy-Dx==n-1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endelseif(Dx==N)if (Dx-Dy==1) || (Dy-Dx==n)D(Dx,Dy)=1;elseif (Dy-Dx==n+1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endelseif (Dx-Dy==1) || (Dy-Dx==n) || (Dx-Dy==n)D(Dx,Dy)=1;elseif (Dy-Dx==n-1) || (Dx-Dy==n+1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endendelseif (Dx-Dy==1) || (Dy-Dx==1) || (Dy-Dx==n) || (Dx-Dy==n)D(Dx,Dy)=1;elseif (Dx-Dy==n+1) || (Dy-Dx==n+1) || (Dy-Dx==n-1) || (Dx-Dy==n-1)D(Dx,Dy)=sqrt(2);elseD(Dx,Dy)=inf;endendendend
endfor i=1:Nfor j=i:Nif(i~=j)D(j,i)=D(i,j);endend
end

链接:
http://blog.sina.com.cn/s/blog_15e199e600102xvow.html
http://www.omegaxyz.com/2019/01/28/aco_routes2/
https://blog.csdn.net/KantsWang/article/details/83651954

栅格矩阵转换成邻接矩阵G2D函数相关推荐

  1. zxing二维码位矩阵转换成Bitmap位图

    关于zxing ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码. 该项目可 ...

  2. Opencv学习之:如何将矩阵转换成图片,如何将图片转换成矩阵

    文章目录 图片转化成矩阵 方法一: 方法二: 矩阵转换成图片 错误代码段 正确代码段 图片转化成矩阵 方法一: 使用 PIL 的方法 + img.getdata() 提取数据 + np.array() ...

  3. php 转为文本,php html转换成text文本函数

    php html转换成text文本函数 文章为各位提供一个哦,如果喜欢就行了. if(!defined('DEDEINC')) { exit("Request Error!"); ...

  4. 小写金额转换成大写金额的函数

    编写一个收费软件时要用到一个小写金额转换成大写金额的函数,我曾在网上找到一个用Powerbuilder写的函数,长达四五十行之巨,后来我自己用DELPHI写了一个函数,寥寥几行代码就搞定: funct ...

  5. C语言:将邻接表转换成邻接矩阵算法

    题目 设计一个将邻接表转换成邻接矩阵的算法. 分析 初始时将邻接矩阵 g 中所有对应的元素值设置为 0,扫描邻接表 G 的所有单链表,通过第 i 个单链表查找顶点 i 的相邻结点 p,通过邻接矩阵 g ...

  6. C语言中把小写字符串转换成大写用函数,一个容易的将小写字符串转换成大写的函数...

    一个简单的将小写字符串转换成大写的函数 我用的是VC++6.0,恳请大家帮忙看看到底哪里出错了. #include void uppers(char *Dest,char *Sour) { while ...

  7. 转换8421码的程序c语言,16进制数转换成8421BCD编码函数

    .INCLUDE hardware.inc .IRAM _Led_Out: .dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 _L ...

  8. 4*4矩阵转换成二维平面坐标

    一.需求:基于苹果数据4*4矩阵数据,转换成二维平面坐标系 二.解决方法与步骤: 用到的方法: 1.Matrix4的转化_Catirl的博客-CSDN博客 2.平面内直角坐标系中坐标旋转变换公式_Er ...

  9. android将矩阵转换成字节数组,android-使用OpenGL矩阵转换将纹理从“ 1D”映...

    (针对这个问题,我正在尝试研究解决this other one的想法) 如果我在内存中有一个标准的2D数组,其尺寸为width和height,则可以将其转换为一个长度为width * height的一 ...

最新文章

  1. 搭建Zabbix分布式监控
  2. 第8章 Iptables与Firewalld防火墙
  3. oracle fra空间不足,ORACLE 基础解决方案1_扩大FRA区
  4. WindowsServer2012史记4-重复数据删除的魅力
  5. boost::sort模块实现spreadsort 字符串排序示例
  6. poj1330Nearest Common Ancestors(LCA小结)
  7. SOA_环境安装系列1_Oracle SOA Suite11g安装总括(案例)
  8. pep 8 规范的一些记录
  9. RabbitMQ简介和六种工作模式详解
  10. 开发过程中编写的一些批处理
  11. python列表修改元素_如何在Python中替换多维列表的第n个元素?
  12. 请给出linux中查看系统已经登录用户的命令?
  13. Lucas+阶乘打表+费马小定理模板2.0
  14. python课程设计的主要任务是什么_Python网络编程课程设计 任务1.docx
  15. 计算机自动关机命令,自动关机命令|电脑自动关机命令|如何设置自动关机 - 电脑自动关机命令详解 - 安全专题...
  16. CREO:CREO软件之零件【模型】形状之拉伸、旋转、旋转混合的简介及其使用方法(图文教程)之详细攻略
  17. 微信小程序 布局对齐属性
  18. 未兼容android9系统魔秀桌面,魔秀桌面(com.moxiu.launcher) - 7.2.9.2 - 应用 - 酷安
  19. matlab 安装coder工具包,matlab coder 工具箱使用教程
  20. 五层木桶理论/五层木桶理论

热门文章

  1. MySQL--DQL
  2. 常见的数据分析师的面试问题 完整文件放在GitHub链接上了!!!擅用crtl + F
  3. python实现md5和sha1加密
  4. 25PXE高效批量网络装机
  5. 计算机组成原理作业1王诚,计算机组成原理 王诚 郭超峰 计算机组成第1章
  6. 阿里Java开发手册一方库/二方库/三方库等概念详解
  7. 通过西部世界来盘点近来人工智能研究的发展
  8. LTspice使用教程笔记
  9. 2023年软考中级网络工程师考试大纲
  10. 博士毕业选择回老家县城大专任教!事业编、副教授待遇、外加几十万安家费......