1 """Plot JSON formatted scenario."""
3 from math import cos, pi, sin
5 from matplotlib import pyplot as plt
6 from sys import argv, exit
19 def get_scenario(fname):
20 """Load scenario from file."""
22 raise ValueError("File name as argument needed")
23 with open(fname, "r") as f:
24 scenario = loads(f.read())
27 def plot_nodes(nodes=[]):
28 """Return ``xcoords``, ``ycoords`` arrays of nodes to plot.
31 nodes -- The list of nodes to plot.
36 xcoords.append(n[0] - MINX)
37 ycoords.append(n[1] - MINY)
38 return (xcoords, ycoords)
41 """Return ``xcoords``, ``ycoords`` arrays of car frame to plot.
44 pose -- The pose of a car.
47 lfx += (BCAR_W / 2.0) * cos(pose[2] + pi / 2.0)
48 lfx += BCAR_DF * cos(pose[2])
49 lfx += BCAR_SD * cos(pose[2])
52 lrx += (BCAR_W / 2.0) * cos(pose[2] + pi / 2.0)
53 lrx += -BCAR_DR * cos(pose[2])
54 lrx += -BCAR_SD * cos(pose[2])
57 rrx += (BCAR_W / 2.0) * cos(pose[2] - pi / 2.0)
58 rrx += -BCAR_DR * cos(pose[2])
59 rrx += -BCAR_SD * cos(pose[2])
62 rfx += (BCAR_W / 2.0) * cos(pose[2] - pi / 2.0)
63 rfx += BCAR_DF * cos(pose[2])
64 rfx += BCAR_SD * cos(pose[2])
67 lfy += (BCAR_W / 2.0) * sin(pose[2] + pi / 2.0)
68 lfy += BCAR_DF * sin(pose[2])
69 lfy += BCAR_SD * sin(pose[2])
72 lry += (BCAR_W / 2.0) * sin(pose[2] + pi / 2.0)
73 lry += -BCAR_DR * sin(pose[2])
74 lry += -BCAR_SD * sin(pose[2])
77 rry += (BCAR_W / 2.0) * sin(pose[2] - pi / 2.0)
78 rry += -BCAR_DR * sin(pose[2])
79 rry += -BCAR_SD * sin(pose[2])
82 rfy += (BCAR_W / 2.0) * sin(pose[2] - pi / 2.0)
83 rfy += BCAR_DF * sin(pose[2])
84 rfy += BCAR_SD * sin(pose[2])
86 xcoords = (lfx - MINX, lrx - MINX, rrx - MINX, rfx - MINX)
87 ycoords = (lfy - MINY, lry - MINY, rry - MINY, rfy - MINY)
88 return (xcoords, ycoords)
90 if __name__ == "__main__":
96 scenario = get_scenario(SCEN_FILE)
98 plt.rcParams["font.size"] = 24
99 plt.rcParams['hatch.linewidth'] = 1.0
102 # here subplot starts
103 ax = fig.add_subplot(111)
104 ax.set_aspect("equal")
105 ax.set_title("{}".format(SCEN_FILE))
106 ax.set_xlabel("x [m]")
107 ax.set_ylabel("y [m]")
108 #ax.set_xlim([34, 53]) # 19
109 #ax.set_ylim([-1, 16]) # 17
110 #ax.set_xlim([28, 53]) # 25
111 #ax.set_ylim([-1, 21]) # 22
113 MINX = scenario["init"][0]
114 MINY = scenario["init"][1]
115 if "obst" in scenario and len(scenario["obst"]) > 0:
116 for o in scenario["obst"]:
123 if "nodes_x" in scenario and "nodes_y" in scenario:
125 scenario["nodes_x"] - MINX,
126 scenario["nodes_y"] - MINY,
132 if "obst" in scenario and len(scenario["obst"]) > 0:
133 for o in scenario["obst"]:
134 plt.plot(*plot_nodes(o), color="blue")
135 if "last" in scenario and len(scenario["last"]) > 0:
136 for n in scenario["last"]:
137 plt.plot(*plot_car(n), color="peachpuff")
138 if "path" in scenario and len(scenario["path"]) > 0:
139 for n in scenario["path"]:
140 plt.plot(*plot_car(n), color="peachpuff")
141 plt.plot(*plot_nodes(scenario["path"]), color="orange")
142 if "last" in scenario and len(scenario["last"]) > 0:
143 plt.plot(*plot_nodes(scenario["last"]), color="orange")
144 if "slot" in scenario and len(scenario["slot"]) > 0:
145 plt.plot(*plot_nodes(scenario["slot"][0]), color="gray")
146 for s in scenario["slot"]:
147 pass#plt.plot(*plot_nodes(s), color="gray")
148 if "init" in scenario and len(scenario["init"]) == 3:
149 plt.plot(*plot_car(scenario["init"]), color="red")
151 scenario["init"][0] - MINX,
152 scenario["init"][1] - MINY,
157 if "goals" in scenario:
158 for i in scenario["goals"]:
160 plt.plot(*plot_car(i), color="darkseagreen")
161 plt.plot(i[0] - MINX, i[1] - MINY, color="darkseagreen", marker="+", ms=12)
162 if "goal" in scenario and len(scenario["goal"]) == 3:
164 plt.plot(*plot_car(scenario["goal"]), color="magenta")
166 scenario["goal"][0] - MINX,
167 scenario["goal"][1] - MINY,
173 if "last" in scenario:
174 plt.plot(*plot_car(scenario["last"][0]), color="green")
176 scenario["last"][0][0] - MINX,
177 scenario["last"][0][1] - MINY,
182 if "starts" in scenario and len(scenario["starts"]) > 0:
183 print("possible starts:")
184 for p in scenario["starts"]:
185 plt.plot(*p, color="red", marker="+", ms=12)
186 print(" {}".format(p))
188 handles, labels = ax.get_legend_handles_labels()