欢迎来到 < Haoh-Smile > 的博客,觉得受用客官就点个赞评论一下呗!
在栅格地图中画出一条路径
在数字化描述了环境地图以后,运用路径规划算法在建立好的栅格地图中找到一条两节点的路径,其算法给出的只是相应的节点数字量,如何更直观的在栅格地图中画出这条路径呢?下面我们就实现一下在栅格地图中画出我们运用相应算法得到的一条路径。
首先根据自己所应用的环境信息建立相应的栅格电子地图,建立栅格地图的方法详解请见链接栅格法建立环境地图。我们应用该链接中建立的栅格地图为例:
其栅格地图中的每一个栅格代表了一个路径节点,一条路径是由多个节点所组成。在栅格地图中画出一条路径的关键就是要找到算法给出路径节点与栅格地图中每个栅格的对应坐标轴位置关系,找到这种对应关系后,就可以在栅格地图中画出这条路径了。比如在该例中左下角的栅格数字标识为1,那么我规定其栅格为节点1的位置,数字标识2表示节点2的位置,以此类推。根据这样的节点位置建立相应的邻接矩阵,描述个节点间的位置距离关系,规定各水平垂直相邻节点中心的距离为1,黑色栅格为障碍不可达区域,建立相应邻接矩阵的方法详见链接建立单位距离邻接矩阵。
如上所述,各节点与各栅格的坐标位置关系是什么呢?比如我要画栅格1到栅格2的一条路径,那么我要在栅格1的中心位置引出一条线,这条线终止于栅格2的中心位置,也就是是说各节点在栅格地图上的位置是对应栅格中心的位置坐标,例节点1对应栅格1的位置坐标(0.5,0.5),节点2对应栅格2的位置坐标(1.5,0.5)。找到这种关系后,在各相邻路径节点画出一条直线就可以画出该路径了。这种关系的描述用MATLAB实现如下:`
%%%%%%%%%%%%%%%%%%%%%根据栅格标识,得到相应的x,y坐标%%%%%%%%%%%%%%%%%%%%%
function [x y]=Get_xy(distance,path,map)
% distance 路径长度 若不可达路径不执行该函数程序
% path 路径节点向量
% map 栅格地图信息
if(distance~=Inf) %判断路径是否可达
n = size(map);
N = size(path,2);
for(i=1:N) %根据栅格标识,得到相应的x,y坐标
if rem(path(i),n(2))==0
x(i)=n(2);
y(i)= floor(path(i)/n(2));
else
x(i)= rem(path(i),n(2));
y(i)= floor(path(i)/n(2))+1;
end
end
else
x = 0;
y = 0;
end
执行以上程序就可以得到个路径节点在栅格地图中所对应的位置信息,然后根据这些节点的位置信息在栅格地图上将其画出,MATLAB实现如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%画出路径%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Plot(distance,x,y)
if(distance~=Inf) %判断路径是否可达
plot(x-0.5,y-0.5,'r');
hold on
else
disp('路径不可达');
hold on
end
下面以Dijkstra算法为例,找到栅格1到栅格100的一条路径,其实现如下:
map=[0 0 0 1 0 0 1 0 0 0;
1 0 0 0 0 1 1 0 0 0;
0 0 1 0 0 0 1 1 0 0;
0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 1 0 0 1 0;
1 0 0 0 0 1 1 0 0 0;
0 0 0 1 0 0 0 0 0 0;
1 1 1 0 0 0 1 0 0 0;
0 0 0 0 0 1 1 0 0 0;
0 0 0 0 0 1 1 0 0 0;];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立环境矩阵map%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DrawMap(map);%得到环境地图
W=G2D(map); %得到环境地图的邻接矩阵
t1 = clock; %开启计时
[distance,path]=dijkstra(W,1,100);%设置起始栅格,得到最短路径距离以及栅格路径
[x,y]=Get_xy(distance,path,map); %得到栅格相应的x,y坐标
t2 = clock; %结束计时
Plot(distance,x,y); %画出路径
time=etime(t2,t1); %计算时间
xlabel(['运行时间 TIME=' ,num2str(time),'s'],'Fontsize',16); %输出运行时间
运行结果如下:
其中函数程序:
DrawMap(map) 详见建立栅格地图
W=G2D(map);详见建立邻接矩阵
[distance,path]=dijkstra(W,1,100)详见Dijkstra算法