aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/graph_extruder.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/graph_extruder.py')
-rwxr-xr-xscripts/graph_extruder.py131
1 files changed, 82 insertions, 49 deletions
diff --git a/scripts/graph_extruder.py b/scripts/graph_extruder.py
index 6f31ed3c..7475c6aa 100755
--- a/scripts/graph_extruder.py
+++ b/scripts/graph_extruder.py
@@ -7,8 +7,8 @@
import math, optparse, datetime
import matplotlib
-SEG_TIME = .000100
-INV_SEG_TIME = 1. / SEG_TIME
+SEG_TIME = 0.000100
+INV_SEG_TIME = 1.0 / SEG_TIME
######################################################################
@@ -17,27 +17,32 @@ INV_SEG_TIME = 1. / SEG_TIME
# List of moves: [(start_v, end_v, move_t), ...]
Moves = [
- (0., 0., .100),
- (0., 100., None), (100., 100., .200), (100., 60., None),
- (60., 100., None), (100., 100., .200), (100., 0., None),
- (0., 0., .300)
+ (0.0, 0.0, 0.100),
+ (0.0, 100.0, None),
+ (100.0, 100.0, 0.200),
+ (100.0, 60.0, None),
+ (60.0, 100.0, None),
+ (100.0, 100.0, 0.200),
+ (100.0, 0.0, None),
+ (0.0, 0.0, 0.300),
]
-EXTRUDE_R = (.4 * .4 * .75) / (math.pi * (1.75 / 2.)**2)
-ACCEL = 3000. * EXTRUDE_R
+EXTRUDE_R = (0.4 * 0.4 * 0.75) / (math.pi * (1.75 / 2.0) ** 2)
+ACCEL = 3000.0 * EXTRUDE_R
+
def gen_positions():
out = []
- start_d = start_t = t = 0.
+ start_d = start_t = t = 0.0
for start_v, end_v, move_t in Moves:
start_v *= EXTRUDE_R
end_v *= EXTRUDE_R
if move_t is None:
move_t = abs(end_v - start_v) / ACCEL
- half_accel = 0.
+ half_accel = 0.0
if end_v > start_v:
- half_accel = .5 * ACCEL
+ half_accel = 0.5 * ACCEL
elif start_v > end_v:
- half_accel = -.5 * ACCEL
+ half_accel = -0.5 * ACCEL
end_t = start_t + move_t
while t <= end_t:
rel_t = t - start_t
@@ -54,15 +59,18 @@ def gen_positions():
MARGIN_TIME = 0.050
+
def time_to_index(t):
- return int(t * INV_SEG_TIME + .5)
+ return int(t * INV_SEG_TIME + 0.5)
+
def indexes(positions):
drop = time_to_index(MARGIN_TIME)
- return range(drop, len(positions)-drop)
+ return range(drop, len(positions) - drop)
+
def trim_lists(*lists):
- keep = len(lists[0]) - time_to_index(2. * MARGIN_TIME)
+ keep = len(lists[0]) - time_to_index(2.0 * MARGIN_TIME)
for l in lists:
del l[keep:]
@@ -71,36 +79,42 @@ def trim_lists(*lists):
# Common data filters
######################################################################
+
# Generate estimated first order derivative
def gen_deriv(data):
- return [0.] + [(data[i+1] - data[i]) * INV_SEG_TIME
- for i in range(len(data)-1)]
+ return [0.0] + [
+ (data[i + 1] - data[i]) * INV_SEG_TIME for i in range(len(data) - 1)
+ ]
+
# Simple average between two points smooth_time away
def calc_average(positions, smooth_time):
- offset = time_to_index(smooth_time * .5)
- out = [0.] * len(positions)
+ offset = time_to_index(smooth_time * 0.5)
+ out = [0.0] * len(positions)
for i in indexes(positions):
- out[i] = .5 * (positions[i-offset] + positions[i+offset])
+ out[i] = 0.5 * (positions[i - offset] + positions[i + offset])
return out
+
# Average (via integration) of smooth_time range
def calc_smooth(positions, smooth_time):
- offset = time_to_index(smooth_time * .5)
- weight = 1. / (2*offset - 1)
- out = [0.] * len(positions)
+ offset = time_to_index(smooth_time * 0.5)
+ weight = 1.0 / (2 * offset - 1)
+ out = [0.0] * len(positions)
for i in indexes(positions):
- out[i] = sum(positions[i-offset+1:i+offset]) * weight
+ out[i] = sum(positions[i - offset + 1 : i + offset]) * weight
return out
+
# Time weighted average (via integration) of smooth_time range
def calc_weighted(positions, smooth_time):
- offset = time_to_index(smooth_time * .5)
- weight = 1. / offset**2
- out = [0.] * len(positions)
+ offset = time_to_index(smooth_time * 0.5)
+ weight = 1.0 / offset**2
+ out = [0.0] * len(positions)
for i in indexes(positions):
- weighted_data = [positions[j] * (offset - abs(j-i))
- for j in range(i-offset, i+offset)]
+ weighted_data = [
+ positions[j] * (offset - abs(j - i)) for j in range(i - offset, i + offset)
+ ]
out[i] = sum(weighted_data) * weight
return out
@@ -109,17 +123,19 @@ def calc_weighted(positions, smooth_time):
# Pressure advance
######################################################################
-SMOOTH_TIME = .040
-PRESSURE_ADVANCE = .045
+SMOOTH_TIME = 0.040
+PRESSURE_ADVANCE = 0.045
+
# Calculate raw pressure advance positions
def calc_pa_raw(positions):
pa = PRESSURE_ADVANCE * INV_SEG_TIME
- out = [0.] * len(positions)
+ out = [0.0] * len(positions)
for i in indexes(positions):
- out[i] = positions[i] + pa * (positions[i+1] - positions[i])
+ out[i] = positions[i] + pa * (positions[i + 1] - positions[i])
return out
+
# Pressure advance after smoothing
def calc_pa(positions):
return calc_weighted(calc_pa_raw(positions), SMOOTH_TIME)
@@ -129,6 +145,7 @@ def calc_pa(positions):
# Plotting and startup
######################################################################
+
def plot_motion():
# Nominal motion
positions = gen_positions()
@@ -142,38 +159,53 @@ def plot_motion():
sm_velocities = gen_deriv(sm_positions)
# Build plot
times = [SEG_TIME * i for i in range(len(positions))]
- trim_lists(times, velocities, accels,
- pa_positions, pa_velocities,
- sm_positions, sm_velocities)
+ trim_lists(
+ times,
+ velocities,
+ accels,
+ pa_positions,
+ pa_velocities,
+ sm_positions,
+ sm_velocities,
+ )
fig, ax1 = matplotlib.pyplot.subplots(nrows=1, sharex=True)
ax1.set_title("Extruder Velocity")
- ax1.set_ylabel('Velocity (mm/s)')
- pa_plot, = ax1.plot(times, pa_velocities, 'r',
- label='Pressure Advance', alpha=0.3)
- nom_plot, = ax1.plot(times, velocities, 'black', label='Nominal')
- sm_plot, = ax1.plot(times, sm_velocities, 'g', label='Smooth PA', alpha=0.9)
+ ax1.set_ylabel("Velocity (mm/s)")
+ (pa_plot,) = ax1.plot(
+ times, pa_velocities, "r", label="Pressure Advance", alpha=0.3
+ )
+ (nom_plot,) = ax1.plot(times, velocities, "black", label="Nominal")
+ (sm_plot,) = ax1.plot(times, sm_velocities, "g", label="Smooth PA", alpha=0.9)
fontP = matplotlib.font_manager.FontProperties()
- fontP.set_size('x-small')
- ax1.legend(handles=[nom_plot, pa_plot, sm_plot], loc='best', prop=fontP)
- ax1.set_xlabel('Time (s)')
+ fontP.set_size("x-small")
+ ax1.legend(handles=[nom_plot, pa_plot, sm_plot], loc="best", prop=fontP)
+ ax1.set_xlabel("Time (s)")
ax1.grid(True)
fig.tight_layout()
return fig
+
def setup_matplotlib(output_to_file):
global matplotlib
if output_to_file:
- matplotlib.rcParams.update({'figure.autolayout': True})
- matplotlib.use('Agg')
+ matplotlib.rcParams.update({"figure.autolayout": True})
+ matplotlib.use("Agg")
import matplotlib.pyplot, matplotlib.dates, matplotlib.font_manager
import matplotlib.ticker
+
def main():
# Parse command-line arguments
usage = "%prog [options]"
opts = optparse.OptionParser(usage)
- opts.add_option("-o", "--output", type="string", dest="output",
- default=None, help="filename of output graph")
+ opts.add_option(
+ "-o",
+ "--output",
+ type="string",
+ dest="output",
+ default=None,
+ help="filename of output graph",
+ )
options, args = opts.parse_args()
if len(args) != 0:
opts.error("Incorrect number of arguments")
@@ -189,5 +221,6 @@ def main():
fig.set_size_inches(6, 2.5)
fig.savefig(options.output)
-if __name__ == '__main__':
+
+if __name__ == "__main__":
main()