My philosophy in writing and setting up a machine controller. Keep everything physically based as possible, so that each part of the system is straightforward to design and validate at each individual system. The input to a stepper motor driver should be number of shaft rotations, for instance (and not the number of steps, which varies according to configuration, like full step/half step/microstepping, 50 pole steppers, 12 pole steppers) This way you can compare the internal variables for number of shaft rotations to the physical number of shaft rotations in the real world. The associated virtual encoder for the stepper motor should also read back in number of shaft rotations. Then, have your inverse kinematics translate from Cartesian world coordinates to number of shaft rotations for the individual steppers. Changing a stepper then, wouldn’t require a change in the kinematics and vise-versa. Many opensource machine controllers take a lot of shortcuts (usually a single unit conversion), which makes it harder to maintain the software, use a different machine configuration and even troubleshoot it.