BedLeveling X/Y computation incorrect for linear
Computation for px and py for Bedleveling is creating incorrect grid for ZProbe sampling.
Note: It is using incorrect LOOP index (using BOTH ix and iy for both X and Y computations, rather than ix for X, and iy for Y)
#elif BED_LEVELING_METHOD == 1 // linear regression
Note: It is using incorrect LOOP index (using BOTH ix and iy for both X and Y computations, rather than ix for X, and iy for Y)
#elif BED_LEVELING_METHOD == 1 // linear regression
float delta = 1.0 / (BED_LEVELING_GRID_SIZE - 1);
float ox = EEPROM::zProbeX1();
float oy = EEPROM::zProbeY1();
float ax = delta * (EEPROM::zProbeX2() - EEPROM::zProbeX1());
float ay = delta * (EEPROM::zProbeY2() - EEPROM::zProbeY1());
float bx = delta * (EEPROM::zProbeX3() - EEPROM::zProbeX1());
float by = delta * (EEPROM::zProbeY3() - EEPROM::zProbeY1());
for (int ix = 0; ix < BED_LEVELING_GRID_SIZE; ix++) {
for (int iy = 0; iy < BED_LEVELING_GRID_SIZE; iy++) {
//float px = ox + static_cast<float>(ix) * ax + static_cast<float>(iy) * bx;
float px = ox + static_cast<float>(ix) * ax + static_cast<float>(ix) * bx;
//float py = oy + static_cast<float>(iy) * ay + static_cast<float>(ix) * by;
float py = oy + static_cast<float>(iy) * ay + static_cast<float>(iy) * by;
float py = oy + static_cast<float>(iy) * ay + static_cast<float>(iy) * by;
Comments
is correct.
A = P2-P1
B = P3-P1
POS = P1 + ix * A + iy * B
is the equation spanning the measured parallelogram. And that is why ix and iy are required on all equations.
One more thing, if I may...
When adding the Point to the grid matrix, shouldn't the point (and corresponding h [height]) have the X and Y adjusted by the ZProbe offsets (since that is the X/Y coordinate where the Z measurement is actually being probed)?
In my case, my BLTouch ZProbe is (-8.93, -52.17) from the extruder. If the Bed Leveling moves to (0,0), the PROBE is actually measuring the bed height at coordinate (8.93, 52.17) - isn't it?
I would argue, therefore, that when addPoint is storing the coordinates for computing the bed leveling matrix, it should be storing:
builder.addPoint(px - EEPROM::zProbeXOffset(), py - EEPROM::zProbeYOffset(), h);