diff options
Diffstat (limited to 'klippy/kinematics/polar.py')
-rw-r--r-- | klippy/kinematics/polar.py | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/klippy/kinematics/polar.py b/klippy/kinematics/polar.py index ffa15d83..cd480a42 100644 --- a/klippy/kinematics/polar.py +++ b/klippy/kinematics/polar.py @@ -6,55 +6,64 @@ import logging, math import stepper + class PolarKinematics: def __init__(self, toolhead, config): # Setup axis steppers - stepper_bed = stepper.PrinterStepper(config.getsection('stepper_bed'), - units_in_radians=True) - rail_arm = stepper.LookupRail(config.getsection('stepper_arm')) - rail_z = stepper.LookupMultiRail(config.getsection('stepper_z')) - stepper_bed.setup_itersolve('polar_stepper_alloc', b'a') - rail_arm.setup_itersolve('polar_stepper_alloc', b'r') - rail_z.setup_itersolve('cartesian_stepper_alloc', b'z') + stepper_bed = stepper.PrinterStepper( + config.getsection("stepper_bed"), units_in_radians=True + ) + rail_arm = stepper.LookupRail(config.getsection("stepper_arm")) + rail_z = stepper.LookupMultiRail(config.getsection("stepper_z")) + stepper_bed.setup_itersolve("polar_stepper_alloc", b"a") + rail_arm.setup_itersolve("polar_stepper_alloc", b"r") + rail_z.setup_itersolve("cartesian_stepper_alloc", b"z") self.rails = [rail_arm, rail_z] - self.steppers = [stepper_bed] + [ s for r in self.rails - for s in r.get_steppers() ] + self.steppers = [stepper_bed] + [ + s for r in self.rails for s in r.get_steppers() + ] for s in self.get_steppers(): s.set_trapq(toolhead.get_trapq()) toolhead.register_step_generator(s.generate_steps) # Setup boundary checks max_velocity, max_accel = toolhead.get_max_velocity() self.max_z_velocity = config.getfloat( - 'max_z_velocity', max_velocity, above=0., maxval=max_velocity) + "max_z_velocity", max_velocity, above=0.0, maxval=max_velocity + ) self.max_z_accel = config.getfloat( - 'max_z_accel', max_accel, above=0., maxval=max_accel) + "max_z_accel", max_accel, above=0.0, maxval=max_accel + ) self.limit_z = (1.0, -1.0) - self.limit_xy2 = -1. + self.limit_xy2 = -1.0 max_xy = self.rails[0].get_range()[1] min_z, max_z = self.rails[1].get_range() - self.axes_min = toolhead.Coord(-max_xy, -max_xy, min_z, 0.) - self.axes_max = toolhead.Coord(max_xy, max_xy, max_z, 0.) + self.axes_min = toolhead.Coord(-max_xy, -max_xy, min_z, 0.0) + self.axes_max = toolhead.Coord(max_xy, max_xy, max_z, 0.0) + def get_steppers(self): return list(self.steppers) + def calc_position(self, stepper_positions): bed_angle = stepper_positions[self.steppers[0].get_name()] arm_pos = stepper_positions[self.rails[0].get_name()] z_pos = stepper_positions[self.rails[1].get_name()] - return [math.cos(bed_angle) * arm_pos, math.sin(bed_angle) * arm_pos, - z_pos] + return [math.cos(bed_angle) * arm_pos, math.sin(bed_angle) * arm_pos, z_pos] + def set_position(self, newpos, homing_axes): for s in self.steppers: s.set_position(newpos) if "z" in homing_axes: self.limit_z = self.rails[1].get_range() if "x" in homing_axes and "y" in homing_axes: - self.limit_xy2 = self.rails[0].get_range()[1]**2 + self.limit_xy2 = self.rails[0].get_range()[1] ** 2 + def clear_homing_state(self, clear_axes): if "x" in clear_axes or "y" in clear_axes: # X and Y cannot be cleared separately - self.limit_xy2 = -1. + self.limit_xy2 = -1.0 if "z" in clear_axes: self.limit_z = (1.0, -1.0) + def _home_axis(self, homing_state, axis, rail): # Determine movement position_min, position_max = rail.get_range() @@ -62,7 +71,7 @@ class PolarKinematics: homepos = [None, None, None, None] homepos[axis] = hi.position_endstop if axis == 0: - homepos[1] = 0. + homepos[1] = 0.0 forcepos = list(homepos) if hi.positive_dir: forcepos[axis] -= hi.position_endstop - position_min @@ -70,6 +79,7 @@ class PolarKinematics: forcepos[axis] += position_max - hi.position_endstop # Perform homing homing_state.home_rails([rail], forcepos, homepos) + def home(self, homing_state): # Always home XY together homing_axes = homing_state.get_axes() @@ -86,11 +96,12 @@ class PolarKinematics: self._home_axis(homing_state, 0, self.rails[0]) if home_z: self._home_axis(homing_state, 2, self.rails[1]) + def check_move(self, move): end_pos = move.end_pos - xy2 = end_pos[0]**2 + end_pos[1]**2 + xy2 = end_pos[0] ** 2 + end_pos[1] ** 2 if xy2 > self.limit_xy2: - if self.limit_xy2 < 0.: + if self.limit_xy2 < 0.0: raise move.move_error("Must home axis first") raise move.move_error() if move.axes_d[2]: @@ -100,16 +111,17 @@ class PolarKinematics: raise move.move_error() # Move with Z - update velocity and accel for slower Z axis z_ratio = move.move_d / abs(move.axes_d[2]) - move.limit_speed(self.max_z_velocity * z_ratio, - self.max_z_accel * z_ratio) + move.limit_speed(self.max_z_velocity * z_ratio, self.max_z_accel * z_ratio) + def get_status(self, eventtime): - xy_home = "xy" if self.limit_xy2 >= 0. else "" + xy_home = "xy" if self.limit_xy2 >= 0.0 else "" z_home = "z" if self.limit_z[0] <= self.limit_z[1] else "" return { - 'homed_axes': xy_home + z_home, - 'axis_minimum': self.axes_min, - 'axis_maximum': self.axes_max, + "homed_axes": xy_home + z_home, + "axis_minimum": self.axes_min, + "axis_maximum": self.axes_max, } + def load_kinematics(toolhead, config): return PolarKinematics(toolhead, config) |