Accuracy Issues and Calibration Overview

I’m trying to keep this thread strictly a wiki thread, so please edit posts to add or correct information (anyone can)… don’t reply to this thread unless you want to include a new topic related to accuracy/calibration process… thanks!

Thread Contents

Definition and the Calibration Model

It’s important to make sure you use the correct language when describing your issues and the definitions of accuracy and precision are often confused.

Accuracy is how close a measured value is to a desired value. You want to cut a 12-inch square and you get an 11-inch square, you accuracy is poor.

Precision is how close multiple measured values are. You want to cut a 12-inch square and do so in 5 passes around the plywood and each cut perfectly overlaps the previous, your precision is excellent.

I found this image that I think really clears it up (taken from :


Maslow has so far been shown to be very precise, regardless of how far off the calibration is. Precision is determined by the hardware and software of the machine (motors, encoders, controller, firmware) and the current generation does an excellent job… even an amazing job for what it is.

To get accurate results, several properties have to be correctly identified to compute the right Chain lengths.

The rest of this Topic presents some visual representations to better understand theses properties. If you are looking to get more insight on the calibration and chain length calculations, here is your topic.

The following diagram summarizes the main parameters for sled position behavior:


Draft: Distance Between Motors

Edit: So I’ve gone back and forth on this and I’m going to make the assumption that the simulator is asking for actual value minus measured value. So if Maslow measured 3000 mm for a distance and actual is 3005 mm, the error is +5 mm, not -5 mm. Someone please let me know if this is incorrect.

The Why

To know the length of chains to be fed out, the firmware has to know how far the motors are apart (one side of the triangle). The more accurate this is known, the more accurate the firmware will be in moving the router to where you want it to.

If the controller thinks the motors are further apart than they are, then it will feed out too much chain and will make the vertical distance of your cuts lower, wider, and actually shorter than it should (green line is ideal, red is what happens when controller’s motor spacing value is 50 mm too large):

#used a simulator error of -50.00mm#

If the controller thinks the motors are closer together than they are, it will feed out too little chain and will make the vertical distance of your cuts higher, narrower, and actually longer than it should (controller’s motor spacing value is 50 mm too small)

#used a simulator error of +50.00mm#

How Maslow Calculates Distance Between Motors

One of the calibration steps has the user applying the left chain on the left sprocket and then using the GroundControl software the feed out chain until enough is fed out to reach the right sprocket. The chain is then “pulled tight” and the software equates the amount of chain that was fed out to the distance between sprockets (it adjusts for the two extra links that are applied to the right sprocket, if you were wondering). This method in measuring is dependent upon a three primary factors:

  • The motor mounting points and top beam do not flex
  • The chain is fed out precisely at 2.5-inches (63.5 mm) per sprocket full rotation.
  • Precise knowledge of gear ratios of motors
  • Precision is setting the sprocket teeth to 12 o’clock during calibration

The original frame design wasn’t the best at keeping the mounting points from flexing. The new frame designs incorporate a rigid top beam that the motors are mounted to and this seems to do a good job. Also, if the mounts are not well secured to the top beam, they can rotate under stress and this will cause the distance between motors to change, thereby throwing off the calibration.

As for chain issues, the 10-tooth sprocket for #25 chain should spool out precisely 63.5 mm of chain for every rotation (10 teeth x 6.35 mm chain pitch). However, chain will wear over time, or get damaged, and after a rotation the length of the chain that is spooled out is actually longer than 63.5 mm… how much exactly depends upon the chain. Personally, I measured a difference of about a 10 mm between what I got from using a tape measure (which I assume is accurate) to what Maslow calculated… a 0.27% difference. May not seem like much but if you are trying to reach sub-mm accuracy in your cuts, it will have an effect.

Regarding gear ratios of motors, someone early on discovered that the assumed gear ratios were wrong and that led to distance between motors to be calculated wrong. We believe this is fixed… After making the adjustments to the gear ratio, @krkeegan ran some tests to rotate the sprocket 360 degrees over a very large number of times (10 times more than what you would do using the machine) and the 12 o’clock tooth was practically dead-on when it was done… So it is not suspected that this is a source of error.

Finally, in order for Maslow to measure the distance between sprockets, it needs to have one tooth on each sprocket set at 12 o’clock. This should be done as precisely as possible to achieve the highest level of accuracy. I don’t think the error it introduces if the sprocket is off by a degree or two is too significant, but if you have a string level and a piece of coat-hanger wire, you can do what @blurfl came up with… see here.

Rotational Radius

The rotational radius is the distance from where the chain ends to the center point of the router bit. This distance is needed to calculate the chain length because the firmware calculates the length of chain needed to all the way to the router bit. Since the chain stops short (wherever it attaches to the ring carriage or linkage kit) this distance, called the rotational radius, needs to be backed-out/subtracted.

For the standard ring kit, the approximate rotational radius should be around 140 mm, for @pillagethenburn’s wooden linkage kit it’s approximately 260 mm and for @dlang’s metal linkage kits, it’s approximately 150 mm. The last stage of calibration makes adjustments to this value to try to arrive at a rotational radius such that the computed values of the cuts closely matches the values you measured and entered.

As with measuring distance between motors, there’s a true value and if calibration results in a value significantly different than it, then something is off. For instance, if you calibrate using a ring kit and it calculates a rotational radius of 130 mm, then it’s trying to compensate for an error somewhere else because the true number should be much closer to 140 mm. Check, double check, recheck all measurements… as patriotic as I am, doing thing in metrics really is much easier than trying to do them in inches.

The effect of a miscalculated rotational radius is very similar to the effect of a mismeasured distance between motors (they are, after all, just parts of the triangle).

If the rotational radius used by the firmware is smaller than it actually is, too little of a value will be backed out of the computation and therefore the controller will feed out too much chain. The effect is very similar to the effect of the controller thinking the motors are further apart than they are.

#rotational radius error of +25mm #

If the rotational radius used by the firmware is larger than it actually is, too high of a value will be backed out of the computation and therefore the controller will feed out too little chain. The effect is very similar to the effect of the controller thinking the motors are closer together than they are.

#rotational radius error of -25 mm#

Chain Sag

Chains have a natural tendency to sag due to their own weight, forming what’s called a catenary. The effect of this phenomenon is that the controller needs to feed out a wee bit more chain from each motor to compensate for the fact that the chain is taking a parabolic path rather than a straight line path. As with rotational radius, the last step of the calibration makes adjustments to this value to try to arrive at a correction factor such that the computed values of the cuts closely matches the values you measured and entered.

In reality, chain sag is most pronounced when the chains are long (surprise!) and the correction factor attempts to take this into account. The effect is the greatest in the lower left and right corners of the work area. If the chain sag correction factor is too high, chain lengths spooled out will be too short and the cuts will be “inward” (i.e., closer to the center)

Chain sag correction error of 49

If the chain sag correction factor is too low, chain lengths spooled out will be too long and the cuts will be “outward” (i.e., away from the center)

Chain sag correction error of -49

Keep in mind that other factors can result in errors in the lower corners of the work area, such as the fact there’s really very little force pulling the sled into the corners.

Vertical height of motors above worksurface

This is an easy one, I think. The firmware assumes you’ve centered the work area horizontally, but it needs to know just how high above the work area the motors are. Actually, it needs to know how high above the center of the work area the motors are (to form the triangle) but since you enter the size of the work area, it divides the vertical dimension of the work area in half and then adds the vertical offset that you enter.

It’s not exactly easy to manually measure the vertical distance between the motors and the top of the work area, so during calibration you are asked to enter an approximate number (best guess) and during the last calibration step as it’s making changes to rotational radius and coming up with a chain sag compensation value, it will also adjust the vertical offset value.

Unsurprisingly, if the vertical offset used is smaller than the actual value, the firmware will feed out too little chain and therefore everything will be cut higher on the work area than intended. Vertical offset distance 1-inch too low (i.e., 18 inches instead of, say, a true 19 inches) then everything will be cut 1-inch too high. Vertical offset distance too high, then everything will be cut 1-inch too low. If you are trying to take advantage of every square inch of the board, then it matters. If not, no big deal.

Chain Stretch

The Why

Due to wear, or even manufacturing tolerances, chains can be longer than what they should be. Chains are rated at something like -0 to +.15% per link and as it wears, it will get longer. This is primarily due to the wear of the roller chain bushing. See here. For the typical usage of chain, manufacturers recommend replacement when where exceeds 1.5% or 3% (depending upon manufacturer). However, even a 0.05% error is significant for Maslow. This error translates to a chain length error of ~1.5 mm that then translates to a sled position error of over 2 mm at the top center of the work area.

Chain Compensation

Though it is still under development and testing, the software (GroundControl and the controller’s firmware) have settings that allow for adjustment of each chain’s length in the calculations. In the GroundControl settings, these adjustments are labeled “Chain Tolerance, Left Chain” and “Chain Tolerance, Right Chain”. They are expressed as percentage increases. For example, if the chain is 0.3% longer than it should be, a value of 0.3 is entered. Then the controller will spool out 0.3% less chain than it would have based upon the idealized chain pitch of 63.5 mm per sprocket rotation. At this time (and maybe forever), the algorithm assumes that the chain stretch is linear over the entire length of the chain.

The process to use chain compensation is relatively straight forward. There’s a calibration routine found in GroundControl (Actions->Compute Chain Calibration Factors) that does a series of measurements. First you measure the distance between motors using a tape measure. Next, you measure the distance between the left motor and right motor using the left chain and then the distance between the right motor and left motor using the right chain. Once done and the data entered, GroundControl updates the distance between motors in the settings to equal what you measured by hand and computes the compensation factors for each chain.

Sounds good? Well, there’s a problem. Once you do this and recalibrate the machine it performs worse. Why? We don’t know exactly but I suspect there’s either a software bug or an issue with the calibration. After I did this, the calibration routine calculated a rotational radius of approximately 132 mm of my ring kit whereas it really should be very close to 140 mm. So, my suggestion at this time is to try to calibrate the machine without using chain compensation, measure your error, then run the chain compensation routine and see what the results are (don’t recalibrate). You may find out, as I did, your results get better this way.


Maecenas ultrices tincidunt mi in aliquet. Nam id massa nibh. Donec tristique varius pulvinar. Nam ornare vel quam sed mattis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum faucibus diam sed lacus efficitur, vitae vulputate neque ornare. Aliquam erat volutpat. Mauris eros purus, malesuada id accumsan eget, vehicula ut lectus. Suspendisse potenti. Fusce sem erat, tristique sit amet maximus ut, ullamcorper a nulla.


Vestibulum arcu sem, fringilla eu consequat nec, sagittis non libero. Duis lacinia, diam sit amet facilisis congue, tortor risus iaculis arcu, at imperdiet erat lectus in purus. Proin semper, erat quis imperdiet bibendum, ex purus dictum nibh, quis molestie nulla dolor tincidunt nisl. Aenean pharetra consectetur eleifend. Donec finibus, metus vel mollis vulputate, massa erat bibendum velit, at aliquam diam enim eu mauris. Suspendisse rhoncus quam id imperdiet gravida. Praesent malesuada sapien eu laoreet efficitur. Ut sit amet felis posuere dolor euismod tempor non vel leo. Proin at dictum tortor, at pulvinar mauris. Aliquam fermentum lectus mi, in ornare erat tincidunt vitae. Nam ut fermentum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse quam nisl, tempus nec interdum at, tincidunt eget metus. Curabitur vel odio mauris. Phasellus metus metus, pharetra vitae consequat nec, volutpat vel erat. Praesent sit amet leo auctor, rhoncus orci sed, iaculis nunc.


Etiam quis quam urna. Aenean pharetra viverra ante, quis maximus est interdum non. Aenean gravida, odio ut auctor gravida, massa elit ullamcorper felis, vitae porttitor ante ante ac urna. Fusce convallis blandit nibh nec tincidunt. Donec dictum ex non quam porttitor fermentum. Sed nec sapien et orci egestas facilisis. Vestibulum semper gravida elementum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.


Nam at tellus ac sapien luctus pellentesque. Cras eu lectus ipsum. Cras ante erat, tempus sit amet fermentum id, faucibus et erat. Morbi dignissim consectetur ligula, nec faucibus augue tempor in. Suspendisse rutrum aliquet diam vitae dictum. Proin ultrices, metus vitae lobortis facilisis, odio nulla semper diam, sed sodales tellus lorem sed purus. Pellentesque porttitor neque quis diam sollicitudin, fringilla efficitur lectus porta. Donec et nibh vitae metus venenatis tincidunt eleifend quis elit. Morbi quis felis et odio tincidunt cursus. Vestibulum eget nisi id nisi rutrum scelerisque in eget eros. Ut id est a metus ullamcorper venenatis.

This is a good series of posts.

It would be good to have a post about the chain distance wrappd around the

also, the chain wrapped around the sprocket, and the rotation radius should not
be modified by the chain stretch factor. I think today it’s implemented by
modifying the distance per rotation number, I think it probably needs to be done
much more explicitly in the calculations.

something along the lines of

  1. figure the ideal chain lengths

  2. subtract the rotation radius

  3. subtract the sprocket wrap

  4. figure out the amount to correct for sag and stretch

  5. modify the ideal chain lengths by this correction factor.

David Lang

I made this post to talk about chain wrap. Review it and let me know if you think its correct. It’s how I understand it but that doesn’t mean its correct.

The self-modified version of groundcontrol/firmware I’m using removes chain stretch from the chain wrap calculations. It also calculates the radius of the sprocket during chain wrap calculations as the average of chainPitchnumberofTeeth and chainPitch/(sin(180numberofTeeth)*2). It’s a micro-adjustment but it’s something I did nevertheless.

Yes, the effect of chain stretch accounted for by changing the mmPerRotation of each axis in controller.

Hi madgrizzle,
I am working on my second build - Maslow mark II - to address accuracy issues with my current machine. Something bothers me with your diagram at the top and “triangulation kinematic”. Here is my line of thinking:

  • on your diagram a dotted line goes through the center of router bit while actually the chain curve is normal to the circle. This is direction of chain tension force. Look at my picture

    or when sled is moved to left side;

    Do we really solving “triangulation” problem or we have much less challenging catenary curve fitting problem (we do not know a weight of sled though). The intersection of dotted line moves as sled is moving and it is hellish math to find position of router bit relative to this moving target. In addition we do not have precise method to centre router on the sled.
    In my opinion we have to solve catenary equation - fitting to three points: router bit, ring and sprocket - not triangulation. We should have very good accuracy providing that router is in the centre of the ring.
    Am I right or I am missing something?

Just to make sure I understand, are you saying that there is not really a triangular relationship between the motors and router bit because the chain sag affects where the carriage is located on the ring (basically “lowering” its position)?

Exactly! Tension force vector is applied to the ring at the point of chain attachment and tangential to catenary curve. At this point chain is perpendicular to ring - better word is “normal” and continuous to centre of ring (well - almost to the centre but straight line on such short distance is good approximation). Minimum energy requirements force ring in such position.

1 Like

It’s quite possible you are correct. This post tries to explain the theory behind the current implementation of triangular kinematics. Do you think you can share your post on this thread?

I know @joshua has been doing some work with catenary equations and his input would be good to get as well.

Hi @TomD ,

Great stuff! - thank you @c0depr1sm - a lot to digest. I am glad to hear that parabola approximation is implemented. I was confused by wiki diagram.

It’s not implemented in the stock firmware at this time. It’s something that a few people are exploring.

This is one of those things that is easy to overlook. Also, it is difficult to quantify the impact. We need someone with a PhD and a lot of free time to really work through this problem in a rigorous way.

The way I interpret these problems, is like: we want to consider everything which affects the shape and location of the chain relative to the router-bit. Two of these things are: the extra weight associated with the roller-bearing assembly; and the fact that the ring functions as a zero-mass extension of the chain. Within the wikipedia discussion about the catenary equation, there is a section which discusses non-uniform chain weight. This could be used to address this problem. The roller bearing would look like a 1" section of the chain that is heavier, and the ring would look like a ~130 mm section which has zero-mass. The math may be too much for the lowly arduino.