123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- """
- 算法结果回放
- """
- import json
- import math
- import matplotlib.pyplot as plt
- import input.make_map as mp
- from utils import drawcar as tools, reeds_shepp as rs
- from input import make_car
- import numpy as np
- import imageio
- def replay(map_scene,output_result):
- picture_scene = map_scene.replace('/', '/').replace('.json', '.jpg')
- gif_scene = map_scene.replace('input', 'image_save').replace('.json', '.gif')
- if output_result[-6].isdigit():
- Num =output_result.rsplit('/result_', 1)[-1].rsplit('.', 1)[0]
- if Num[-2].isdigit():
- gif_scene = gif_scene.replace('.gif', f'{Num[-3:]}.gif')
-
- else:
- gif_scene = gif_scene.replace('.gif', f'{Num[-2:]}.gif')
- C = make_car.C
- ox, oy,sp,gp = mp.make_map(map_scene)
- sx, sy, syaw0 = sp['x'], sp['y'], sp['yaw']
- gx, gy, gyaw0 = gp['3']['x_end'], gp['3']['y_end'], gp['3']['yaw']
- with open(output_result,'r',encoding='UTF-8') as f:
- result=json.load(f)
- x = result['output_x']
- y = result['output_y']
- yaw = result['output_yaw']
- direction = result['output_dir']
- plt.rcParams['xtick.direction'] = 'in'
- picture = plt.imread(picture_scene)
- ox1,ox2,oy1,oy2 = min(ox), max(ox), min(oy), max(oy)
- frames = [] # 用于保存每一帧图像
- for k in range(len(x)):
- if k % 3 == 0:
- fig, ax = plt.subplots()
- ax.imshow(picture, extent=[ox1, ox2, oy1, oy2], aspect='auto')
- ax.lines.clear()
- ax.plot(x, y, linewidth=0.5, color='b', linestyle='--')
- # ax.plot(ox, oy, ",k")
- if k < len(x) - 2:
- dy = (yaw[k + 1] - yaw[k]) / C.MOVE_STEP
- steer = rs.pi_2_pi(math.atan(-C.WB * dy / direction[k]))
- else:
- steer = 0.0
- tools.draw_car(ax, gx, gy, gyaw0, 0.0, 'dimgray')
- tools.draw_car(ax, x[k], y[k], yaw[k], steer)
- ax.set_title("Simulation Result", loc='left', fontweight="heavy")
- ax.axis("equal")
- # 保存当前帧图像
- fig.canvas.draw()
- image = np.frombuffer(fig.canvas.tostring_rgb(), dtype='uint8')
- image = image.reshape(fig.canvas.get_width_height()[::-1] + (3,))
- frames.append(image)
- plt.show()
- # 将所有保存的帧图像整合成 GIF 动态图
- imageio.mimsave(gif_scene, frames, fps=15)
- if output_result[-6].isdigit():
- if Num[-2].isdigit():
- print(f"车位{Num[-2:]}仿真完成")
- else:
- print(f"车位{Num[-1]}仿真完成")
- else:
- print("仿真结束!")
- # def replay(map_scene, output_result):
- # picture_scene = map_scene.replace('/', '/').replace('.json', '.jpg')
- # gif_scene = map_scene.replace('input', 'image_save').replace('.json', '.gif')
- # if output_result[-6].isdigit():
- # Num = output_result.rsplit('/result_', 1)[-1].rsplit('.', 1)[0]
- # if Num[-2].isdigit():
- # gif_scene = gif_scene.replace('.gif', f'{Num[-3:]}.gif')
- # else:
- # gif_scene = gif_scene.replace('.gif', f'{Num[-2:]}.gif')
- # C = make_car.C
- # ox, oy, sp, gp = mp.make_map(map_scene)
- # sx, sy, syaw0 = sp['x'], sp['y'], sp['yaw']
- # gx, gy, gyaw0 = gp['3']['x_end'], gp['3']['y_end'], gp['3']['yaw']
- # with open(output_result, 'r', encoding='UTF-8') as f:
- # result = json.load(f)
- # x = result['output_x']
- # y = result['output_y']
- # yaw = result['output_yaw']
- # direction = result['output_dir']
- # plt.rcParams['xtick.direction'] = 'in'
- # picture = plt.imread(picture_scene)
- # ox1, ox2, oy1, oy2 = min(ox), max(ox), min(oy), max(oy)
- # frames = [] # 用于保存每一帧图像
- # for k in range(len(x)):
- # if k % 3 == 0:
- # fig, ax = plt.subplots()
- # ax.imshow(picture, extent=[ox1, ox2, oy1, oy2], aspect='auto')
- # while ax.lines:
- # ax.lines[0].remove()
- # ax.plot(x, y, linewidth=0.5, color='b', linestyle='--')
- # if k < len(x) - 2:
- # dy = (yaw[k + 1] - yaw[k]) / C.MOVE_STEP
- # steer = rs.pi_2_pi(math.atan(-C.WB * dy / direction[k]))
- # else:
- # steer = 0.0
- # tools.draw_car(ax, gx, gy, gyaw0, 0.0, 'dimgray')
- # tools.draw_car(ax, x[k], y[k], yaw[k], steer)
- # ax.set_title("Simulation Result", loc='left', fontweight="heavy")
- # ax.axis("equal")
- # # 保存当前帧图像
- # fig.canvas.draw()
- # image = np.frombuffer(fig.canvas.tostring_rgb(), dtype='uint8')
- # image = image.reshape(fig.canvas.get_width_height()[::-1] + (3,))
- # frames.append(image)
- # plt.close(fig) # 关闭当前图像以避免超过限制
- # # 将所有保存的帧图像整合成 GIF 动态图
- # imageio.mimsave(gif_scene, frames, fps=15)
- # if output_result[-6].isdigit():
- # if Num[-2].isdigit():
- # print(f"车位{Num[-2:]}仿真完成")
- # else:
- # print(f"车位{Num[-1]}仿真完成")
- # else:
- # print("仿真结束!")
|