Esempio n. 1
0
class RobotControl:

    components = {
        'robot_name':
        'bubbleRob',
        'ultrasonic': [
            'Left_ultrasonic',
            'LM_ultrasonic',
            'Middle_ultrasonic',
            'RM_ultrasonic',
            'Right_ultrasonic',
        ],
        'vision': [
            'Left_Vision_sensor',
            'LM_Vision_sensor',
            'Middle_Vision_sensor',
            'RM_Vision_sensor',
            'Right_Vision_sensor',
        ],
        'motor': [
            'bubbleRob_leftMotor',
            'bubbleRob_rightMotor',
        ]
    }

    def __init__(self):
        self.simulator = Simulator('127.0.0.1', 19997)
        self.simulator.connect()
        self.robot = Robot(components=self.components,
                           simulator=self.simulator)

    def isInCrossing(self, robot):
        reading_vision, data_vision = robot.readVisionSensor(
            robot.components.vision)
        intensities = robot.visionAvarageIntensity(data_vision)

        left_vision = intensities['Left_Vision_sensor']
        middle_vision = intensities['Middle_Vision_sensor']
        right_vision = intensities['Right_Vision_sensor']

        if (left_vision and middle_vision) or (middle_vision and right_vision):
            return True
        elif not ((left_vision and middle_vision) or
                  (middle_vision and right_vision)):
            return False

    def setMotorSpeeds(self, left_motor_speed, right_motor_speed):
        self.robot.setMotorSpeed(
            self.robot.components.motor['bubbleRob_leftMotor'],
            left_motor_speed)
        self.robot.setMotorSpeed(
            self.robot.components.motor['bubbleRob_rightMotor'],
            right_motor_speed)

    def run(self, direction):

        object_in_front = self.robot.objectInFrontOfProximitySensor(
            self.robot.components.ultrasonic['Middle_ultrasonic'])

        if direction == 'straight' and object_in_front is False:
            self.goStraight()
        elif direction == 'right':
            self.turnRight()
        elif direction == 'left':
            self.turnLeft()

        self.setMotorSpeeds(0, 0)
        time.sleep(sleep_time)

    def goStraight(self):

        turn_right = 1
        turn_left = 0

        object_in_front = self.robot.objectInFrontOfProximitySensor(
            self.robot.components.ultrasonic['Middle_ultrasonic'])

        while self.isInCrossing(
                self.robot) is True and object_in_front is False:
            self.setMotorSpeeds(self.robot.VEL_MOT, self.robot.VEL_MOT)

            object_in_front, detected_object_middle_ultrasonic, detected_object_handle_middle_ultrasonic, detected_surface_middle_ultrasonic \
             = self.robot.readProximitySensor(self.robot.components.ultrasonic['Middle_ultrasonic'])
            time.sleep(sleep_time)

        while self.isInCrossing(
                self.robot) is False and object_in_front is False:

            # anda ate os sensores captarem a linha ou obstaculo
            self.setMotorSpeeds(self.robot.VEL_MOT, self.robot.VEL_MOT)

            reading_vision, data_vision = self.robot.readVisionSensor(
                self.robot.components.vision)
            intensities = self.robot.visionAvarageIntensity(data_vision)

            left_vision = intensities['Left_Vision_sensor']
            left_middle_vision = intensities['LM_Vision_sensor']
            middle_vision = intensities['Middle_Vision_sensor']
            right_middle_vision = intensities['RM_Vision_sensor']
            right_vision = intensities['Right_Vision_sensor']

            if right_vision is True:
                self.setMotorSpeeds(self.robot.VEL_MOT, self.robot.VEL_MOT / 4)

                turn_right = 1
                turn_left = 0
            elif right_middle_vision is True:
                self.setMotorSpeeds(self.robot.VEL_MOT, self.robot.VEL_MOT / 2)

                turn_right = 1
                turn_left = 0

            elif left_middle_vision is True:  # robo ta desviando para a direita, gira esquerda
                self.setMotorSpeeds(self.robot.VEL_MOT / 2, self.robot.VEL_MOT)

                turn_right = 0
                turn_left = 1
            elif left_vision is True:  # robo ta desviando para a direita, gira esquerda
                self.setMotorSpeeds(self.robot.VEL_MOT / 4, self.robot.VEL_MOT)

                turn_right = 0
                turn_left = 1

            elif (not (left_vision or left_middle_vision or middle_vision
                       or right_middle_vision or right_middle_vision)):
                if (turn_right):
                    self.setMotorSpeeds(self.robot.VEL_MOT,
                                        self.robot.VEL_MOT / 4)

                elif (turn_left):
                    self.setMotorSpeeds(self.robot.VEL_MOT / 4,
                                        self.robot.VEL_MOT)

            time.sleep(sleep_time)

        position = self.robot.getPosition()
        x_inicial = position[0]
        y_inicial = position[1]
        dx = 0
        dy = 0

        while ((dx < self.robot.DIS_RETO and dy < self.robot.DIS_RETO)
               and object_in_front is False):  # chegar na linha
            self.setMotorSpeeds(self.robot.VEL_MOT, self.robot.VEL_MOT)
            position = self.robot.getPosition()

            object_in_front, detected_object_middle_ultrasonic, detected_object_handle_middle_ultrasonic, detected_surface_middle_ultrasonic \
             = self.robot.readProximitySensor(self.robot.components.ultrasonic['Middle_ultrasonic'])

            dx = abs(position[0] - x_inicial)
            dy = abs(position[1] - y_inicial)

            time.sleep(sleep_time)

    def turnRight(self):

        d_ang = 0.0
        angle = self.robot.getOrientation()
        initial_angle = angle[2]

        while (d_ang < (3.14159265359 / 4 - self.robot.DIS_CURVA)
               ):  # escapar do estado de verificacao dos sensores

            self.setMotorSpeeds(self.robot.VEL_MOT / 1.5,
                                -self.robot.VEL_MOT / 1.5)

            angle = self.robot.getOrientation()

            ang = angle[2]
            d_ang = abs(ang - initial_angle)
            # se houve salto da atan, ignora colocando o salto na posicao normal.Como abs, mas funciona melhor
            if (d_ang > (3.14159265359 / 2 - self.robot.D_ANG)):
                ang = -ang
                d_ang = abs(ang - initial_angle)

            time.sleep(sleep_time)

        reading_vision, data_vision = self.robot.readVisionSensor(
            self.robot.components.vision)
        intensities = self.robot.visionAvarageIntensity(data_vision)

        middle_vision = intensities['Middle_Vision_sensor']

        while (
                middle_vision
        ):  # verificar se ta no mesmo estado, tecnicamente inutil devido a funcao acima

            self.setMotorSpeeds(self.robot.VEL_MOT / 1.5,
                                -self.robot.VEL_MOT / 1.5)

            reading_vision, data_vision = self.robot.readVisionSensor(
                self.robot.components.vision)
            intensities = self.robot.visionAvarageIntensity(data_vision)

            middle_vision = intensities['Middle_Vision_sensor']
            time.sleep(sleep_time)

        while not middle_vision:  # gira ate os sensores captarem a linha
            self.setMotorSpeeds(self.robot.VEL_MOT / 1.5,
                                -self.robot.VEL_MOT / 1.5)

            reading_vision, data_vision = self.robot.readVisionSensor(
                self.robot.components.vision)
            intensities = self.robot.visionAvarageIntensity(data_vision)

            middle_vision = intensities['Middle_Vision_sensor']
            time.sleep(sleep_time)

    def turnLeft(self):
        d_ang = 0.0
        angle = self.robot.getOrientation()
        initial_angle = angle[2]

        while d_ang < (3.14159265359 / 4 - self.robot.DIS_CURVA
                       ):  # escapar do estado de verificacao dos sensores
            self.setMotorSpeeds(-self.robot.VEL_MOT / 1.5,
                                self.robot.VEL_MOT / 1.5)

            angle = self.robot.getOrientation()

            ang = angle[2]
            d_ang = abs(ang - initial_angle)
            # se houve salto da atan, ignora colocando o salto na posicao normal.Como abs, mas funciona melhor
            if (d_ang > (3.14159265359 / 2 - self.robot.D_ANG)):
                ang = -ang
                d_ang = abs(ang - initial_angle)
            time.sleep(sleep_time)

        reading_vision, data_vision = self.robot.readVisionSensor(
            self.robot.components.vision)
        intensities = self.robot.visionAvarageIntensity(data_vision)

        middle_vision = intensities['Middle_Vision_sensor']

        while middle_vision:  # verificar se ta no mesmo estado, tecnicamente inutil devido a funcao acima
            self.setMotorSpeeds(-self.robot.VEL_MOT / 1.5,
                                self.robot.VEL_MOT / 1.5)

            reading_vision, data_vision = self.robot.readVisionSensor(
                self.robot.components.vision)
            intensities = self.robot.visionAvarageIntensity(data_vision)

            middle_vision = intensities['Middle_Vision_sensor']
            time.sleep(sleep_time)

        while not middle_vision:  #gira ate os sensores captarem a linha
            self.setMotorSpeeds(-self.robot.VEL_MOT / 1.5,
                                self.robot.VEL_MOT / 1.5)
            reading_vision, data_vision = self.robot.readVisionSensor(
                self.robot.components.vision)
            intensities = self.robot.visionAvarageIntensity(data_vision)
            middle_vision = intensities['Middle_Vision_sensor']
            time.sleep(sleep_time)

    def isWalking(self):
        if self.isInCrossing(self.robot):
            return True

        return False