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

在栅格地图中,每一个栅格相当于一个节点;而在一条路径中,各个栅格是相邻的或者是对角的。比如一个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. 最好用的 IntelliJ 插件 Top 10
  2. fms安装教程 linux_FMS安装
  3. Python dir和vars的区别
  4. Linux进阶之路———Shell 编程入门
  5. qt获取本机全部ipv4_Qt之获取本机网络信息(MAC, IP等等,很全)
  6. 直播预告:电力行业互联网改革思路与应对方案
  7. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用...
  8. Java多线程系列 JUC线程池01 线程池框架
  9. 国开大学计算机应用实操题作业如何上传,国开电大18秋《计算机应用基础》形考任务作业.doc...
  10. java购物系统需求分析_java网上购物系统需求分析报告.doc
  11. 技术至简-8:调制解调到底是什么样的数学运算?---从时域和频域两个角度看调制解调的本质
  12. 转型微服务架构完整实施方案
  13. 信息学奥赛一本通 1296:开餐馆(evd)
  14. Windows10下美化字体,达到类似mac的效果
  15. javafx 教程_用JavaFX编写图块引擎
  16. vrf路由泄露原理和简单示例
  17. 救生艇(Java算法每日一题)(双指针法)
  18. Android 全面屏处理(适配挖孔屏、刘海屏) kotlin
  19. 如何将多个文件夹重命名
  20. PNETLAB中可以导入的交换机、防火墙等设备镜像

热门文章

  1. cst是什么时间(Cst是什么检查)
  2. 《焦虑心理学》——情绪定势
  3. 谷歌开源新模型 EfficientNet:图像识别效率提升 10 倍,参数减少 88%
  4. Ubuntu18.04 MySQL+hive安装
  5. 5G无线关键技术 — 非正交多址接入技术
  6. 智慧协同新应用:FEv6.6,让组织更灵动/敏捷!
  7. 一种通用DLL劫持技术研究
  8. 医院计算机五大应用系统,医院计算机五大应用系统
  9. 基于SpringBoot的漫画网站设计与实现
  10. 一文读懂C#中的抽象类、抽象方法、virtual虚函数、override重写函数及父类子类构造函数和析构函数的执行顺序