Maslow Home Maslow Community Garden

Discussion Regarding Triangular Calibration


this effort might could also bode well for

  • general clean-up/separation of known good code in the firmware?
  • an eventual ‘calibration and machine tuning’ mode in Ground Control?
  • Gcode terminal mode in Ground Control?

no pressure!



Yep. I’ll work on it and add some comments to the code as well to explain it. In reality, it’s pretty simple.


One suggestion I have if its possible? Is to add in settings a manual X and Y
scale factor, the reason I suggest this is because for myself and from what
I’ve read from others as well it seems like people are getting consistent
reproducible measurements off in one axis. Seems like an easy fix. If for
example you cut a 1000 x 1000mm square and it always off by 5mm in the Y you
could set the Y scaling to either +or- .005 and the results should be
corrected. Would they not?

the trouble is that that scale factor needs to be different in different areas
of the workpiece

Another quick thought/question. Why are we even taking rotation radius into
account at all if the system has been engineered to place the bit directly in
the center between the chains? That should remain a constant point. Seems to
be adding a variable that isn’t a variable.

rotation radius is the distance from the bit to the end of the chain, it’s
effectively extra length on the chain (rotation of the chain end around the bit)

David Lang


Exactly correct. The rotational radius is what it is and should be constant. I think it’s close to 138 but no one has precisely measured it as far as I know… that’s why when I get 134, I worry. The thing is, however, the current calibration routine makes changes as follows:

the rotation radius is a constant (as long as your triangulation kit doesn’t
flex), but it is going to be different for different triangulation kits, and
using a different size cotter pin to hold the chain into the kit results in a
different rotation radius value.

  • To minimize error to cut 1, motor height (Yoffset) is adjusted
  • To minimize error to cut 2, rotational radius is adjusted
  • To minimize error to cut 3, (in my method) distance between motors is adjusted
  • To minimize error to cut 4, chain sag compensation is adjusted.

I don’t think it’s that clean.

adjusting the distance between the motors is not the right thing to do.

distance between the motors should be measured, with a tape measure.

(longer post later as I finish going through the thread)

David Lang


I thought this was what was already being done, there are multiple sources of
error and it’s not possible to attribute error in one cut to one source.

David Lang


That appears to me how the current routine works. Take a look at it.


At the time I wrote what you responded to, I was thinking this value would be entered and not subject to being changed by calibration… now it seems that allowing it to get tweaked might get to a more accurate number,


Warning, long data dump to explain the depth of the problem

The maslow is (almost[1]) a triangle with the distance between the motors being
one side, and the chain lengths being the other sides.

Errors of any of the measurements can result in a position error that is double
the measurement error.

