Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 1 | import gi |
| 2 | gi.require_version('Gtk', '3.0') |
| 3 | from gi.repository import Gtk |
| 4 | import numpy as np |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 5 | from points import Points |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 6 | from libspline import Spline, DistanceSpline, Trajectory |
| 7 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 8 | from matplotlib.backends.backend_gtk3agg import (FigureCanvasGTK3Agg as |
| 9 | FigureCanvas) |
| 10 | from matplotlib.figure import Figure |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 11 | |
| 12 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 13 | class Graph(Gtk.Bin): |
| 14 | def __init__(self): |
| 15 | super(Graph, self).__init__() |
| 16 | fig = Figure(figsize=(5, 4), dpi=100) |
| 17 | self.axis = fig.add_subplot(111) |
| 18 | canvas = FigureCanvas(fig) # a Gtk.DrawingArea |
| 19 | canvas.set_vexpand(True) |
| 20 | canvas.set_size_request(800, 250) |
| 21 | self.add(canvas) |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 22 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 23 | def recalculate_graph(self, points): |
| 24 | if not points.getLibsplines(): return |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 25 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 26 | # set the size of a timestep |
| 27 | dt = 0.00505 |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 28 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 29 | # call C++ wrappers to calculate the trajectory |
| 30 | distanceSpline = DistanceSpline(points.getLibsplines()) |
| 31 | traj = Trajectory(distanceSpline) |
| 32 | points.addConstraintsToTrajectory(traj) |
| 33 | traj.Plan() |
| 34 | XVA = traj.GetPlanXVA(dt) |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 35 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 36 | # extract values to be graphed |
| 37 | total_steps_taken = XVA.shape[1] |
| 38 | total_time = dt * total_steps_taken |
| 39 | time = np.arange(total_time, step=dt) |
| 40 | position, velocity, acceleration = XVA |
| 41 | left_voltage, right_voltage = zip(*(traj.Voltage(x) for x in position)) |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 42 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 43 | # update graph |
| 44 | self.axis.clear() |
| 45 | self.axis.plot(time, velocity) |
| 46 | self.axis.plot(time, acceleration) |
| 47 | self.axis.plot(time, left_voltage) |
| 48 | self.axis.plot(time, right_voltage) |
| 49 | self.axis.legend( |
| 50 | ["Velocity", "Acceleration", "Left Voltage", "Right Voltage"]) |
| 51 | self.axis.xaxis.set_label_text("Time (sec)") |
John Park | 91e6973 | 2019-03-03 13:12:43 -0800 | [diff] [blame] | 52 | |
Ravago Jones | 6d460fe | 2021-07-03 16:59:55 -0700 | [diff] [blame] | 53 | # renumber the x-axis to include the last point, |
| 54 | # the total time to drive the spline |
| 55 | self.axis.xaxis.set_ticks(np.linspace(0, total_time, num=8)) |
Ravago Jones | 128fb99 | 2021-07-31 13:56:58 -0700 | [diff] [blame^] | 56 | |
| 57 | self.queue_draw() |