python栅格地图上路径规划作图
⼯具 spyder(python3.7)  matplotlib库
在进⾏路径规划仿真的时候,我们希望最后得到的结果不仅仅是⼀个 填满数字的数组,⽽是将它变为更加直观的图⽚
(spyder数组⾃带染⾊,很赞)这是我的A*算法得到的最后的结果,数字意义如下:
01346
含义障碍
可以通
被加⼊openlist的
节点
被加⼊closelist
节点
最后的路
但是这样的图⽚表达效果不佳,我寻求了⼏种可以将它转化为图⽚的⽅法
1.利⽤pylab中的热图,直接将数组作为参数传⼊即可得到以下图⽚
代码:
plt.imshow(map_grid, hot, interpolation='nearest', vmin=0, vmax=10)
xlim(-1, 20)  # 设置x轴范围
ylim(-1, 20)  # 设置y轴范围
my_x_ticks = np.arange(0, 20, 1)
my_y_ticks = np.arange(0, 20, 1)
spyder python下载plt.show()
这种⽅式在表达效果上优于未染⾊的数组,但是我没有对imshow的热图(heatmap)进⾏深⼊研究,所以该没有研究该如何⾃定义各个部分的颜⾊,感兴趣的朋友推荐这篇⽂章给你们
2.直接利⽤matplotlib进⾏绘图,利⽤ plot  scatter以及线条控制来表达我们想要的图像
直接上效果图
⿊⾊表⽰障碍物,浅蓝⾊⽅块表⽰加⼊过openlist的位置,绿⾊表⽰加⼊closelist的位置,蓝⾊线条表⽰我们最后的路径
(是不是感觉好看很多哈哈哈哈)
代码如下:
def draw_path(map_grid,obstacle,path,closelist,openlist=None):
'''
map_grid为处理好的⼆维数组
obstacle到openlist都是整数,为其对应的标志。⽐如0代表obstacle,那么obstacle位置就填0
'''
obstacle_x=[]
obstacle_y=[]
path_x=[]
path_y=[]
close_list_x=[]
close_list_y=[]
open_list_x=[]
open_list_y=[]
for i in range(map_grid.shape[0]):
for j in range(map_grid.shape[1]):
if map_grid[i][j]==obstacle:  #栅格地图上obstacle为障碍物标识
obstacle_x.append(i)
obstacle_y.append(j)
if map_grid[i][j]==path:  #栅格地图上path为最后搜索得到路径位置标志
path_x.append(i)
path_y.append(j)
if map_grid[i][j]==closelist:  #栅格地图上closelist为为闭列表中记录的位置标志
close_list_x.append(i)
close_list_y.append(j)
if map_grid[i][j]==openlist:  #栅格地图上openlist为为闭列表中记录的位置标志
open_list_x.append(i)
open_list_y.append(j)
plt.figure(figsize=(10,10))  #为了防⽌x,y轴间隔不⼀样长,影响最后的表现效果,所以⼿动设定等长
plt.xlim(-1,map_grid.shape[0])
plt.ylim(-1,map_grid.shape[1])
my_x_ticks = np.arange(0, map_grid.shape[0], 1)
my_y_ticks = np.arange(0, map_grid.shape[1], 1)
plt.plot(path_x,path_y,linewidth=3)
plt.scatter(open_list_x,open_list_y,s=500,c='cyan',marker='s')
plt.scatter(obstacle_x,obstacle_y,s=500,c='k',marker='s')
plt.scatter(close_list_x,close_list_y,s=500,c='g',marker='s')
plt.title("grid map simulation ")
plt.show()
简单来讲就是遍历整个地图,然后将需要绘制的障碍物,路径等都通过列表记录下来,最后通过这⼏⾏表现出来,但是传⼊的mapgrid必须是类似本⽂第⼀张图那种经过算法处理过的形式
plt.plot(path_x,path_y,linewidth=3)
plt.scatter(open_list_x,open_list_y,s=500,c='cyan',marker='s')
plt.scatter(obstacle_x,obstacle_y,s=500,c='k',marker='s')
plt.scatter(close_list_x,close_list_y,s=500,c='g',marker='s')
marker代表点标志,c表⽰颜⾊,s表⽰标志的⼤⼩,s的⼤⼩需要⼤家⾃⼰⼿动调整⼀下,不⼀定适⽤。这⾥有⼀份,可以帮你快速选择⾃⼰要的颜⾊和样式
说明:这⾥选择plot来绘制路径是因为plot会⾃动连线(除⾮设置linestyle=''),⽽scatter是绘制散点图,它不会⾃动连线。
3.利⽤OpenCV库进⾏绘制
这种⽅法理论上可⾏(我没有实践)
直接通过s(size,dtype='uint8')来创建画布,然后将得到的⼆维数组做⼀个⽐例变换处理(你不希望⾃⼰的图只有⼏百个像素点吧),依靠OpenCV提供的绘图函数来展⽰内容
这种⽅法很⿇烦,但是对像素点操作的⽅式决定了它⾃由度极⾼,可以满⾜很多怪异需求
这⾥还是推荐⼤家使⽤第⼆种⽅式,原理简单,在具有⼀定⾃由度的情况下也不需要很⿇烦操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。