Mesh Bed Compensation Screwy
-
There is definitely something wrong with the mesh-bed-compensation. The first thing I wondered about were the spurious pauses while printing At first I thought it is the non-extruding-move while changing perimeter.
I investigated further and found out the "stops" are at specific positions even if I move the head manually through the paneldue. When the "stops" occur the bed moves in Z-direction a significant amount (0.5mm) although it should change only gradually according to the heightmap.csv.
I then tried to find the spots where these "stops/jumps" occur and they were always at some 5mm border, for example between 184.9mm and 185mm or 74.9mm and 75mm.
To me it seems there is some rounding error which can happen more easily when using inverse multiplication instead of division, taking a first glance at HeightMap::GetInterpolatedHeightError() I couldn't spot any issue although the HeightMap::InterpolateXY looks a bit overcomplicated in favour of just clamping the values.
I guess I'll just run some tests and debug these functions hoping that these are not some compiler or CPU specific rounding errors. … -
Hi, that would definitely align with what I was seeing on the four square print as mentioned above. But I also found that after running through the compensation and then just executing a simple X move from X0 to X200 then the Z was very jumpy
-
Ok, so I loaded GrodanB's heightmap.csv and then sampled the whole bed ( HeightMap::GetInterpolatedHeightError() ) with a 4mm (and 2mm) resolution and visualised the result with excel.
The first one is rather off, the area clearly wrong. Debugging it showed that GridDefinition::recipSpacing is still at its default value (for a 20mm grid) after loading the .csv.
After fixing that it is much better, but still some hard jumps at the borders, so I'll debug the border-interpolation next.
My fixes as well as the (very shoddy) simulator I use can be found here: https://github.com/ChristophPech/RepRapFirmware
-
I just made a short video of the smooth motion without g29, and the choppier motion with.
I'm not sure if it's a bug, maybe all the variables eat up the processing power?
But I don't remember my 8 bit board doing this.
Here's the video:
https://youtu.be/igNx0sjtSqE -
I found an error in one of the interpolation functions and fixed it (pull request pending)
The result looks much better:
-
But there is still more. Zeroing out the last two columns gives me this:
The interpolation overflows into the first column of the next line. Fixing it:
The final result of the whole mesh: looks quite good.
-
And we can even do better by using bicubic interpolation:
Since Z is often the slowest axis, smoothing it out will mean smoother movement for the other axes.But there still remain two last issues: unprobed points with a 0 csv are being clamped to zero, this can easily be fixed
Second: points outside the probing area remain constant. These should be extrapolated, maybe something like linear regression.
Thoughts?
-
@CHP, many thanks for diagnosing and fixing these issues. I have accepted your pull request, and I will release a new 1.18 beta soon incorporating these changes.
-
Hi CHP, can I just say thank you for identifying this and fixing, very very much appreciated.
DC42, have you any idea what going on re my comment about 4 pont adjustment above?
thanks
-
@CHP although I only understand have of what you said(the hampster wheel in my head is seizing up), the pictures you put up show that you've found a way to wrangle the angry pixies flowing to my motors, and I thank you for it.
-
Hi CHP, can I just say thank you for identifying this and fixing, very very much appreciated.
DC42, have you any idea what going on re my comment about 4 pont adjustment above?
thanks
You need to probe clockwise round the bed, not anticlockwise. One of these days I'll get round to either re-ordering the points or generating an error message if they are in the wrong order.
-
Hi, tried this which is clockwise
G30 P0 X151 Y151 H0 Z-99999
G30 P1 X151 Y49 H0 Z-99999
G30 P2 X49 Y49 H0 Z-99999
G30 P3 X49 Y151 H0 Z-99999 S4but same result, just gives a small judder on first move after running the bed level and then wont move anymore. (Sorry)
-
Update, maybe its just my misunderstanding of how this works, but commented out last line and moved S to third line as
G30 P0 X100 Y151 H0 Z-99999
G30 P1 X151 Y151 H0 Z-99999
G30 P2 X151 Y49 H0 Z-99999 Sworks and I can then see compensation movement through moves, yet to try with a print though
-
Hi, tried this which is clockwise
G30 P0 X151 Y151 H0 Z-99999
G30 P1 X151 Y49 H0 Z-99999
G30 P2 X49 Y49 H0 Z-99999
G30 P3 X49 Y151 H0 Z-99999 S4but same result, just gives a small judder on first move after running the bed level and then wont move anymore. (Sorry)
Start with your X49 Y49 point as P0 and go clockwise from there.
-
Further Update, changed the coords so that there were four but not in a perfect square. And now it works with 4, but following running the bed compensation, Z is set to an insane neagtive number of -199.91
G30 P0 X49 Y151 H0 Z-99999
G30 P1 X150 Y150 H0 Z-99999
G30 P2 X149 Y50 H0 Z-99999
G30 P3 X51 Y50 H0 Z-99999 SGo back to 3points as
G30 P0 X100 Y151 H0 Z-99999
G30 P1 X149 Y50 H0 Z-99999
G30 P2 X51 Y50 H0 Z-99999 Sand Z after shows 5.73 and z compensation across the bed seems to work, again need to wait till tonight to try a print
-
Great work, thanks.
Just tell me when a beta is available and I test with that.
It would be interesting to see the result. I'll switch back to 16 mm square instead of the 32 mm I used for this test.
I'll still wonder if there is something hidden in the fact that the measurement clearly shows that the bed is high at the back right off the plate but the print is pressed hard against the plate on precisely that spot… Strange if you ask me...
Then I kind of wonder how the compensation is done when printing with dual head. I set the distance between the first tool and the Z-probe. But I do not enter the distant from the second... So is automatically compensated or should I refer to a point in the middle?
G31 X-25.19 Y7 Z2.67 P500 ; Set the probe height and threshold; increase Z to decrease bed probe distance X11.0 Y0.5
This is relative the tool 1 nozzle... the nozzles are approx. 38 mm apart. So to place the compensation in the middle should I use:
G31 X-44.19 Y7 Z2.67 P500
Or is the 38mm added due to
G10 P1 X38.3 Y0.0 Z0.0 S0 R0So that exact bed leveling is done for the extruding nozzle?
-
Update on G30 four point probing. Now I have actually read DC42's comment (sorry must have overlapped) I have set the four poits clockwise from minor XY as per
G30 P0 X49 Y49 H0 Z-99999
G30 P1 X49 Y149 H0 Z-99999
G30 P2 X149 Y149 H0 Z-99999
G30 P3 X149 Y49 H0 Z-99999 Sit looks like the four pointer is working, the results are
G32
Bed equation fits points [49.0, 49.0, -0.118] [49.0, 149.0, -0.156] [149.0, 149.0, 0.162] [149.0, 49.0, -0.093]So my final bed.g looks like
; bed.g
; called to perform automatic bed compensation via G32
;
; generated by RepRapFirmware Configuration Tool on Sun Feb 26 2017 13:25:00 GMT+0000 (GMT Standard Time)
G90
; Clear any bed transform
M561; Probe the bed at 4 points CLOCKWISE!
G28
G30 P0 X49 Y49 H0 Z-99999
G30 P1 X49 Y149 H0 Z-99999
G30 P2 X149 Y149 H0 Z-99999
G30 P3 X149 Y49 H0 Z-99999 S
G1 X0 Y0Also my Home Z and Home All now have
G1 X1 Y21 F6000
G30becuase my X offset of the probe from the extruder is 48 and Y offset is 28 and G30 instructions account for the offset in the instructed points.
Hope this helps anyone else who is suffering.
-
Hi All, can I now confirm that I amprinting the four squares test succesfully. thanks for your help.
DC42 as a suggestion, might it be worthwhile adding the above fledged out with a little explanation to the Wiki, at least for those of us that are using Glass Beds on a Cartesian?
-
@pcsentinel. Glad you got it sorted. A couple of points. You seem to only be doing the bed compensation for 100mm x 100mm of the bed area. It's usually best to probe close to the 4 extreme corners of the axes movements so that you cover the entire printable area. Also, your Z homing example seems to indicate that you are homing Z at one corner of the bed and it's usually better to do the Z homing at the centre of the bed, because that is where the majority of your printing will take place and therefore where you need the most accuracy. HTH
Ian -
Ok, thanks I tried that, but because of my offset when I go to postion 2 on the grid with
G30 P1 X49 Y189 H0 Z-99999
the nozzle is hitting the bed and compressing the carriage before te sensor is activated therefor throwing off the reading