code: def save_transform(self) -> str:
          
          expected = [self._expected_points[p][:2] for p in [1, 2, 3]]
          log.debug("save_transform expected: {}".format(expected))
          actual = [self.actual_points[p][:2] for p in [1, 2, 3]]
          log.debug("save_transform actual: {}".format(actual))
          # Generate a 2 dimensional transform matrix from the two matricies
          flat_matrix = solve(expected, actual)
          log.debug("save_transform flat_matrix: {}".format(flat_matrix))
          current_z = self.calibration_matrix[2][3]
          # Add the z component to form the 3 dimensional transform
          self.calibration_matrix = add_z(flat_matrix, current_z)
  
          gantry_calibration = list(
                  map(lambda i: list(i), self.calibration_matrix))
          log.debug("save_transform calibration_matrix: {}".format(
              gantry_calibration))
  
          self.hardware.update_config(gantry_calibration=gantry_calibration)
          res = str(self.hardware.config)
  
          return '{}\n{}'.format(res, save_config(self.hardware.config))
docs: Actual is measured data
          Expected is based on mechanical drawings of the robot
  
          This method computes the transformation matrix from actual -> expected.
          Saves this transform to disc.