20 import matplotlib.pylab
as plt
21 from nav2_msgs.action
import ComputePathToPose
26 from tabulate
import tabulate
29 def getPaths(results: list[ComputePathToPose.Result]) -> list[Path]:
31 for result
in results:
33 paths.append(path.path)
37 def getTimes(results: list[ComputePathToPose.Result]) -> list[float]:
39 for result
in results:
41 times.append(time.planning_time.nanosec / 1e09 + time.planning_time.sec)
45 def getMapCoordsFromPaths(paths: list[Path], resolution: float) -> list[list[float]]:
50 for pose
in path.poses:
51 x.append(pose.pose.position.x / resolution)
52 y.append(pose.pose.position.y / resolution)
58 def getPathLength(path: Path) -> float:
60 x_prev = path.poses[0].pose.position.x
61 y_prev = path.poses[0].pose.position.y
62 for i
in range(1, len(path.poses)):
63 x_curr = path.poses[i].pose.position.x
64 y_curr = path.poses[i].pose.position.y
65 path_length = path_length + math.sqrt(
66 (x_curr - x_prev) ** 2 + (y_curr - y_prev) ** 2
73 def plotResults(costmap: Costmap, paths: list[Path]) ->
None:
74 coords = getMapCoordsFromPaths(paths, costmap.metadata.resolution)
75 data = np.asarray(costmap.data)
76 data.resize(costmap.metadata.size_y, costmap.metadata.size_x)
77 data = np.where(data <= 253, 0, data)
80 ax = sns.heatmap(data, cmap=
'Greys', cbar=
False)
81 for i
in range(0, len(coords), 2):
82 ax.plot(coords[i], coords[i + 1], linewidth=0.7)
84 ax.set_aspect(
'equal',
'box')
89 paths: list[Path], costmap: Costmap,
90 num_of_planners: int) -> list[list[float]]:
91 coords = getMapCoordsFromPaths(paths, costmap.metadata.resolution)
92 data = np.asarray(costmap.data)
93 data.resize(costmap.metadata.size_y, costmap.metadata.size_x)
95 average_path_costs: list[list[float]] = []
96 for i
in range(num_of_planners):
97 average_path_costs.append([])
100 for i
in range(0, len(coords), 2):
102 for j
in range(len(coords[i])):
103 costs.append(data[math.floor(coords[i + 1][j])][math.floor(coords[i][j])])
104 average_path_costs[k % num_of_planners].append(sum(costs) / len(costs))
107 return average_path_costs
110 def maxPathCost(paths: list[Path], costmap: Costmap, num_of_planners: int) -> list[list[float]]:
111 coords = getMapCoordsFromPaths(paths, costmap.metadata.resolution)
112 data = np.asarray(costmap.data)
113 data.resize(costmap.metadata.size_y, costmap.metadata.size_x)
115 max_path_costs: list[list[float]] = []
116 for i
in range(num_of_planners):
117 max_path_costs.append([])
120 for i
in range(0, len(coords), 2):
122 for j
in range(len(coords[i])):
123 cost = data[math.floor(coords[i + 1][j])][math.floor(coords[i][j])]
126 max_path_costs[k % num_of_planners].append(max_cost)
129 return max_path_costs
135 with open(os.getcwd() +
'/results.pickle',
'rb')
as f:
136 results = pickle.load(f)
138 with open(os.getcwd() +
'/planners.pickle',
'rb')
as f:
139 planners = pickle.load(f)
141 with open(os.getcwd() +
'/costmap.pickle',
'rb')
as f:
142 costmap = pickle.load(f)
144 paths = getPaths(results)
145 path_lengths_list = []
148 path_lengths_list.append(getPathLength(path))
149 path_lengths = np.asarray(path_lengths_list)
150 total_paths = len(paths)
152 path_lengths.resize((int(total_paths / len(planners)), len(planners)))
153 path_lengths = path_lengths.transpose()
155 times = np.asarray(getTimes(results))
156 times.resize((int(total_paths / len(planners)), len(planners)))
157 times = np.transpose(times)
160 average_path_costs = np.asarray(averagePathCost(paths, costmap, len(planners)))
161 max_path_costs = np.asarray(maxPathCost(paths, costmap, len(planners)))
167 'Average path length (m)',
174 for i
in range(0, len(planners)):
175 planner_table.append(
178 np.average(path_lengths[i]),
179 np.average(times[i]),
180 np.average(average_path_costs[i]),
181 np.average(max_path_costs[i]),
186 print(tabulate(planner_table))
187 plotResults(costmap, paths)
190 if __name__ ==
'__main__':