Wheel Calibration Script

       from picarx import Picarx
    from time import sleep
    import time
    
    px = Picarx()
    
    # Track attempts and offsets
    #attempts = []
    offset = 0 # Initial offset angle
    
    def run():
        offset = 0  
        minAngle = -10
        maxAngle = 10
        
        while True:
            print(f"Setting servo angle to offset: {offset}")
            px.set_dir_servo_angle(offset)
            
            # Move forward and recalibrate if it goes off the line
            px.forward(5)
            sleep(0.5)
            while not off_line():  # Move forward until off the line
                continue
            # If the robot goes off the line, stop and adjust
            px.stop()
           
            if end_of_line():
                break
                 
            data = px.get_grayscale_data()
            state = px.get_line_status(data)
            print(f"Off line, Recalibrating...")
            sleep(0.5)
            # Backward to return to the starting point
            px.backward(5)
            sleep(0.5)
            while not off_line():  # Move backward until at starting point
                continue
            px.stop()
            
            
            if state[0] == 1:  # Left sensor off
                print("Adjusting to the left")
                maxAngle = offset;
            elif state[2] == 1:  # Right sensor off
                print("Adjusting to the right")
                minAngle = 0;
    
            offset = (minAngle + maxAngle) / 2
              
            print(f"New recalibrated offset: {offset}")
            sleep(0.5)  # Stabilization delay
        print("End of line reached.")
        px.stop()
        return offset
    
    def end_of_line():
        """Check if all sensors detect the end of the line."""
        data = px.get_grayscale_data()
        state = px.get_line_status(data)  # [bool, bool, bool]
        print(f"End of line check - sensor state: {state}")
        return all(sensor == 1 for sensor in state)
    
    def off_line(): 
        """Check if any sensor is off the line."""
        data = px.get_grayscale_data()
        state = px.get_line_status(data)
        #print(f"Off line check - sensor state: {state}")
        return state[0] != 0 or state[2] != 0
    
    
        
    if __name__ == '__main__':
        print("Final offset:", run())