code: def _move_mount(robot, mount, point):
      
      carriage = robot._actuators[mount]['carriage']
  
      # Home both carriages, to prevent collisions and to ensure that the other
      # mount doesn't block the one being moved (mount moves are primarily for
      # changing pipettes, so we don't want the other pipette blocking access)
      robot.poses = carriage.home(robot.poses)
      other_mount = 'left' if mount == 'right' else 'right'
      robot.poses = robot._actuators[other_mount]['carriage'].home(robot.poses)
  
      robot.gantry.move(
          robot.poses, x=point[0], y=point[1])
      robot.poses = carriage.move(
          robot.poses, z=point[2])
  
      # These x and y values are hard to interpret because of some internals of
      # pose tracker. It's mostly z that matters for this operation anyway
      x, y, _ = tuple(
          pose_tracker.absolute(
              robot.poses, robot._actuators[mount]['carriage']))
      _, _, z = tuple(
          pose_tracker.absolute(
              robot.poses, robot.gantry))
      new_position = (x, y, z)
      return "Move complete. New position: {}".format(new_position)
docs: The carriage moves the mount in the Z axis, and the gantry moves in X and Y
  
      Mount movements do not have the same protections calculated in to an
      existing `move` command like Pipette does, so the safest thing is to home
      the Z axis, then move in X and Y, then move down to the specified Z height