示例#1
0
class RobotController:
    def __init__(self):
        self.a_star = AStar()
        self.reset_encoder_states()

    def transition(self, prev_state, state):
        if state == StateName.CHASE:
            print("CHASE")
            self.a_star.motors(SPEED, SPEED)
        elif state == StateName.SEARCH:
            print("SEARCH: start rotating")
            # Record temperature every 5 degrees
            # After spinning 360 degrees, follow the highest
            self.a_star.motors(SPEED, -SPEED)
        elif state == StateName.FILM:
            print("FILM: spying cats")
            self.a_star.motors(0, 0)
        elif state == StateName.TERMINATE:
            print("TERMINATE: stop the robot")
            self.a_star.motors(0, 0)

        return

    def reset_encoder_states(self):
        self.encoders = (0, 0, 0, 0)
        self.threshold = float('inf')
        self.encoder_index = STATIONARY
        self.a_star.reset_encoders(True)

    def update(self):
        self.encoders = a_star.read_encoders()
        if self.encoders[encoder_index] >= threshold:
            print("stopping motors at threshold = {}".format(threshold))
            self.reset_encoder_states()
            return True
        return False

    def turn_right(self, degrees=90, stop=True):
        self.threshold = self._motor_rotations(degrees)
        self.encoder_index = LEFT_FORWARD
        self.a_star.reset_encoders(False)
        self.a_star.motors(SPEED, -SPEED)

    def turn_left(self, degrees=90, stop=True):
        self.threshold = _motor_rotations(degrees)
        self.encoder_index = LEFT_FORWARD
        self.a_star.reset_encoders(False)
        self.a_star.motors(SPEED, -SPEED)

    def turn_left(self, degrees=90, stop=True):
        self._turn(degrees, stop, 'left')

    def forward(self, distance, stop=True):
        self._move(distance, stop, FORWARD)

    def backward(self, distance, stop=True):
        self._move(distance, stop, BACKWARD)

    def _move(self, distance, stop, direction):
        threshold = self._motor_move(distance)
        if direction == FORWARD:
            self.a_star.motors(SPEED, SPEED)
        else:
            self.a_star.motors(-SPEED, -SPEED)

        self._read_encoder_until(threshold, direction)
        if stop:
            self.a_star.motors(0, 0)

    def _motor_move(self, distance):
        return (distance / (2 * math.pi * WHEEL_RADIUS)) * WHEEL_TO_MOTOR

    def _motor_rotations(self, degrees):
        wheelRotations = ROBOT_RADIUS * (abs(degrees) / 360) / WHEEL_RADIUS
        return wheelRotations * WHEEL_TO_MOTOR

    def _read_encoder_until(self, count, index):
        self.a_star.reset_encoders(False)
        while True:
            sleep(ENCODER_INTERVAL)
            reading = self.a_star.read_encoders(index)
            if reading >= count:
                print("reading = {}, threshold = {}".format(reading, count))
                self.a_star.reset_encoders(True)
                break

    def _turn(self, degrees, stop, orientation):
        threshold = self._motor_rotations(degrees)
        if orientation == 'left':
            self.a_star.motors(-SPEED, SPEED)
            self._read_encoder_until(threshold, RIGHT_FORWARD)
        else:
            self.a_star.motors(SPEED, -SPEED)
            self._read_encoder_until(threshold, LEFT_FORWARD)

        if stop:
            self.a_star.motors(0, 0)