使用multiprocessing绘图时无法同时遍历绘制两条路径的问题咨询
问题原因分析
- 进程创建方式错误:你写的
Process(target=visualize_path(grid, start, goal, path1)).start()是直接调用了visualize_path函数,等函数执行完才会把返回值(此处为None)传给target参数,根本没有实现多进程效果,只是串行执行了两次绘图函数。 - 跨进程绘图不可行:matplotlib的画布对象是进程内独立的,两个子进程会各自创建独立的画布,不可能把内容画到同一张图里,且matplotlib的GUI渲染逻辑本身不支持多进程操作。
- 原绘图逻辑每次循环都会执行
plt.cla()清空画布,就算你想办法做了进程间数据同步,每次清空操作也会把另一条路径的内容清掉。
解决方案
不需要使用多进程/多线程,直接在同一个动画循环里同步更新两条路径的当前点即可,修改后代码如下:
import matplotlib.pyplot as plt import numpy as np do_animation = True def visualize_two_paths(grid_map, start, goal, path1, path2): oy, ox = start gy, gx = goal # 处理两条路径的坐标 px1, py1 = np.transpose(np.flipud(np.fliplr(path1))) px2, py2 = np.transpose(np.flipud(np.fliplr(path2))) if not do_animation: plt.imshow(grid_map, cmap='Greys') plt.plot(ox, oy, "-xy") plt.plot(px1, py1, "-r", label="路径1") plt.plot(px2, py2, "-b", label="路径2") plt.plot(gx, gy, "-pg") plt.legend() plt.show() else: # 同步遍历两个路径的点,取长度最大值适配不同长度的路径 max_len = max(len(px1), len(px2)) for step in range(max_len): plt.cla() # 绑定esc退出事件 plt.gcf().canvas.mpl_connect( 'key_release_event', lambda event: [exit(0) if event.key == 'escape' else None]) plt.imshow(grid_map, cmap='Greys') plt.plot(ox, oy, "-xb") # 绘制两条完整路径的轨迹 plt.plot(px1, py1, "-r", label="路径1") plt.plot(px2, py2, "-b", label="路径2") plt.plot(gx, gy, "-pg") # 绘制当前步的位置,避免索引越界 if step < len(px1): plt.plot(px1[step], py1[step], "or", markersize=10) if step < len(px2): plt.plot(px2[step], py2[step], "ob", markersize=10) plt.axis("equal") plt.grid(True) plt.legend() plt.pause(0.5) plt.show() def main(): start = [0,0] goal = [20,20] path1 = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5]] path2 = [[7, 15], [8, 16], [9, 17], [10, 18], [11, 19], [12, 20]] grid = np.zeros((20,20)) visualize_two_paths(grid, start, goal, path1, path2) if __name__ == "__main__": main()
修改说明:
- 把单路径绘图函数改成支持双路径输入,同一个循环里同步更新两个路径的当前位置
- 适配了不同长度的路径,避免索引越界
- 增加了图例区分两条路径,用不同颜色标记轨迹和当前点
- 剔除了没必要的多进程逻辑,完全避免了跨进程绘图的兼容性问题
内容的提问来源于stack exchange,提问作者Jahid Chowdhury
相关产品推荐
相关产品推荐

