示例#1
0
        def _wait(self, wait_for_button_press, wait_for_button_release, timeout_ms):
            stopwatch = StopWatch()
            stopwatch.start()

            # wait_for_button_press/release can be a list of buttons or a string
            # with the name of a single button.  If it is a string of a single
            # button convert that to a list.
            if isinstance(wait_for_button_press, str):
                wait_for_button_press = [wait_for_button_press, ]

            if isinstance(wait_for_button_release, str):
                wait_for_button_release = [wait_for_button_release, ]

            for event in self.evdev_device.read_loop():
                if event.type == evdev.ecodes.EV_KEY:
                    all_pressed = True
                    all_released = True
                    pressed = self.buttons_pressed

                    for button in wait_for_button_press:
                        if button not in pressed:
                            all_pressed = False
                            break

                    for button in wait_for_button_release:
                        if button in pressed:
                            all_released = False
                            break

                    if all_pressed and all_released:
                        return True

                    if timeout_ms is not None and stopwatch.value_ms >= timeout_ms:
                        return False
示例#2
0
    def driveStraightForDistance(self,
                                 distance,
                                 speedLeft=None,
                                 speedRight=None,
                                 stopAtEnd=True):
        ''' Drive for given distance.

    Args:
      distance: distance to drive in mm
      speedLeft: speed in mm/s (left motor)
      speedRight: speed in mm/s (right motor)
      stopAtEnd (bool): brake at end of movement
    '''
        if speedLeft == None or speedLeft == 0:
            speedLeft = self.defaultSpeed

        if speedRight == None or speedRight == 0:
            speedRight = self.defaultSpeed

        degPerSecLeft = 360 * speedLeft / (pi * self.wheel_diameter)
        degPerSecRight = 360 * speedRight / (pi * self.wheel_diameter)

        driveTime = StopWatch()
        driveTime.start()

        self.leftDriveMotor.on(SpeedNativeUnits(degPerSecLeft), block=False)
        self.rightDriveMotor.on(SpeedNativeUnits(degPerSecRight), block=False)

        while driveTime.value_ms <= abs(distance / speedLeft) * 1000:
            sleep(0.02)

        if stopAtEnd:
            self.leftDriveMotor.stop()
            self.rightDriveMotor.stop()
            sleep(0.01)
    def __init__(self, motor_izquierdo, motor_derecho, radio_rueda,
                 separacion_ruedas, posicion, nav_sonar, nav_sensor_color):
        localizacion.__init__(self, motor_izquierdo, motor_derecho,
                              radio_rueda, separacion_ruedas, posicion,
                              nav_sonar, nav_sensor_color)

        #Fichero
        self.f = None
        self.escribir_fichero_activo = False
        self.fin_escribir_fichero = True
        self.t = StopWatch()
示例#4
0
        def _animate_rainbow():
            # state 0: (LEFT,RIGHT) from (0,0) to (1,0)...RED
            # state 1: (LEFT,RIGHT) from (1,0) to (1,1)...AMBER
            # state 2: (LEFT,RIGHT) from (1,1) to (0,1)...GREEN
            # state 3: (LEFT,RIGHT) from (0,1) to (0,0)...OFF
            state = 0
            left_value = 0
            right_value = 0
            MIN_VALUE = 0
            MAX_VALUE = 1
            self.all_off()
            duration_ms = duration * 1000 if duration is not None else None
            stopwatch = StopWatch()
            stopwatch.start()

            while True:

                if state == 0:
                    left_value += increment_by
                elif state == 1:
                    right_value += increment_by
                elif state == 2:
                    left_value -= increment_by
                elif state == 3:
                    right_value -= increment_by
                else:
                    raise Exception("Invalid state {}".format(state))

                # Keep left_value and right_value within the MIN/MAX values
                left_value = min(left_value, MAX_VALUE)
                right_value = min(right_value, MAX_VALUE)
                left_value = max(left_value, MIN_VALUE)
                right_value = max(right_value, MIN_VALUE)

                self.set_color(group1, (left_value, right_value))
                self.set_color(group2, (left_value, right_value))

                if state == 0 and left_value == MAX_VALUE:
                    state = 1
                elif state == 1 and right_value == MAX_VALUE:
                    state = 2
                elif state == 2 and left_value == MIN_VALUE:
                    state = 3
                elif state == 3 and right_value == MIN_VALUE:
                    state = 0

                if self.animate_thread_stop or stopwatch.is_elapsed_ms(
                        duration_ms):
                    break

                sleep(sleeptime)

            self.animate_thread_stop = False
            self.animate_thread_id = None
示例#5
0
    def wait_for_bump(self, buttons, timeout_ms=None):
        """
        Wait for the button to be pressed down and then released.
        Both actions must happen within timeout_ms.
        """
        stopwatch = StopWatch()
        stopwatch.start()

        if self.wait_for_pressed(buttons, timeout_ms):
            if timeout_ms is not None:
                timeout_ms -= stopwatch.value_ms
            return self.wait_for_released(buttons, timeout_ms)

        return False