It’s not hard to measure a small error over a small distance, but it’s very hard
to measure that same small error over a large distance. As a practical matter,
Maslow owners can reasonably be expected to have a tape measure (accuracy of
~1/2mm if you are careful) and a 6"/150mm digital caliper can be picked up from
harbor freight/Amazon/etc fro $10-15 (accuracy of ~0.002" or ~0.05mm)

The distance between the motors can be measured with a tape measure. This should
be done while under tension and while not under tension to make sure the
measurements match (if they don’t, something is flexing, fix it). This is a
critical value, so multiple measurements to average and/or throw out an outlier
is a good idea.

The chain lengths are far more of a problem

The ‘chain length’ is:

  1. The amount of chain that you have fed out from the motor
  2. Plus the rotation radius of the triagulation kit you are using (extra length
    from the chain to the bit)
  3. Modified by how much chain was past the 12 o’clock position when you put the
    chain on the sprocket
  4. Modified by how much chain length is lost attaching it to the triangulation
  5. Minus the effect of chain sag
  6. Plus the chain slop (aka chain tolerance), which we ASSUME is linear with the
    amount of chain fed out
  7. Altered by the amount of chain that’s wrapped around the sprocket.

To make this more complicated

Chain sag is affected by

  1. the amount of chain that’s been fed out
  2. the tension on the chain (affected by the weight of the sled)
  3. the angle of the chain

The amount of chain that’s wrapped around the sprocket is affected by the angle
of the chain

The angle of the chain is not known, because it depends on how much the chain
has been extended/shorted by each of the error source above (including the fact
that chain sag is affected by the angle, and the amount of sag affects the
effective length of the chain, which in turn affects the angle)

If you move past a point where the chain tension on the slack side of the
motors is higher than the tension on the sled side of the motors, the backlash
of the gears will affect how much chain has been fed out.

And all of this then needs to be converted from coordinates based on where the
motors are to coordinates based on where the center of the workpiece is (and the
distance from the center of the workpiece to the motors is an unknown, and very
hard to measure variable).

We cannot realistically measure the absolute positions of anything on the
workpiece, all we can do is to measure relative distances between marks that we
put there

As a result, all we can do in calibration is to make some test cuts designed to
minimize/maximize the different sources of error and then have a series of
forumulas and tinker with the values of the different error sources until the
distances from the formulas match the distances measured.

The Top Mount triangulation kit has very little potential error in it’s rotation
radius (and the amount of chain length lost to the connection with the kit is
zero), so with that, it could be treated as a constant. I suspect that the
stock ring kit could be handled the same way (but custom rings will have to be
re-calculated), with allowance for a specific size of cotter pin to attach the
chain, and the pin having the stright side between the chain and the bearing
holder, not a round portion (because that will move the end of the chain away
from the bit just a smidge)

It would be good to be able to tell the calibration routine that you have a
high confidence in the rotation radius and not to munge it

The chain slop/tolerance value can be measured by stretching it between the
motors and measuring it based on how much movement of the two sprockets is
needed. ASSUMING this error is distributed evenly along the chain, we can then
figure out how much chain we have actually fed out.[2]

If we can get a good way to make the sprocket tooth be at 12 o’clock, we can
then say that half a link of chain is past the 12 o’clock position. If the
sprocket tooth is not at 12 o’clock, this distance will be off.[3]

This now simplifies the problem into figuring out chain sag, and sprocket wrap

The simplest thing to calculate is when we feed out the same amount of chain
from both sides (accounting for chain slop), so we should make a small
horizontal cut at the top and bottom center (as close as we can operate top and
bottom) and measure the distance between these cuts

The worst chain sag is in the bottom corners, so we should make cuts are close
to these corners as possible and measure it.

There is FAR less chain sag in the top corners as the minimum tension is about
three times higher, so we should repeat the cuts there to make a comparison

It may be worth trying to find if we can get different chain sag in a small
enough area to be able to use the more precise calipers, but I don’t think we

If we add additional data points, we can make it less likely that the algorithum
settles on a local minimum of error and finds the real minimum, so I would
suggest making the cuts be right angles so from one cut you can measure both
horizontally and vertically

If at some point you have the user move the chain to the middle of the sheet,
you can then calculate the Y offset.[4]

If the existing calibration has been assuming that the variables could be
modified individually to correct errors on specific measurements, it’s amazing
that it worked as well as it did.

David Lang

[1] it’s a triangle, except for the fact that the chain wraps around the
sprockets instead of being a stright line.

[2] we could connect both chains together in a loop and run the entire loop
around the motors, watching if the motors rotate different amounts as we check
under tension periodically, it would be good to do this, especially as chains
wear, but the math becomes harder

[3] currently, if you use manual chain length, this is going to be a source of
error. 1650mm is 259.84 links, setting the tooth to 12 o’clock and putting the
marked links on it has just introduced a 1mm error in chain length (not counting
the chain slop)

[4] it would be best to make this point be a position where both motors have a
tooth at 12 o’clock and mark chains to this point for easy resets of the


I think it depends on the triangulation kit in use and the variables it has.

the top mount kit is laser cut and has very little chance of flexing

the ring kit has little chance of flexing, but it has bolts through bearings, paint to sand/wear off (and a narrow wear surface after that). So I would say is not quite as good, but close.

the wood kit could have some flexing, and has more parts so more places for slop, even though it’s laser cut

home-brew kits, or custom rings will have different dimensions, so it’s good to have it as an option to calculate this, but if you really know what your rotation radius is, there should be an option to say that it’s fixed.


That’s been my position as well. However, using the current method, the solution won’t meet the 0.0001 error goal unless rotational radius is allowed to change. There’s no way to minimize the error in cut 2 without it with how the current process is written. That’s why I made a process that did a RMS of all errors… so a single error wasn’t tied specifically to a single variable.

And sled drift compensation that’s also optimized isn’t used in the model so it seems to me to just be an unaccounted for error amount.


I’ll have to read your long post about 10 times I think… lots of good info.


0.0001 error is not practical, we are aiming for a perfect machine to have an error of 0.015 in / 0.4mm

expecting the calibration calculations to be 1/100 (or smaller) the accuracy of a perfect machine just won’t work

nobody is able to measure things that accurately.

use your approach and just look for the best fit you can get (and report what the overall error in the calculations ends up being). possibly allow the user to tweak something to have it spend more time trying.


I’ve been thinking hard about all the possible error sources for a while.


Could be useful, though I’m not certain what it would tell us.

My approach would be to test (either using a working Maslow or the simulator @dlang? developed) the effect of error in each calibration variable. Then test the effect of errors not in the calibration variables (examples: flex of the motor supports, sled sticking, misalignment of the ring / linkage, whatever else we have seen or can think of and test).

Then we create a test pattern or patterns that best measure each of of these effects. Hopefully the tests are based on objective measurements, rather than something that requires a user’s interpretation (is that line jagged or squiggly?) The user runs the test pattern, makes the measurements, and the software figures out the combination of adjustments (and recommendations) that matches the measured errors.

Is it consistently too big or too small? Too big might mean there’s sag that can’t be pulled out. Too small could mean the motors are flexing toward each other. There certainly could be other factors, but those seem the most obvious ones.


I agree again… Its the current routine that has to have all drop below 0.0001 before it reports finding a solution… If it can’t get there, it gives an error message after 1000 iterations. My routine just finds the minimum error… results came out really well doing so. My RMS error of the four cuts ended around 0.25 mm


Too small. This suggests to me, in part, some level of slop in the chains… anytime something has to turn, there has to be clearance… depending on quality of chain, how the bushings are made (split vs. solid), how the chain has worn, the amount of slop can add up… as much as we see? Dunno


The problem with this approach is that there are multiple errors that can cause the same problem.

If you look at my large post earlier, 90% of that was talking about the different ways that the chains can be the wrong length. The simulator just has a couple parameters to tweak the error in chain length (one that adds a constant error, one that adds a percentage error). The real situation is far harder, so you can’t just duplicate your error in the simulator and try changing those parameters, we have to figure out tests that can measure what we can, and highlight one source of error while minimizing others to get something that can be calculated.


over the length of the chain, you can end up with 500 links. Even 0.001" of slop in each link will translate into the chain being a half inch too long.

chain sag over the same length can also add up to values of similar magnitude,

Unfortunately, they don’t cancel each other out, because slop doesn’t care (much) about tension or angle while sag does.


your approach is the right one, and that sort of accuracy is what the machine was designed to do.

can you run an accuracy benchmark to see what your numbers look like over the entire sheet?


Yes, this weekend… I need to grab a new spoilboard because the current one is butchered with too many cuts that I can’t figure out what’s what.