Skip to content

Commit d019e41

Browse files
committed
exit on key
1 parent 268f4d0 commit d019e41

File tree

53 files changed

+114
-7
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+114
-7
lines changed

AerialNavigation/drone_3d_trajectory_following/Quadrotor.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import numpy as np
99
import matplotlib.pyplot as plt
1010

11-
1211
class Quadrotor():
1312
def __init__(self, x=0, y=0, z=0, roll=0, pitch=0, yaw=0, size=0.25, show_animation=True):
1413
self.p1 = np.array([size / 2, 0, 0, 1]).T
@@ -24,6 +23,9 @@ def __init__(self, x=0, y=0, z=0, roll=0, pitch=0, yaw=0, size=0.25, show_animat
2423
if self.show_animation:
2524
plt.ion()
2625
fig = plt.figure()
26+
fig.canvas.mpl_connect('key_release_event',
27+
lambda event: [exit(0) if event.key == 'escape' else None])
28+
2729
self.ax = fig.add_subplot(111, projection='3d')
2830

2931
self.update_pose(x, y, z, roll, pitch, yaw)
@@ -81,4 +83,4 @@ def plot(self): # pragma: no cover
8183
plt.ylim(-5, 5)
8284
self.ax.set_zlim(0, 10)
8385

84-
plt.pause(0.001)
86+
plt.pause(0.001)

AerialNavigation/rocket_powered_landing/rocket_powered_landing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,8 @@ def plot_animation(X, U): # pragma: no cover
567567

568568
fig = plt.figure()
569569
ax = fig.gca(projection='3d')
570+
rig.canvas.mpl_connect('key_release_event',
571+
lambda event: [exit(0) if event.key == 'escape' else None])
570572

571573
for k in range(K):
572574
plt.cla()

ArmNavigation/arm_obstacle_navigation/arm_obstacle_navigation.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ def astar_torus(grid, start_node, goal_node):
162162
for i in range(1, len(route)):
163163
grid[route[i]] = 6
164164
plt.cla()
165+
plt.gcf().canvas.mpl_connect('key_release_event',
166+
lambda event: [exit(0) if event.key == 'escape' else None])
165167
plt.imshow(grid, cmap=cmap, norm=norm, interpolation=None)
166168
plt.show()
167169
plt.pause(1e-2)
@@ -262,4 +264,4 @@ def plot(self, obstacles=[]): # pragma: no cover
262264

263265

264266
if __name__ == '__main__':
265-
main()
267+
main()

ArmNavigation/arm_obstacle_navigation/arm_obstacle_navigation_2.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ def astar_torus(grid, start_node, goal_node):
193193
for i in range(1, len(route)):
194194
grid[route[i]] = 6
195195
plt.cla()
196+
plt.gcf().canvas.mpl_connect('key_release_event',
197+
lambda event: [exit(0) if event.key == 'escape' else None])
196198
plt.imshow(grid, cmap=cmap, norm=norm, interpolation=None)
197199
plt.show()
198200
plt.pause(1e-2)

ArmNavigation/n_joint_arm_to_point_control/NLinkArm.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ def update_points(self):
5151

5252
def plot(self): # pragma: no cover
5353
plt.cla()
54+
plt.gcf().canvas.mpl_connect('key_release_event',
55+
lambda event: [exit(0) if event.key == 'escape' else None])
5456

5557
for i in range(self.n_links + 1):
5658
if i is not self.n_links:

ArmNavigation/two_joint_arm_to_point_control/two_joint_arm_to_point_control.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ def animation():
114114
def main(): # pragma: no cover
115115
fig = plt.figure()
116116
fig.canvas.mpl_connect("button_press_event", click)
117+
fig.canvas.mpl_connect('key_release_event',
118+
lambda event: [exit(0) if event.key == 'escape' else None])
117119
two_joint_arm()
118120

119121

Bipedal/bipedal_planner/bipedal_planner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ def walk(self, T_sup=0.8, z_c=0.8, a=10, b=1, plot=False):
111111
if c > len(com_trajectory_for_plot):
112112
# set up plotter
113113
plt.cla()
114+
plt.gcf().canvas.mpl_connect('key_release_event',
115+
lambda event: [exit(0) if event.key == 'escape' else None])
114116
ax.set_zlim(0, z_c * 2)
115117
ax.set_aspect('equal', 'datalim')
116118

Localization/ensemble_kalman_filter/ensemble_kalman_filter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def main():
213213

214214
if show_animation:
215215
plt.cla()
216+
plt.gcf().canvas.mpl_connect('key_release_event',
217+
lambda event: [exit(0) if event.key == 'escape' else None])
216218

217219
for i in range(len(z[:, 0])):
218220
plt.plot([xTrue[0, 0], z[i, 2]], [xTrue[1, 0], z[i, 3]], "-k")

Localization/extended_kalman_filter/extended_kalman_filter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ def main():
191191

192192
if show_animation:
193193
plt.cla()
194+
plt.gcf().canvas.mpl_connect('key_release_event',
195+
lambda event: [exit(0) if event.key == 'escape' else None])
194196
plt.plot(hz[0, :], hz[1, :], ".g")
195197
plt.plot(hxTrue[0, :].flatten(),
196198
hxTrue[1, :].flatten(), "-b")

Localization/histogram_filter/histogram_filter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ def main():
233233

234234
if show_animation:
235235
plt.cla()
236+
plt.gcf().canvas.mpl_connect('key_release_event',
237+
lambda event: [exit(0) if event.key == 'escape' else None])
236238
draw_heat_map(grid_map.data, mx, my)
237239
plt.plot(xTrue[0, :], xTrue[1, :], "xr")
238240
plt.plot(RF_ID[:, 0], RF_ID[:, 1], ".k")

Localization/particle_filter/particle_filter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ def main():
230230

231231
if show_animation:
232232
plt.cla()
233+
plt.gcf().canvas.mpl_connect('key_release_event',
234+
lambda event: [exit(0) if event.key == 'escape' else None])
233235

234236
for i in range(len(z[:, 0])):
235237
plt.plot([xTrue[0, 0], z[i, 1]], [xTrue[1, 0], z[i, 2]], "-k")

Localization/unscented_kalman_filter/unscented_kalman_filter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ def main():
240240

241241
if show_animation:
242242
plt.cla()
243+
plt.gcf().canvas.mpl_connect('key_release_event',
244+
lambda event: [exit(0) if event.key == 'escape' else None])
243245
plt.plot(hz[0, :], hz[1, :], ".g")
244246
plt.plot(np.array(hxTrue[0, :]).flatten(),
245247
np.array(hxTrue[1, :]).flatten(), "-b")

Mapping/circle_fitting/circle_fitting.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ def main():
124124

125125
if show_animation: # pragma: no cover
126126
plt.cla()
127+
plt.gcf().canvas.mpl_connect('key_release_event',
128+
lambda event: [exit(0) if event.key == 'escape' else None])
127129
plt.axis("equal")
128130
plt.plot(0.0, 0.0, "*r")
129131
plot_circle(cx, cy, cr)

Mapping/gaussian_grid_map/gaussian_grid_map.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ def main():
7373

7474
if show_animation: # pragma: no cover
7575
plt.cla()
76+
plt.gcf().canvas.mpl_connect('key_release_event',
77+
lambda event: [exit(0) if event.key == 'escape' else None])
7678
draw_heatmap(gmap, minx, maxx, miny, maxy, xyreso)
7779
plt.plot(ox, oy, "xr")
7880
plt.plot(0.0, 0.0, "ob")

Mapping/kmeans_clustering/kmeans_clustering.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ def main():
163163
# for animation
164164
if show_animation: # pragma: no cover
165165
plt.cla()
166+
plt.gcf().canvas.mpl_connect('key_release_event',
167+
lambda event: [exit(0) if event.key == 'escape' else None])
166168
inds = calc_association(cx, cy, clusters)
167169
for ic in inds:
168170
x, y = calc_labeled_points(ic, clusters)

Mapping/raycasting_grid_map/raycasting_grid_map.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ def main():
124124

125125
if show_animation: # pragma: no cover
126126
plt.cla()
127+
plt.gcf().canvas.mpl_connect('key_release_event',
128+
lambda event: [exit(0) if event.key == 'escape' else None])
127129
draw_heatmap(pmap, minx, maxx, miny, maxy, xyreso)
128130
plt.plot(ox, oy, "xr")
129131
plt.plot(0.0, 0.0, "ob")

Mapping/rectangle_fitting/rectangle_fitting.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ def main():
242242

243243
if show_animation: # pragma: no cover
244244
plt.cla()
245+
plt.gcf().canvas.mpl_connect('key_release_event',
246+
lambda event: [exit(0) if event.key == 'escape' else None])
245247
plt.axis("equal")
246248
plt.plot(0.0, 0.0, "*r")
247249
v1.plot()

PathPlanning/AStar/a_star.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ def planning(self, sx, sy, gx, gy):
7979
if show_animation: # pragma: no cover
8080
plt.plot(self.calc_grid_position(current.x, self.minx),
8181
self.calc_grid_position(current.y, self.miny), "xc")
82+
plt.gcf().canvas.mpl_connect('key_release_event',
83+
lambda event: [exit(0) if event.key == 'escape' else None])
8284
if len(closed_set.keys()) % 10 == 0:
8385
plt.pause(0.001)
8486

PathPlanning/BatchInformedRRTStar/batch_informed_rrtstar.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,8 @@ def update_graph(self):
534534
def draw_graph(self, xCenter=None, cBest=None, cMin=None, etheta=None,
535535
samples=None, start=None, end=None):
536536
plt.clf()
537+
plt.gcf().canvas.mpl_connect('key_release_event',
538+
lambda event: [exit(0) if event.key == 'escape' else None])
537539
for rnd in samples:
538540
if rnd is not None:
539541
plt.plot(rnd[0], rnd[1], "^k")

PathPlanning/ClosedLoopRRTStar/pure_pursuit.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ def closed_loop_prediction(cx, cy, cyaw, speed_profile, goal):
135135

136136
if target_ind % 1 == 0 and animation: # pragma: no cover
137137
plt.cla()
138+
plt.gcf().canvas.mpl_connect('key_release_event',
139+
lambda event: [exit(0) if event.key == 'escape' else None])
138140
plt.plot(cx, cy, "-r", label="course")
139141
plt.plot(x, y, "ob", label="trajectory")
140142
plt.plot(cx[target_ind], cy[target_ind], "xg", label="target")

PathPlanning/Dijkstra/dijkstra.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ def planning(self, sx, sy, gx, gy):
6969
if show_animation: # pragma: no cover
7070
plt.plot(self.calc_position(current.x, self.minx),
7171
self.calc_position(current.y, self.miny), "xc")
72+
plt.gcf().canvas.mpl_connect('key_release_event',
73+
lambda event: [exit(0) if event.key == 'escape' else None])
7274
if len(closedset.keys()) % 10 == 0:
7375
plt.pause(0.001)
7476

PathPlanning/DubinsPath/dubins_path_planning.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,8 @@ def test():
318318

319319
if show_animation:
320320
plt.cla()
321+
plt.gcf().canvas.mpl_connect('key_release_event',
322+
lambda event: [exit(0) if event.key == 'escape' else None])
321323
plt.plot(px, py, label="final course " + str(mode))
322324

323325
# plotting

PathPlanning/DynamicWindowApproach/dynamic_window_approach.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ def main(gx=10.0, gy=10.0, robot_type=RobotType.circle):
268268

269269
if show_animation:
270270
plt.cla()
271+
plt.gcf().canvas.mpl_connect('key_release_event',
272+
lambda event: [exit(0) if event.key == 'escape' else None])
271273
plt.plot(predicted_trajectory[:, 0], predicted_trajectory[:, 1], "-g")
272274
plt.plot(x[0], x[1], "xr")
273275
plt.plot(goal[0], goal[1], "xb")

PathPlanning/Eta3SplinePath/eta3_spline_path.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def test1():
213213
if show_animation:
214214
# plot the path
215215
plt.plot(pos[0, :], pos[1, :])
216+
plt.gcf().canvas.mpl_connect('key_release_event',
217+
lambda event: [exit(0) if event.key == 'escape' else None])
216218
plt.pause(1.0)
217219

218220
if show_animation:

PathPlanning/FrenetOptimalTrajectory/frenet_optimal_trajectory.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@ def main():
347347

348348
if show_animation: # pragma: no cover
349349
plt.cla()
350+
plt.gcf().canvas.mpl_connect('key_release_event',
351+
lambda event: [exit(0) if event.key == 'escape' else None])
350352
plt.plot(tx, ty)
351353
plt.plot(ob[:, 0], ob[:, 1], "xk")
352354
plt.plot(path.x[1:], path.y[1:], "-or")

PathPlanning/GridBasedSweepCPP/grid_based_sweep_coverage_path_planner.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def sweep_path_search(sweep_searcher, gmap, grid_search_animation=False):
213213

214214
if grid_search_animation:
215215
fig, ax = plt.subplots()
216+
fig.canvas.mpl_connect('key_release_event',
217+
lambda event: [exit(0) if event.key == 'escape' else None])
216218

217219
while True:
218220
cxind, cyind = sweep_searcher.move_target_grid(cxind, cyind, gmap)
@@ -266,6 +268,8 @@ def planning_animation(ox, oy, reso): # pragma: no cover
266268
if do_animation:
267269
for ipx, ipy in zip(px, py):
268270
plt.cla()
271+
plt.gcf().canvas.mpl_connect('key_release_event',
272+
lambda event: [exit(0) if event.key == 'escape' else None])
269273
plt.plot(ox, oy, "-xb")
270274
plt.plot(px, py, "-r")
271275
plt.plot(ipx, ipy, "or")

PathPlanning/HybridAStar/a_star.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ def dp_planning(sx, sy, gx, gy, ox, oy, reso, rr):
7878
# show graph
7979
if show_animation: # pragma: no cover
8080
plt.plot(current.x * reso, current.y * reso, "xc")
81+
plt.gcf().canvas.mpl_connect('key_release_event',
82+
lambda event: [exit(0) if event.key == 'escape' else None])
8183
if len(closedset.keys()) % 10 == 0:
8284
plt.pause(0.001)
8385

@@ -228,4 +230,4 @@ def main():
228230

229231
if __name__ == '__main__':
230232
show_animation = True
231-
main()
233+
main()

PathPlanning/HybridAStar/hybrid_a_star.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ def hybrid_a_star_planning(start, goal, ox, oy, xyreso, yawreso):
327327

328328
if show_animation: # pragma: no cover
329329
plt.plot(current.xlist[-1], current.ylist[-1], "xc")
330+
plt.gcf().canvas.mpl_connect('key_release_event',
331+
lambda event: [exit(0) if event.key == 'escape' else None])
330332
if len(closedList.keys()) % 10 == 0:
331333
plt.pause(0.001)
332334

PathPlanning/InformedRRTStar/informed_rrt_star.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,9 @@ def get_final_course(self, lastIndex):
266266
return path
267267

268268
def draw_graph(self, xCenter=None, cBest=None, cMin=None, etheta=None, rnd=None):
269-
270269
plt.clf()
270+
plt.gcf().canvas.mpl_connect('key_release_event',
271+
lambda event: [exit(0) if event.key == 'escape' else None])
271272
if rnd is not None:
272273
plt.plot(rnd[0], rnd[1], "^k")
273274
if cBest != float('inf'):

PathPlanning/LQRPlanner/LQRplanner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ def lqr_planning(self, sx, sy, gx, gy, show_animation=True):
5454

5555
# animation
5656
if show_animation: # pragma: no cover
57+
plt.gcf().canvas.mpl_connect('key_release_event',
58+
lambda event: [exit(0) if event.key == 'escape' else None])
5759
plt.plot(sx, sy, "or")
5860
plt.plot(gx, gy, "ob")
5961
plt.plot(rx, ry, "-r")

PathPlanning/LQRRRTStar/lqr_rrt_star.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ def planning(self, animation=True, search_until_max_iter=True):
102102

103103
def draw_graph(self, rnd=None):
104104
plt.clf()
105+
plt.gcf().canvas.mpl_connect('key_release_event',
106+
lambda event: [exit(0) if event.key == 'escape' else None])
105107
if rnd is not None:
106108
plt.plot(rnd.x, rnd.y, "^k")
107109
for node in self.node_list:

PathPlanning/PotentialFieldPlanning/potential_field_planning.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ def potential_field_planning(sx, sy, gx, gy, ox, oy, reso, rr):
9898

9999
if show_animation:
100100
draw_heatmap(pmap)
101+
plt.gcf().canvas.mpl_connect('key_release_event',
102+
lambda event: [exit(0) if event.key == 'escape' else None])
101103
plt.plot(ix, iy, "*k")
102104
plt.plot(gix, giy, "*m")
103105

PathPlanning/ProbabilisticRoadMap/probabilistic_road_map.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ def dijkstra_planning(sx, sy, gx, gy, ox, oy, rr, road_map, sample_x, sample_y):
194194

195195
# show graph
196196
if show_animation and len(closedset.keys()) % 2 == 0:
197+
plt.gcf().canvas.mpl_connect('key_release_event',
198+
lambda event: [exit(0) if event.key == 'escape' else None])
197199
plt.plot(current.x, current.y, "xg")
198200
plt.pause(0.001)
199201

PathPlanning/QuinticPolynomialsPlanner/quintic_polynomials_planner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ def quintic_polynomials_planner(sx, sy, syaw, sv, sa, gx, gy, gyaw, gv, ga, max_
151151
if show_animation: # pragma: no cover
152152
for i, _ in enumerate(time):
153153
plt.cla()
154+
plt.gcf().canvas.mpl_connect('key_release_event',
155+
lambda event: [exit(0) if event.key == 'escape' else None])
154156
plt.grid(True)
155157
plt.axis("equal")
156158
plot_arrow(sx, sy, syaw)

PathPlanning/RRT/rrt.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ def get_random_node(self):
138138

139139
def draw_graph(self, rnd=None):
140140
plt.clf()
141+
plt.gcf().canvas.mpl_connect('key_release_event',
142+
lambda event: [exit(0) if event.key == 'escape' else None])
141143
if rnd is not None:
142144
plt.plot(rnd.x, rnd.y, "^k")
143145
for node in self.node_list:

PathPlanning/RRTDubins/rrt_dubins.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ def planning(self, animation=True, search_until_max_iter=True):
106106

107107
def draw_graph(self, rnd=None): # pragma: no cover
108108
plt.clf()
109+
plt.gcf().canvas.mpl_connect('key_release_event',
110+
lambda event: [exit(0) if event.key == 'escape' else None])
109111
if rnd is not None:
110112
plt.plot(rnd.x, rnd.y, "^k")
111113
for node in self.node_list:

PathPlanning/RRTStarDubins/rrt_star_dubins.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ def planning(self, animation=True, search_until_max_iter=True):
112112

113113
def draw_graph(self, rnd=None):
114114
plt.clf()
115+
plt.gcf().canvas.mpl_connect('key_release_event',
116+
lambda event: [exit(0) if event.key == 'escape' else None])
115117
if rnd is not None:
116118
plt.plot(rnd.x, rnd.y, "^k")
117119
for node in self.node_list:

PathPlanning/RRTStarReedsShepp/rrt_star_reeds_shepp.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ def try_goal_path(self, node):
122122

123123
def draw_graph(self, rnd=None):
124124
plt.clf()
125+
plt.gcf().canvas.mpl_connect('key_release_event',
126+
lambda event: [exit(0) if event.key == 'escape' else None])
125127
if rnd is not None:
126128
plt.plot(rnd.x, rnd.y, "^k")
127129
for node in self.node_list:

PathPlanning/ReedsSheppPath/reeds_shepp_path_planning.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ def test():
395395

396396
if show_animation: # pragma: no cover
397397
plt.cla()
398+
plt.gcf().canvas.mpl_connect('key_release_event',
399+
lambda event: [exit(0) if event.key == 'escape' else None])
398400
plt.plot(px, py, label="final course " + str(mode))
399401

400402
# plotting

0 commit comments

Comments
 (0)