示例#6
0
文件: led.py 项目: enterei/ev3robot
        def _animate_flash():
            even = True
            duration_ms = duration * 1000 if duration is not None else None
            stopwatch = StopWatch()
            stopwatch.start()

            while True:
                if even:
                    for group in groups:
                        self.set_color(group, color)
                else:
                    self.all_off()

                if self.animate_thread_stop or stopwatch.is_elapsed_ms(duration_ms):
                    break

                even = not even
                sleep(sleeptime)

            self.animate_thread_stop = False
            self.animate_thread_id = None
示例#7
0
        def _animate_flash():
            even = True
            duration_ms = duration * 1000
            stopwatch = StopWatch()
            stopwatch.start()

            while True:
                if even:
                    for group in groups:
                        self.set_color(group, color)
                else:
                    self.all_off()

                if self.animate_thread_stop or stopwatch.value_ms >= duration_ms:
                    break

                even = not even
                sleep(sleeptime)

            self.animate_thread_stop = False
            self.animate_thread_id = None
示例#8
0
文件: led.py 项目: enterei/ev3robot
        def _animate_cycle():
            index = 0
            max_index = len(colors)
            duration_ms = duration * 1000 if duration is not None else None
            stopwatch = StopWatch()
            stopwatch.start()

            while True:
                for group in groups:
                    self.set_color(group, colors[index])

                index += 1

                if index == max_index:
                    index = 0

                if self.animate_thread_stop or stopwatch.is_elapsed_ms(duration_ms):
                    break

                sleep(sleeptime)

            self.animate_thread_stop = False
            self.animate_thread_id = None
示例#9
0
文件: led.py 项目: enterei/ev3robot
        def _animate_police_lights():
            self.all_off()
            even = True
            duration_ms = duration * 1000 if duration is not None else None
            stopwatch = StopWatch()
            stopwatch.start()

            while True:
                if even:
                    self.set_color(group1, color1)
                    self.set_color(group2, color2)
                else:
                    self.set_color(group1, color2)
                    self.set_color(group2, color1)

                if self.animate_thread_stop or stopwatch.is_elapsed_ms(duration_ms):
                    break

                even = not even
                sleep(sleeptime)

            self.animate_thread_stop = False
            self.animate_thread_id = None
示例#10
0
from ev3dev2.console import Console
from ev3dev2.sound import Sound
from random import randint
from threading import Thread
from time import sleep

# Logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)5s: %(message)s')
log = logging.getLogger(__name__)
log.info("Starting Gyro Boy")

# Initialize
running = True
state = "reset"
timer = StopWatch()
timer.start()

# Brick variables
sound = Sound()
leds = Leds()
console = Console()
gyro_sensor = GyroSensor(INPUT_2)
gyro_sensor.mode = GyroSensor.MODE_GYRO_RATE
arms_motor = MediumMotor(OUTPUT_C)
left_motor = LargeMotor(OUTPUT_D)
right_motor = LargeMotor(OUTPUT_A)
color_sensor = ColorSensor(INPUT_1)
ultra_sonic_sensor = UltrasonicSensor(INPUT_4)

