python栅格地图上路径规划作图

工具 spyder(python3.7)  matplotlib库

在进行路径规划仿真的时候,我们希望最后得到的结果不仅仅是一个 填满数字的数组,而是将它变为更加直观的图片

(spyder数组自带染色,很赞)这是我的A*算法得到的最后的结果,数字意义如下:

数字01346
含义障碍物可以通行被加入openlist的节点被加入closelist节点最后的路径

但是这样的图片表达效果不佳,我寻求了几种可以将它转化为图片的方法

1.利用pylab中的热图,直接将数组作为参数传入即可得到以下图片

代码:

plt.imshow(map_grid, cmap=plt.cm.hot, interpolation='nearest', vmin=0, vmax=10)
plt.colorbar()
xlim(-1, 20)  # 设置x轴范围
ylim(-1, 20)  # 设置y轴范围
my_x_ticks = np.arange(0, 20, 1)
my_y_ticks = np.arange(0, 20, 1)
plt.xticks(my_x_ticks)
plt.yticks(my_y_ticks)
plt.grid(True)
plt.show()

这种方式在表达效果上优于未染色的数组,但是我没有对imshow的热图(heatmap)进行深入研究,所以该没有研究该如何自定义各个部分的颜色,感兴趣的朋友推荐这篇文章给你们https://www.cnblogs.com/dylancao/p/9993953.html

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.xticks(my_x_ticks)#我理解为竖线的位置与间隔
    plt.yticks(my_y_ticks)
    plt.grid(True)  #开启栅格
    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库进行绘制

这种方法理论上可行(我没有实践)

直接通过img=np.zeros(size,dtype='uint8')来创建画布,然后将得到的二维数组做一个比例变换处理(你不希望自己的图只有几百个像素点吧),依靠OpenCV提供的绘图函数来展示内容

这种方法很麻烦,但是对像素点操作的方式决定了它自由度极高,可以满足很多怪异需求

 

这里还是推荐大家使用第二种方式,原理简单,在具有一定自由度的情况下也不需要很麻烦操作。

 

 

路径规划是指在给定的地图中找到多个最短路径的问题。在路径规划中,Dijkstra算法是一种常用的方法。Dijkstra算法通过遍历整个地图,计算每个节点到起始节点的最短路径,并记录下路径的长度和节点的顺序。然后,根据这些信息,可以找到多个最短路径。 在Python中,可以使用Dijkstra算法来实现多路径规划。首先,需要定义地图的节点和边的关系,并计算每个节点到起始节点的距离。然后,使用优先队列来选择下一个要访问的节点,并更新节点的距离。最后,根据计算得到的最短路径信息,可以找到多个最短路径。 以下是一个简单的Python代码示例,用于实现多路径规划: ```python import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances\[start\] = 0 queue = \[(0, start)\] paths = {start: \[\]} while queue: current_distance, current_node = heapq.heappop(queue) if current_distance > distances\[current_node\]: continue for neighbor, weight in graph\[current_node\].items(): distance = current_distance + weight if distance < distances\[neighbor\]: distances\[neighbor\] = distance heapq.heappush(queue, (distance, neighbor)) paths\[neighbor\] = paths\[current_node\] + \[neighbor\] return paths # 定义地图的节点和边的关系 graph = { 'A': {'B': 5, 'C': 3}, 'B': {'A': 5, 'C': 1, 'D': 3}, 'C': {'A': 3, 'B': 1, 'D': 2}, 'D': {'B': 3, 'C': 2} } # 设置起始节点 start_node = 'A' # 调用Dijkstra算法计算多个最短路径 paths = dijkstra(graph, start_node) # 输出多个最短路径 for node, path in paths.items(): if node != start_node: print(f"从节点 {start_node} 到节点 {node} 的最短路径为: {path}") ``` 这段代码使用了优先队列来实现Dijkstra算法,并计算了从起始节点到其他节点的多个最短路径。你可以根据自己的需求修改地图的节点和边的关系,然后运行代码来得到多个最短路径的结果。 #### 引用[.reference_title] - *1* *2* [【路径规划】全局路径规划算法——Dijkstra算法(含python实现 | c++实现)](https://blog.csdn.net/weixin_42301220/article/details/125060298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python栅格地图路径规划作图](https://blog.csdn.net/lustyoung/article/details/105027607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值