python栅格地图上路径规划作图
工具 spyder(python3.7)? matplotlib庫
在進行路徑規(guī)劃仿真的時候,我們希望最后得到的結果不僅僅是一個 填滿數(shù)字的數(shù)組,而是將它變?yōu)楦又庇^的圖片
(spyder數(shù)組自帶染色,很贊)這是我的A*算法得到的最后的結果,數(shù)字意義如下:
| 數(shù)字 | 0 | 1 | 3 | 4 | 6 |
| 含義 | 障礙物 | 可以通行 | 被加入openlist的節(jié)點 | 被加入closelist節(jié)點 | 最后的路徑 |
但是這樣的圖片表達效果不佳,我尋求了幾種可以將它轉化為圖片的方法
1.利用pylab中的熱圖,直接將數(shù)組作為參數(shù)傳入即可得到以下圖片
代碼:
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()這種方式在表達效果上優(yōu)于未染色的數(shù)組,但是我沒有對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為處理好的二維數(shù)組 obstacle到openlist都是整數(shù),為其對應的標志。比如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軸間隔不一樣長,影響最后的表現(xiàn)效果,所以手動設定等長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()簡單來講就是遍歷整個地圖,然后將需要繪制的障礙物,路徑等都通過列表記錄下來,最后通過這幾行表現(xiàn)出來,但是傳入的mapgrid必須是類似本文第一張圖那種經(jīng)過算法處理過的形式
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')來創(chuàng)建畫布,然后將得到的二維數(shù)組做一個比例變換處理(你不希望自己的圖只有幾百個像素點吧),依靠OpenCV提供的繪圖函數(shù)來展示內容
這種方法很麻煩,但是對像素點操作的方式?jīng)Q定了它自由度極高,可以滿足很多怪異需求
?
這里還是推薦大家使用第二種方式,原理簡單,在具有一定自由度的情況下也不需要很麻煩操作。
?
?
總結
以上是生活随笔為你收集整理的python栅格地图上路径规划作图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: T-digest
- 下一篇: 计算机中级职称能转评讲师,职称评定中,什