blob: 9ba87abfe4c5abfa1694a0f157895c9928474730 [file] [log] [blame]
John Park91e69732019-03-03 13:12:43 -08001from constants import *
2import cairo
3from color import Color, palette
4from points import Points
5from drawing_constants import *
6from libspline import Spline, DistanceSpline, Trajectory
7
8AXIS_MARGIN_SPACE = 40
9
10
11class Graph(): # (TODO): Remove Computer Calculation
12 def __init__(self, cr, mypoints):
13 # Background Box
14 set_color(cr, palette["WHITE"])
15 cr.rectangle(-1.0 * SCREEN_SIZE, -0.5 * SCREEN_SIZE, SCREEN_SIZE,
16 SCREEN_SIZE * 0.6)
17 cr.fill()
18
19 cr.set_source_rgb(0, 0, 0)
20 cr.rectangle(-1.0 * SCREEN_SIZE, -0.5 * SCREEN_SIZE, SCREEN_SIZE,
21 SCREEN_SIZE * 0.6)
22 #Axis
23 cr.move_to(-1.0 * SCREEN_SIZE + AXIS_MARGIN_SPACE,
24 -0.5 * SCREEN_SIZE + AXIS_MARGIN_SPACE) # Y
25 cr.line_to(-1.0 * SCREEN_SIZE + AXIS_MARGIN_SPACE,
26 0.1 * SCREEN_SIZE - 10)
27
28 cr.move_to(-1.0 * SCREEN_SIZE + AXIS_MARGIN_SPACE,
29 -0.5 * SCREEN_SIZE + AXIS_MARGIN_SPACE) # X
30 cr.line_to(-10, -0.5 * SCREEN_SIZE + AXIS_MARGIN_SPACE)
31 cr.stroke()
32
33 skip = 2
34 dT = 0.00505
35 start = AXIS_MARGIN_SPACE - SCREEN_SIZE
36 end = -2.0 * AXIS_MARGIN_SPACE
37 height = 0.5 * (SCREEN_SIZE) - AXIS_MARGIN_SPACE
38 zero = AXIS_MARGIN_SPACE - SCREEN_SIZE / 2.0
39 if mypoints.getLibsplines():
40 distanceSpline = DistanceSpline(mypoints.getLibsplines())
41 traj = Trajectory(distanceSpline)
Ravago Jones3b92afa2021-02-05 14:27:32 -080042 mypoints.addConstraintsToTrajectory(traj)
John Park91e69732019-03-03 13:12:43 -080043 traj.Plan()
44 XVA = traj.GetPlanXVA(dT)
James Kuszmaul4d3c2642020-03-05 07:32:39 -080045 if len(XVA[0]) > 0:
Ravago Jones26f7ad02021-02-05 15:45:59 -080046 self.draw_x_axis(cr, start, height, zero, XVA, end)
47 self.drawVelocity(cr, XVA, start, height, skip, zero, end)
48 self.drawAcceleration(cr, XVA, start, height, skip, zero,
49 AXIS_MARGIN_SPACE, end)
50 self.drawVoltage(cr, XVA, start, height, skip, traj, zero, end)
51 cr.set_source_rgb(0, 0, 0)
52 cr.move_to(-1.0 * AXIS_MARGIN_SPACE, zero + height / 2.0)
53 cr.line_to(AXIS_MARGIN_SPACE - SCREEN_SIZE,
54 zero + height / 2.0)
John Park91e69732019-03-03 13:12:43 -080055 cr.stroke()
56
57 def connectLines(self, cr, points, color):
58 for i in range(0, len(points) - 1):
59 set_color(cr, color)
60 cr.move_to(points[i][0], points[i][1])
61 cr.line_to(points[i + 1][0], points[i + 1][1])
62 cr.stroke()
63
64 def draw_x_axis(self, cr, start, height, zero, xva, end):
65 total_time = 0.00505 * len(xva[0])
66 for k in np.linspace(0, 1, 11):
67 self.tickMark(cr,
68 k * np.abs(start - end) + start, zero + height / 2.0,
69 10, palette["BLACK"])
70 cr.move_to(k * np.abs(start - end) + start,
71 10 + zero + height / 2.0)
72 txt_scale = SCREEN_SIZE / 1000.0
73 display_text(cr, str(round(k * total_time, 3)), txt_scale,
74 txt_scale, 1.0 / txt_scale, 1.0 / txt_scale)
75 cr.stroke()
76
77 def tickMark(self, cr, x, y, height, COLOR):
78 # X, Y is in the middle of the tick mark
79 set_color(cr, COLOR)
80 cr.move_to(x, y + (height / 2))
81 cr.line_to(x, y - (height / 2))
82 cr.stroke()
83
84 def HtickMark(self, cr, x, y, width, COLOR):
85 # X, Y is in the middle of the tick mark
86 set_color(cr, COLOR)
87 cr.move_to(x + (width / 2), y)
88 cr.line_to(x - (width / 2), y)
89 cr.stroke()
90
91 def drawVelocity(self, cr, xva, start, height, skip, zero, end):
92 COLOR = palette["RED"]
93 velocity = xva[1]
94 n_timesteps = len(velocity)
95 max_v = np.amax(velocity)
96 spacing = np.abs(start - end) / float(n_timesteps)
97 scaler = height / max_v
98 cr.set_source_rgb(1, 0, 0)
99 points = []
100 for i in range(0, len(velocity)):
101 if i % skip == 0:
102 points.append([
103 start + (i * spacing),
104 zero + height / 2.0 + (velocity[i] * scaler / 2.0)
105 ])
106 self.connectLines(cr, points, COLOR)
107
108 # draw axes marking
109 for i in np.linspace(-1, 1, 11):
110 self.HtickMark(cr, start, zero + i * height / 2.0 + height / 2.0,
111 10, palette["BLACK"])
112 cr.set_source_rgb(1, 0, 0)
113 cr.move_to(start + 5, zero + i * height / 2.0 + height / 2.0)
114 txt_scale = SCREEN_SIZE / 1000.0
115 display_text(cr, str(round(i * max_v, 2)), txt_scale, txt_scale,
116 1.0 / txt_scale, 1.0 / txt_scale)
117 cr.stroke()
118
119 def drawAcceleration(self, cr, xva, start, height, skip, zero, margin,
120 end):
121 COLOR = palette["BLUE"]
122 accel = xva[2]
123 max_a = np.amax(accel)
124 min_a = np.amin(accel)
125 n_timesteps = len(accel)
126 spacing = np.abs(start - end) / float(n_timesteps)
127 scaler = height / (max_a - min_a)
128 cr.set_source_rgb(1, 0, 0)
129 points = []
130 for i in range(0, len(accel)):
131 if i % skip == 0:
132 points.append([
133 start + (i * spacing), zero + ((accel[i] - min_a) * scaler)
134 ])
135 self.connectLines(cr, points, COLOR)
136
137 # draw axes marking
138 for i in np.linspace(0, 1, 11):
139 self.HtickMark(cr, -1.5 * margin, zero + i * height, 10,
140 palette["BLACK"])
141 cr.set_source_rgb(0, 0, 1)
142 cr.move_to(-1.2 * margin, zero + i * height)
143 txt_scale = SCREEN_SIZE / 1000.0
144 display_text(cr, str(round(i * (max_a - min_a) + min_a,
145 2)), txt_scale, txt_scale,
146 1.0 / txt_scale, 1.0 / txt_scale)
147 cr.stroke()
148
149 def drawVoltage(self, cr, xva, start, height, skip, traj, zero, end):
150 COLOR1 = palette["GREEN"]
151 COLOR2 = palette["CYAN"]
152 poses = xva[0]
153 n_timesteps = len(poses)
154 spacing = np.abs(start - end) / float(n_timesteps)
155 points1 = []
156 points2 = []
157 for i in range(0, len(poses)):
158 if i % skip == 0:
159 voltage = traj.Voltage(poses[i])
160 points1.append([
161 start + (i * spacing),
162 zero + height / 2 + height * (voltage[0] / 24.0)
163 ])
164 points2.append([
165 start + (i * spacing),
166 zero + height / 2 + height * (voltage[1] / 24.0)
167 ])
168 self.connectLines(cr, points1, COLOR1)
169 self.connectLines(cr, points2, COLOR2)
170
171 for i in np.linspace(-1, 1, 7):
172 self.HtickMark(cr, -1.0 * SCREEN_SIZE,
173 zero + i * height / 2.0 + height / 2.0, 10,
174 palette["BLACK"])
175 cr.set_source_rgb(0, 1, 1)
176 cr.move_to(-1.0 * SCREEN_SIZE,
177 zero + i * height / 2.0 + height / 2.0)
178 txt_scale = SCREEN_SIZE / 1000.0
179 display_text(cr, str(round(i * 12.0, 2)), txt_scale, txt_scale,
180 1.0 / txt_scale, 1.0 / txt_scale)
181 cr.stroke()