1 # -*- coding: utf-8 -*-
2 """This scipt loads scenario and result trajectory from files and plots it."""
4 from math import copysign, cos, pi, sin
5 from matplotlib import pyplot as plt
8 sign = lambda x: copysign(1, x)
35 "trajectory-frame": "lightblue",
37 "log": ("gold", "orange", "blueviolet", "blue", "navy", "black"),
41 """Return `xcoords`, `ycoords` arrays of car frame.
44 pose -- The pose of a car.
47 lfx += (WIDTH / 2.0) * cos(pose[2] + pi / 2.0)
48 lfx += WHEEL_BASE * cos(pose[2])
49 lfx += SAFETY_DIST * cos(pose[2])
52 lrx += (WIDTH / 2.0) * cos(pose[2] + pi / 2.0)
53 lrx += -SAFETY_DIST * cos(pose[2])
56 rrx += (WIDTH / 2.0) * cos(pose[2] - pi / 2.0)
57 rrx += -SAFETY_DIST * cos(pose[2])
60 rfx += (WIDTH / 2.0) * cos(pose[2] - pi / 2.0)
61 rfx += WHEEL_BASE * cos(pose[2])
62 rfx += SAFETY_DIST * cos(pose[2])
65 lfy += (WIDTH / 2.0) * sin(pose[2] + pi / 2.0)
66 lfy += WHEEL_BASE * sin(pose[2])
67 lfy += SAFETY_DIST * sin(pose[2])
70 lry += (WIDTH / 2.0) * sin(pose[2] + pi / 2.0)
71 lry += -SAFETY_DIST * sin(pose[2])
74 rry += (WIDTH / 2.0) * sin(pose[2] - pi / 2.0)
75 rry += -SAFETY_DIST * sin(pose[2])
78 rfy += (WIDTH / 2.0) * sin(pose[2] - pi / 2.0)
79 rfy += WHEEL_BASE * sin(pose[2])
80 rfy += SAFETY_DIST * sin(pose[2])
82 xcoords = (lfx, lrx, rrx, rfx)
83 ycoords = (lfy, lry, rry, rfy)
84 return (xcoords, ycoords)
86 def load_scenario(fname):
87 """Load scenario from file."""
89 raise ValueError("File name as argument needed")
90 with open(fname, "r") as f:
91 scenario = loads(f.read())
94 def load_trajectory(fname):
95 """Load trajectory from file."""
97 raise ValueError("File name as argument needed")
98 with open(fname, "r") as f:
99 trajectory = loads(f.read())
102 def plot_nodes(nodes=[]):
103 """Return xcoords, ycoords of nodes to plot.
106 nodes -- The list of nodes to plot.
113 return (xcoords, ycoords)
115 def plot_segments(segments=[]):
116 """Return xcoords, ycoords of segments to plot.
119 segments -- The list of segments to plot.
123 if __name__ == "__main__":
124 s = load_scenario(SCEN_FILE)
126 t = load_trajectory(TRAJ_FILE) # fixed to trajectories
130 plt.rcParams["font.size"] = 24
132 ax = fig.add_subplot(111)
133 ax.set_aspect("equal")
134 ax.set_title("SCENARIO")
135 ax.set_xlabel("Longitudinal direction [m]")
136 ax.set_ylabel("Lateral direction [m]")
141 plt.plot(*plot_nodes(o["segment"]), color="black")
145 ax.add_artist(plt.Circle((o["circle"][0], o["circle"][1]),
147 color="black", fill=False))
152 plt.plot(*plot_nodes(t["node"]), color=COLOR["node"],
153 marker=".", linestyle = "None")
158 for edges in t["edge"]:
160 plt.plot([e[0][0], e[1][0]], [e[0][1], e[1][1]],
168 plt.plot(*car_frame(i), color=COLOR["sample"])
170 plt.plot(*plot_nodes(t["samp"]), color=COLOR["sample"],
171 marker=".", linestyle = "None")
173 print("No RRTSample")
176 for path in range(len(t["path"])):
177 plt.plot(*plot_nodes(t["path"][path]), color=COLOR["path"])
182 for traj in range(len(t["traj"])):
184 for i in t["traj"][traj]:
185 plt.plot(*car_frame(i), color=COLOR["log"][traj],
186 label=t["cost"][traj])
190 *plot_nodes(t["traj"][traj]),
191 color=COLOR["log"][traj],
192 label=t["cost"][traj])
195 *plot_nodes(t["traj"][traj]),
197 label=t["cost"][traj])
199 print("No trajectory")
200 for i in range(len(t["traj"][-1]) - 1):
201 n1 = t["traj"][-1][i]
202 n2 = t["traj"][-1][i + 1]
203 if (sign(n1[4]) != sign(n2[4])):
204 plt.plot(n2[0], n2[1], color=COLOR["log"][1], marker=".")
205 plt.plot(*plot_nodes([s["init"]]), color=COLOR["start"], marker=".")
206 plt.plot(*plot_nodes([s["goal"]]), color=COLOR["goal"], marker=".")
209 handles, labels = ax.get_legend_handles_labels()
210 lgd = ax.legend(handles, labels, loc="upper center",
211 bbox_to_anchor=(0.5, -0.11), title="Cost")
213 #plt.savefig("{}.png".format(argv[2]), bbox_extra_artists=(lgd,),
214 # bbox_inches='tight')