Hello all
When I issue the command BED_MESH_OUTPUT I get (as expected) the list of probed z values then the list of interpolated poins.
Is it then correct to have a specular view of interpolated points vs. probed? This could be explaining my issues with poor bed mapping.
// Bed Mesh state has been saved to profile [default]
// for the current session. The SAVE_CONFIG command will
// update the printer config file and restart the printer.
// Mesh Leveling Probed Z positions:
// 1.002778 0.920556 0.895833 0.796667 0.641667 0.613333
// 0.925556 1.022500 0.979444 0.916944 0.866944 0.719167
// 0.879722 1.000556 1.068889 1.005000 0.996389 0.851111
// 0.805556 0.935000 1.013611 0.999444 1.011667 0.931389
Mesh X,Y: 6,4
Search Height: 34
Mesh Offsets: X=0.0000, Y=0.0000
Mesh Average: 0.91
Mesh Range: min=0.6133 max=1.0689
Interpolation Algorithm: bicubic
Measured points:
0.805556 0.935000 1.013611 0.999444 1.011667 0.931389
0.879722 1.000556 1.068889 1.005000 0.996389 0.851111
0.925556 1.022500 0.979444 0.916944 0.866944 0.719167
1.002778 0.920556 0.895833 0.796667 0.641667 0.613333
It is a large custom corexy machine (600x400mm) therefore bed mapping is absolutely needed…and to date not working well.
Ok, was thinking it was a quick thing (hoping I was wondering about something usual).
Surprisingly enough, the values shown into the log are quite different from console output.
At this point I pass the hand to more skilled people to tell me what is going on.
Brgds klippy_log.zip (15.5 KB)
The SAVE_CONFIG log entry shows the points as they are stored internally. The first probed point is at (min_x, min_y).
The BED_MESH_OUTPUT command was implemented to be compatible with Marlin / Prusa Firmware at the time, therefore the y-axis is inverted. The first point printed is at (min_x, max_y). The output appears to be a “birds eye” view of the surface, where the origin is at the lower left corner.
Today we have front ends like Mainsail and Fluidd that provide mesh visualization, thus BED_MESH_OUTPUT is rarely used.
Argh.
Was hoping to hear I made some weird configuration mistake, since I am wrestling with Klipper bed meshing but got nowhere near to a workable solution.
Tried
-mapping and using without saving (yes, using BED_MESH_PROFILE LOAD=whonows)
-saving with and without name (default or whonows).
-using “whonows” or whonows
-checking mechanical probe repeatability (range 0.003889,standard deviation 0.000905)
-can’t using axis twist check,since I use a dockable probe
-ramping up sampling resolution (one point every 2mm)
-double checking probe offset and sign (both negative, since it is front-left of extuder)
-checking axis squareness (very good - skew test comes out perfect).
…but result is always the same: squashed on front left corner, in the air mid front side.
Build is very tough, everything is milled/turned from solid metal (no extruded alu profiles).
Using industrial linear guides (no cheap no-names).
Can’t understand why on same machine(s) Marlin success rate is way better on this matter.
Really hope to hear something good soon - at current rate I will be bald soon.
You can just call BED_MESH_CALIBRATE, it writes to the default profile by… default. It also becomes active after the command so you don’t need to call BED_MESH_PROFILE LOAD...
I don’t know what PLATTER_CALIBRATION is and I cant find a source for it. Its some extra that’s not part of core klipper. Can we have a link please?
Hello Sineos
It is a klipper installation running on Repetier server.
All the installation process is handled from the user interface - surely I didn’t alter/touch 118 files!
I began installing version 11, then 12, then latest/greatest (Python3) on Github - always using Repetier Server graphical user interface.
About platter calibration, is a short .py to probe around some reference points to help me understand what is going on. Disabling it it doesnt change things.
from . import probe
import math
class platter_calibration:
def __init__(self, config):
self.printer = config.get_printer()
x_pos_center, y_pos_center = config.getfloatlist("center_xy", count=2)
x_pos_endstop, y_pos_endstop = config.getfloatlist("reference_xy", count=2)
self.center_x_pos, self.center_y_pos = x_pos_center, y_pos_center
self.endstop_x_pos, self.endstop_y_pos = x_pos_endstop, y_pos_endstop
zconfig = config.getsection('stepper_z')
self.max_z = zconfig.getfloat('position_max', note_valid=False)
self.endstop_pin = zconfig.get('endstop_pin')
self.speed = config.getfloat('speed', 50.0, above=0.)
self.opmode = config.getfloat('opmode', 1)
self.gcode = self.printer.lookup_object('gcode')
self.gcode_move = self.printer.lookup_object('gcode_move')
self.gcode.register_command("PLATTER_CALIBRATION", self.cmd_PLATTER_CALIBRATION, desc=self.cmd_PLATTER_CALIBRATION_help)
# check if a probe is installed
if config.has_section("probe"):
probe = config.getsection('probe')
self.x_offset = probe.getfloat('x_offset', note_valid=False)
self.y_offset = probe.getfloat('y_offset', note_valid=False)
def cmd_PLATTER_CALIBRATION(self, gcmd):
paramopmode = gcmd.get_float('OPMODE', default=0)
if paramopmode != 0 :
num_opmode = paramopmode
else:
num_opmode = self.opmode
# check if all axes are homed
toolhead = self.printer.lookup_object('toolhead')
curtime = self.printer.get_reactor().monotonic()
kin_status = toolhead.get_kinematics().get_status(curtime)
probe_obj = self.printer.lookup_object('probe', None)
if ('x' not in kin_status['homed_axes'] or
'y' not in kin_status['homed_axes'] or
'z' not in kin_status['homed_axes']):
raise gcmd.error("You must home X, Y and Z axes first")
gcmd_offset = self.gcode.create_gcode_command("SET_GCODE_OFFSET",
"SET_GCODE_OFFSET",
{'Z': 0})
self.gcode_move.cmd_SET_GCODE_OFFSET(gcmd_offset)
if num_opmode == 1:
gcmd.respond_info("PLATTER: Probing reference ...")
toolhead.manual_move([self.endstop_x_pos , self.endstop_y_pos ], self.speed)
probe_session = probe_obj.start_probe_session(gcmd)
probe_session.run_probe(gcmd)
zendstop = probe_session.pull_probed_results()[0]
probe_session.end_probe_session()
if num_opmode == 2:
gcmd.respond_info("PLATTER: Probing bed ...")
toolhead.manual_move([self.center_x_pos , self.center_y_pos ], self.speed)
probe_session = probe_obj.start_probe_session(gcmd)
probe_session.run_probe(gcmd)
zbed = probe_session.pull_probed_results()[0]
probe_session.end_probe_session()
if num_opmode == 3:
gcmd.respond_info("PLATTER: tool setter" )
probe_session = probe_obj.start_probe_session(gcmd)
probe_session.run_probe(gcmd)
ztset = probe_session.pull_probed_results()[0]
probe_session.end_probe_session()
cmd_PLATTER_CALIBRATION_help = "Set Z offset for current plate"
def load_config(config):
return platter_calibration(config)
This is, I think, common for probes that are located somewhere along the Y axis in relation to the nozzle. The X rail will always have some twist in it. Usually the toolhead droops in the middle of the axis. If the probe is behind the nozzle, like a Voron, this causes the probe to read high at that location. If you solve your Z offset so small prints work fine in the middle of the bed, you’ll find that the edge of the bed is squashed.
The best solution for this is to move the probe to a location that’s left or right of the nozzle. This is the reason why Prusa put its “pinda” probes off to the side, exactly in line with the nozzle. It nulls the axis twist (well it follows the axis twist).
I tried something similar on my Voron 2.4 by adapting the Stealthburner’s ADXL mounting spot to make a “foot” that holds a dockable Euclid probe. The switch button on the probe is in line with the nozzle in Y. This was a big improvement in global z accuracy. (not perfect but a lot better)