示例#11
0
    def test_stopwatch(self):
        sw = StopWatch()
        self.assertEqual(str(sw), "StopWatch: 00:00:00.000")

        sw = StopWatch(desc="test sw")
        self.assertEqual(str(sw), "test sw: 00:00:00.000")
        self.assertEqual(sw.is_started, False)

        sw.start()
        self.assertEqual(sw.is_started, True)
        self.assertEqual(sw.value_ms, 0)
        self.assertEqual(sw.value_secs, 0)
        self.assertEqual(sw.value_hms, (0, 0, 0, 0))
        self.assertEqual(sw.hms_str, "00:00:00.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), False)
        self.assertEqual(sw.is_elapsed_secs(3), False)

        set_mock_ticks_ms(1500)
        self.assertEqual(sw.is_started, True)
        self.assertEqual(sw.value_ms, 1500)
        self.assertEqual(sw.value_secs, 1.5)
        self.assertEqual(sw.value_hms, (0, 0, 1, 500))
        self.assertEqual(sw.hms_str, "00:00:01.500")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), False)
        self.assertEqual(sw.is_elapsed_secs(3), False)

        set_mock_ticks_ms(3000)
        self.assertEqual(sw.is_started, True)
        self.assertEqual(sw.value_ms, 3000)
        self.assertEqual(sw.value_secs, 3)
        self.assertEqual(sw.value_hms, (0, 0, 3, 0))
        self.assertEqual(sw.hms_str, "00:00:03.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), True)
        self.assertEqual(sw.is_elapsed_secs(3), True)

        set_mock_ticks_ms(1000 * 60 * 75.5)  #75.5 minutes
        self.assertEqual(sw.is_started, True)
        self.assertEqual(sw.value_ms, 1000 * 60 * 75.5)
        self.assertEqual(sw.value_secs, 60 * 75.5)
        self.assertEqual(sw.value_hms, (1, 15, 30, 0))
        self.assertEqual(sw.hms_str, "01:15:30.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), True)
        self.assertEqual(sw.is_elapsed_secs(3), True)

        try:
            # StopWatch can't be started if already running
            sw.start()
            self.fail()
        except StopWatchAlreadyStartedException:
            pass

        # test reset behavior
        sw.restart()
        self.assertEqual(sw.is_started, True)
        self.assertEqual(sw.value_ms, 0)
        self.assertEqual(sw.value_secs, 0)
        self.assertEqual(sw.value_hms, (0, 0, 0, 0))
        self.assertEqual(sw.hms_str, "00:00:00.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), False)
        self.assertEqual(sw.is_elapsed_secs(3), False)

        set_mock_ticks_ms(1000 * 60 * 75.5 + 3000)
        self.assertEqual(sw.is_started, True)
        self.assertEqual(sw.value_ms, 3000)
        self.assertEqual(sw.value_secs, 3)
        self.assertEqual(sw.value_hms, (0, 0, 3, 0))
        self.assertEqual(sw.hms_str, "00:00:03.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), True)
        self.assertEqual(sw.is_elapsed_secs(3), True)

        # test stop
        sw.stop()
        set_mock_ticks_ms(1000 * 60 * 75.5 + 10000)
        self.assertEqual(sw.is_started, False)
        self.assertEqual(sw.value_ms, 3000)
        self.assertEqual(sw.value_secs, 3)
        self.assertEqual(sw.value_hms, (0, 0, 3, 0))
        self.assertEqual(sw.hms_str, "00:00:03.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), True)
        self.assertEqual(sw.is_elapsed_secs(3), True)

        # test reset
        sw.reset()
        self.assertEqual(sw.is_started, False)
        self.assertEqual(sw.value_ms, 0)
        self.assertEqual(sw.value_secs, 0)
        self.assertEqual(sw.value_hms, (0, 0, 0, 0))
        self.assertEqual(sw.hms_str, "00:00:00.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), False)
        self.assertEqual(sw.is_elapsed_secs(3), False)

        set_mock_ticks_ms(1000 * 60 * 75.5 + 6000)
        self.assertEqual(sw.is_started, False)
        self.assertEqual(sw.value_ms, 0)
        self.assertEqual(sw.value_secs, 0)
        self.assertEqual(sw.value_hms, (0, 0, 0, 0))
        self.assertEqual(sw.hms_str, "00:00:00.000")
        self.assertEqual(sw.is_elapsed_ms(None), False)
        self.assertEqual(sw.is_elapsed_secs(None), False)
        self.assertEqual(sw.is_elapsed_ms(3000), False)
        self.assertEqual(sw.is_elapsed_secs(3), False)
示例#12
0
    def followLineDist(self,
                       distance,
                       sensor,
                       sideToFollow,
                       stopAtEnd,
                       speed,
                       gain_multiplier=1):
        ''' Drive forward following line.  

    Uses direct control of drive motors and PD control. 

    Args:
      distance: distance to follow line in mm
      sensor: colorsensor to use for line following
      sideToFollow: which side of line to follow:  LineEdge.LEFT or LineEdge.RIGHT
      stopAtEnd (bool): Stop motors at end of line following
      speed: speed in mm/s
      gain_multiplier: multiplier for P and D gains
      
    '''
        degPerSec = 360 * speed / (pi * self.wheel_diameter)
        propGain = 6.0 * gain_multiplier
        derivGain = 6 * gain_multiplier

        target = (self.blackThreshold + self.whiteThreshold) / 2

        print("******* starting line following ********")
        # print("error,Pterm,Dterm")

        # initialize term for derivative calc
        previousError = target - avgReflection(sensor, 2)

        i = 0
        driveTime = StopWatch()
        driveTime.start()

        while driveTime.value_ms <= abs(distance / speed) * 1000:
            # calc error and proportional term
            error = target - avgReflection(sensor, 2)
            Pterm = propGain * error

            # calc d(error)/d(t) and derivative term
            d_error_dt = error - previousError
            Dterm = derivGain * d_error_dt
            previousError = error

            if sideToFollow == LineEdge.RIGHT:
                self.leftDriveMotor.on(SpeedNativeUnits(degPerSec + Pterm +
                                                        Dterm),
                                       block=False)
                self.rightDriveMotor.on(SpeedNativeUnits(degPerSec - Pterm -
                                                         Dterm),
                                        block=False)
                # eprint("{:7.2f},{:7.2f},{:7.2f}".format(error, Pterm, Dterm)) # for debugging

            if sideToFollow == LineEdge.LEFT:
                self.leftDriveMotor.on(SpeedNativeUnits(degPerSec - Pterm -
                                                        Dterm),
                                       block=False)
                self.rightDriveMotor.on(SpeedNativeUnits(degPerSec + Pterm +
                                                         Dterm),
                                        block=False)
                # eprint("{:7.2f},{:7.2f},{:7.2f}".format(error, Pterm, Dterm)) # for debugging

        # eprint("line following complete")

        if stopAtEnd:
            self.leftDriveMotor.stop()
            self.rightDriveMotor.stop()
            sleep(0.01)

        # Play sound when we stop line following
        sound.beep()