aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/kinematics/polar.py
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/kinematics/polar.py')
-rw-r--r--klippy/kinematics/polar.py66
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)