Bed mesh is not compensating predictably

Basic Information:

Printer Model: Voron Trident 300mm
MCU / Printerboard: Octopus 1.1
klippy.log
klippy-log.zip (1.2 MB)

Describe your issue:

Setup

I’ve recently built a Voron Trident 300mm and having a problem with my bed mesh.
I have a Klicky proble and klipper_z_calibration plugin.
My bed is relatively flat, but I think extrusions are not exactly parallel, so I get a bed mesh looking like this:

#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# 	  -0.035625, -0.046250, -0.025000, -0.040000, -0.013125
#*# 	  -0.033750, -0.037500, 0.001875, -0.017500, -0.047500
#*# 	  -0.006875, -0.008125, 0.000000, 0.008750, -0.036875
#*# 	  -0.007500, -0.007500, 0.008750, -0.001875, -0.001250
#*# 	  0.041875, 0.033750, 0.003125, 0.020000, -0.001875
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = bicubic
#*# tension = 0.5
#*# min_x = 5.0
#*# max_x = 295.0
#*# min_y = 25.0
#*# max_y = 295.0

Range is 0.089 which I think it not great, but also not terrible for 300mm bed (I think). At one point it was 0.05, but it’s gotten worse after some prints. I can work on adjusting it, but my problem is that bed mesh doesn’t seem to compensate properly in my case.

Bed mesh configuration:

[bed_mesh]
speed: 270
zero_reference_position: 150,160
horizontal_move_z: 7
mesh_min: 5, 25
mesh_max: 295, 295
probe_count: 5, 5
mesh_pps: 2, 2
algorithm: bicubic
bicubic_tension: 0.5

To test bed leveling a have this macro which replicates what runs at the beginning of each print.

[gcode_macro LEVEL_TEST]
gcode:
    BED_MESH_CLEAR
    G28
    Z_TILT_ADJUST
    CALIBRATE_Z
    BED_MESH_CALIBRATE

The problem

The bed mesh doesn’t compensate for differences in height as I would expect.
On the left side the nozzle is always higher than on the right one.
I did a paper test in the middle of the bed (zero_reference_position) to find a relative height when paper meets some resistance. It’s not meant to measure the actual height, but to compare different points on the bed.
My understanding is that if I now set Z to 0.05 at any point of the bed it should be similar to the center of the bed, but this is not what’s happening.
For example:
Z Offset after z_calibrate is -0.093:

Coordinates Paper resistance Z height Bed mesh adjustment Toolhead Z Mesh helped
150,160 0.05 0 -0.042875
5,295 0.0 0.042 -0.051000
77.50,25.00 0.06 -0.046 -0.079125 :white_check_mark:
222.50,25 0.11 -0.04 -0.022875
222.50,295 0.07 0.02 -0.002875 :white_check_mark:

I can see that the bed mesh adjustments are being applied, for example:

0.11 - 0.093(z offset) -0.04(bed adjustment) = -0.023 (rounded up -0.022875).
The problem is that the distance to the bed is not adjusted properly.
For example for coordinate 5,295 I would be better off without bed mesh adjusting at all, because then I would get toolhead position of .05 −.093 = -0.043 when setting 0.05 height when paper has some resistance. With bed mesh compensation I had to decrease to z height to 0 to counteract the bed mesh compensation.

Here are the same coordinates with bed mesh cleared:

Coordinates Paper resistance Z height Toolhead Z Mesh needed
150,160 0.05
5,295 0.05 -0.042875
77.50,25.00 0.01 -0.082875 :white_check_mark:
222.50,25 0.06 -0.032875
222.50,295 0.09 -0.002875 :white_check_mark:

So from 4 coordinates sampled 2 were fixed by the bed mesh, but 2 made worse.
Without mesh 2 coordinates which mesh “corrected” were good without mesh, but 2 coordinates which were good with mesh are now incorrect.

I’m not sure what is causing this.

  • Clearly the mesh is applied correctly based on the adjustments.
  • The coordinates I tested manually are coming from probed tooltips on “Heightmap” visualisation, so this is where bed mesh actually probed.
  • Klicky probe offsets are setup correctly. To double-check I navigated hotend to 222.50,25, marked the spot on the bed and checked that the Klicky probe touched that spot with the switch.
  • Measured offsets check out, for example:
probe at 152.000,140.000 is z=5.977750 => 150,160 zero reference
probe at 224.500,5.000 is z=5.936500 => 222.5,25 −0.04125
probe at 79.500,5.000 is z=5.937750 => 77.50,25 -0.04

In case of 77.50,25.00 it was a correct adjustment, but in case of 222.5,25 that adjustment wasn’t needed.
How can it be that 150,160 and 222.5,25 are the same distance from the hotend, but the probe reports as if 222.5,25 is lower.

The results are very consistent, I’ve run a lot of meshes and they all give basically the same result.

Any ideas what might be causing this?
Can this be some weird hardware fault I don’t understand? It’s likely, since I’ve just assembled the machine, but I can’t understand this behavior.

Any ideas would be much appreciated!

Likely you have a so-called “location bias” due to twisted extrusions or lack of precision in your mechanical assembly.
Because probe and nozzle have an offset, the probed location has a different deviation than the nozzle.

There is some development going on to fix this in the software, but the best approach would be to fix it on hardware level. See Add X twist compensation module by blastrock · Pull Request #6149 · Klipper3d/klipper · GitHub