Assume that the spools are not perfectly round.

This means that the steps/mm is not a constant (there are other sources of error that add to this effect).

This in turn means that the set of touch points do not describe a flat surface. If you were to transform the coordinates into Cartesian coordinates, variations in z would be obvious. (I should do this in calibrate.py).

Nicholas uses leastsq() to come up with values for max_arm_length and shoulder_height that define a plane that comes close to touching all of the defined touch points. (I should log the z variations for this imaginary plane too)

Segmentize then transforms Cartesian coordinates from the g-codes into the appropriate arm lengths to build the object on the imaginary plane.

In my build, at Nicholas's recommendation, the string bolts have nyloc nuts with the nylon insert faced the unthreaded part of the bolt. This keeps the string away from the threads so there are no jamming or cutting issues and thus no need for washers.

Your code uses shoulder radius and wrist radius which seem to me to be fixed values and thus unnecessary parameters.