Maslow Home Maslow Community Garden

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.

Accuracy, however, is controlled by two things, the model of the system built into the firmware and the measured values of the parameters used by the model. This article discusses only the triangular kinematics model based upon usage of the ring kit or one of the linkage kits. We’ve seemed to have moved on from the original quadrilateral system (though a few still use it).

Currently, the model considers the following primary factors that are subject to calibration:

  • Distance between motors
  • Rotational radius (distance from end of chain to the router bit)
  • Chain sag
  • Vertical height of motors above worksurface
  • Chain stretch (in development)

The following diagram may (or may not) help:

The idea is that to move the router to a specific location, the firmware calculates how much chain to feed out from each side and the math is based upon a triangular relationship between the motors and the router (hence, triangular kinematics)

Calibration Process

Calibration - It's in Ground Control Check and tune your calibration with the [Calibration Benchmark Test](

What must be adjusted to correct out of round circles
How To: Get Calibrated!
Table of Contents

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 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.

Table of Contents

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 (the 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#

Table of Contents

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.

Table of Contents

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.

Table of Contents

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.

Table of Contents


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.