z_tilt: Support retries

Support retrying Z_TILT_ADJUST a configurable number of times
to a configurable tolerance both in the config or as parameters.

- By default keeps original behavior of no retries.
- Adds parameters RETRIES and RETRY_TOLERANCE to QUAD_GANTRY_LEVEL gcode.
- adds config options retries and retry_tolerance to uad_gantry_level]
- issues an error if we are getting worse intead of approaching tolerance
- issues an error if retries were requested but we did not reach the tolerance
in the specified number of retries

the minimum change should  be a single z step for those
probing 2 points for 2 stepper motors and 3 for 3 stepper motors.

at one point it was suggested to use the amount of z adjustment instead of the
range of the probed points as a trigger for retry. I've chosen not to do this.
using z adustment in these cases means the minimum unit of change is related to
the angle created by the probed points  and the distance to stepper motor and
can be more than a couple steps which is rather unintuitive.

for the case when someone is using more probed points than z steppers the
probed points range will have some fixed minimum value that can't be reduced
which is also unintuitive but that case should idealy be the rarer case, and
the user can learn to set a higher tolerance that matches their probing setup.

Signed-off-by: John "Fess" Fessenden <fess@fess.org>
This commit is contained in:
fess 2019-06-17 19:44:09 -07:00 committed by KevinOConnor
parent bd40690bd1
commit 49c36f868b
2 changed files with 12 additions and 0 deletions

View File

@ -310,6 +310,15 @@
#horizontal_move_z: 5 #horizontal_move_z: 5
# The height (in mm) that the head should be commanded to move to # The height (in mm) that the head should be commanded to move to
# just prior to starting a probe operation. The default is 5. # just prior to starting a probe operation. The default is 5.
#retries: 0
# Number of times to retry if the probed points aren't within tolerance
#retry_tolerance: 0
# if retries are enabled then retry if largest and smallest probed points
# differ more than retry_tolerance.
# Note the smallest unit of change here would be a single step. However if you
# are probing more points than steppers then you will likely have a fixed
# minimum value for the range of probed points which you can learn by observing
# command output.
# Moving gantry leveling using 4 independently controlled Z motors. # Moving gantry leveling using 4 independently controlled Z motors.

View File

@ -117,6 +117,7 @@ class ZTilt:
except: except:
raise config.error("Unable to parse z_positions in %s" % ( raise config.error("Unable to parse z_positions in %s" % (
config.get_name())) config.get_name()))
self.retry_helper = RetryHelper(config)
self.probe_helper = probe.ProbePointsHelper(config, self.probe_finalize) self.probe_helper = probe.ProbePointsHelper(config, self.probe_finalize)
self.probe_helper.minimum_points(2) self.probe_helper.minimum_points(2)
self.z_helper = ZAdjustHelper(config, len(self.z_positions)) self.z_helper = ZAdjustHelper(config, len(self.z_positions))
@ -126,6 +127,7 @@ class ZTilt:
desc=self.cmd_Z_TILT_ADJUST_help) desc=self.cmd_Z_TILT_ADJUST_help)
cmd_Z_TILT_ADJUST_help = "Adjust the Z tilt" cmd_Z_TILT_ADJUST_help = "Adjust the Z tilt"
def cmd_Z_TILT_ADJUST(self, params): def cmd_Z_TILT_ADJUST(self, params):
self.retry_helper.start(params)
self.probe_helper.start_probe(params) self.probe_helper.start_probe(params)
def probe_finalize(self, offsets, positions): def probe_finalize(self, offsets, positions):
# Setup for coordinate descent analysis # Setup for coordinate descent analysis
@ -154,6 +156,7 @@ class ZTilt:
adjustments = [x*x_adjust + y*y_adjust + z_adjust adjustments = [x*x_adjust + y*y_adjust + z_adjust
for x, y in self.z_positions] for x, y in self.z_positions]
self.z_helper.adjust_steppers(adjustments, speed) self.z_helper.adjust_steppers(adjustments, speed)
return self.retry_helper.check_retry([p[2] for p in positions])
def load_config(config): def load_config(config):
return ZTilt(config) return ZTilt(config)