def _create_motor_controller(self):
        if self._local_flag:
            return FakeMotorController()

        return StmMotorController(self._serial, )
Пример #2
0
 def setUp(self) -> None:
     self.serial_communication = MagicMock()
     self.stm_motor_controller = StmMotorController(
         self.serial_communication)
Пример #3
0
class TestStmMotorController(TestCase):
    A_DIRECTION = Direction.FORWARD
    A_DISTANCE = Distance(distance=10)
    A_MOVEMENT = Movement(A_DIRECTION, A_DISTANCE)
    A_MOVEMENT_COMMAND = MovementCommand(Direction.LEFT, Speed(0.01),
                                         CommandDuration(0))
    A_STOP_COMMAND = MovementCommand(Direction.STOP, Speed(0),
                                     CommandDuration(0.5))
    A_MOVEMENT_COMMAND_LIST = [
        MovementCommand(Direction.FORWARD, Speed(10), CommandDuration(10)),
        A_STOP_COMMAND,
    ]

    def setUp(self) -> None:
        self.serial_communication = MagicMock()
        self.stm_motor_controller = StmMotorController(
            self.serial_communication)

    def test_givenMultipleMovementCommands_whenActuateWheels_thenWriteOnSerialOncePerCommand(
        self, ):
        commands = self.A_MOVEMENT_COMMAND_LIST

        self.stm_motor_controller.actuate_wheels(commands)

        self.assertEqual(
            len(self.A_MOVEMENT_COMMAND_LIST),
            self.serial_communication.write.call_count,
        )

    def test_givenSingleMovementCommand_whenActuateWheels_thenSerializeCommandBeforeWritingOnSerial(
        self, ):
        a_direction = Direction.LEFT
        a_speed = Speed(0.147)
        commands = [
            MovementCommand(a_direction, a_speed, CommandDuration(100))
        ]
        expected_serialization = b"\x03+\x87\x16>"

        self.stm_motor_controller.actuate_wheels(commands)

        self.serial_communication.write.assert_called_with(
            expected_serialization)

    def test_whenRotate_thenSerializeCommandBeforeWritingOnSerial(self):
        a_direction = Direction.CLOCKWISE
        an_angle = 15.4
        rotation_command = RotationCommand(a_direction, an_angle)
        expected_serialization = b"\x05ffvA"

        self.stm_motor_controller.rotate(rotation_command)

        self.serial_communication.write_and_readline.assert_called_with(
            expected_serialization)

    def test_whenRotate_thenWaitForRobotResponse(self):
        a_direction = Direction.CLOCKWISE
        an_angle = 15.4
        rotation_command = RotationCommand(a_direction, an_angle)

        self.stm_motor_controller.rotate(rotation_command)

        self.serial_communication.write_and_readline.assert_called()
        self._capture.set(cv2.CAP_PROP_FRAME_WIDTH, EMBEDDED_CAMERA_IMAGE_SIZE[0])
        self._capture.set(cv2.CAP_PROP_FRAME_HEIGHT, EMBEDDED_CAMERA_IMAGE_SIZE[1])
        self._capture.set(cv2.CAP_PROP_BUFFERSIZE, 1)

    def _close_capture(self):
        self._capture.release()


if __name__ == "__main__":
    movement_command_factory = MovementCommandFactory(
        ROBOT_MAXIMUM_SPEED,
        SERVOING_CONSTANT,
        BASE_COMMAND_DURATION,
    )
    motor_controller = StmMotorController(
        serial.Serial(port=STM_PORT_NAME, baudrate=STM_BAUD_RATE)
    )
    camera = OpenCvEmbeddedCamera(0)

    vision_service = VisionService(camera, MagicMock())

    ALIGNED_OHMMETER_HORIZONTAL_POSITION = 349
    OHMMETER_ALIGNMENT_THRESHOLD = 10
    movement_service = MovementService(movement_command_factory, motor_controller)
    starting_zone_line_detector = OpenCvStartingZoneLineDetector()

    ohmmeter_alignment_corrector = OhmmeterAlignmentCorrector(
        Position(ALIGNED_OHMMETER_HORIZONTAL_POSITION, 0),
        OHMMETER_ALIGNMENT_THRESHOLD,
        starting_zone_line_detector,
    )
Пример #5
0
from infra.motor_controller.StmMotorController import StmMotorController
from service.movement.MovementService import MovementService

if __name__ == "__main__":
    straight_movements = [Movement(Direction.FORWARD, Distance(1))]
    turn_movements = [
        Movement(Direction.FORWARD, Distance(0.5)),
        Movement(Direction.LEFT, Distance(0.5)),
    ]

    movement_command_factory = MovementCommandFactory(
        Speed(ROBOT_MAXIMUM_SPEED),
        Speed(SERVOING_CONSTANT),
        CommandDuration(BASE_COMMAND_DURATION),
    )
    motor_controller = StmMotorController(
        serial.Serial(STM_PORT_NAME, STM_BAUD_RATE))

    movement_service = MovementService(movement_command_factory,
                                       motor_controller)

    print("----------- Straight path -------------")
    input("Press any key when ready to start......")
    movement_service.move(straight_movements)

    print(" -------- Straight path over ----------")

    input("Press any key when ready to continue......")
    print()

    print("----------- Turning Path --------------")
    input("Press any key when ready to start......")
Пример #6
0
            horizontal_movement_command = (
                self._puck_alignment_corrector.calculate_horizontal_correction(
                    current_image, puck_color))
            if horizontal_movement_command.get_direction() == Direction.STOP:
                self._movement_service.execute_movement_command(
                    horizontal_movement_command)
                break


if __name__ == "__main__":
    image_center = Position(320, 240)
    camera = FakeCamera(0)
    vision_service = FakeVisionService(camera)
    puck_detector = OpenCvPuckDetector()
    serial = serial.Serial(port=STM_PORT_NAME, baudrate=STM_BAUD_RATE)
    stm_motor_controller = StmMotorController(serial)
    movement_service = MovementService(
        MovementCommandFactory(ROBOT_MAXIMUM_SPEED, SERVOING_CONSTANT,
                               BASE_COMMAND_DURATION, None, None),
        stm_motor_controller,
    )
    puck_alignment_corrector = PuckAlignmentCorrector(image_center, 10,
                                                      puck_detector)

    horizontal_alignment_corrector = HorizontalAlignmentCorrector(
        movement_service, vision_service, puck_alignment_corrector)

    puck_color_to_align = Color.YELLOW

    horizontal_alignment_corrector.correct_horizontal_alignment(
        puck_color_to_align)