diff options
Diffstat (limited to 'scripts/graph_extruder.py')
-rwxr-xr-x | scripts/graph_extruder.py | 131 |
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() |