示例#1
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)
class navegacion(localizacion):
    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()

    def coordenadas_global_a_robot(self, robot, punto_global):
        R = np.array([[cos(robot[3][0]), -sin(robot[3][0]), 0.0],
                      [sin(robot[3][0]),
                       cos(robot[3][0]), 0.0], [0.0, 0.0, 1.0]])

        Rt = R.transpose()
        aux = -(Rt @ robot[:3])

        T = np.array([[Rt[0][0], Rt[0][1], Rt[0][2], aux[0][0]],
                      [Rt[1][0], Rt[1][1], Rt[1][2], aux[1][0]],
                      [Rt[2][0], Rt[2][1], Rt[2][2], aux[2][0]], [0, 0, 0, 1]])

        p = np.array([[punto_global[0][0]], [punto_global[1][0]],
                      [punto_global[2][0]], [1]])
        resultado = T @ p

        return resultado[:3]

    def navegacion_planificada(self, puntos_objetivos, KW):
        vector_hasta_destino = np.array([0.0, 0.0, 0.0])

        for punto in puntos_objetivos:
            while 1:
                robot = self.odometria("RK4")

                vector_hasta_destino[0] = punto[0] - robot[0][0]
                vector_hasta_destino[1] = punto[1] - robot[1][0]
                vector_hasta_destino[2] = punto[2] - robot[2][0]

                modulo = sqrt(vector_hasta_destino @ vector_hasta_destino.T)

                if (modulo <= 0.05):
                    sound.beep()
                    break

                angulo_objetivo = atan2(vector_hasta_destino[1],
                                        vector_hasta_destino[0])
                if angulo_objetivo < 0:
                    angulo_objetivo = angulo_objetivo + 2 * pi

                angulo_robot = robot[3][0]
                while angulo_robot > 2 * pi:
                    angulo_robot = angulo_robot - 2 * pi
                while angulo_robot < 0:
                    angulo_robot = angulo_robot + 2 * pi

                angulo = angulo_objetivo - angulo_robot
                if angulo < -pi:
                    angulo = angulo + 2 * pi
                if angulo > pi:
                    angulo = -(2 * pi - angulo)

                w = KW * angulo

                if w > pi:
                    w = pi
                if w < -pi:
                    w = -pi

                self.correr(0.2, w)

        self.parar()

    def navegacion_reactiva_campos_virtuales(self, objetivo, rTs, KA, KR):
        vector_resultante = np.array([0.0, 0.0, 0.0])

        while 1:
            vector_hasta_destino = self.coordenadas_global_a_robot(
                self.odometria("RK4"), objetivo)
            vector_de_repulsion = np.array([[0.0], [0.0], [0.0]])

            modulo = sqrt(vector_hasta_destino[0].T @ vector_hasta_destino[0])
            if (modulo <= 0.05):
                break

            obstaculo = rTs @ np.array([[self.s.distancia_sonar], [0.0], [0.0],
                                        [1.0]])
            modulo = sqrt(obstaculo[:3][0].T @ obstaculo[:3][0])

            if modulo > 0.45:
                vector_de_repulsion[0][0] = 0.0
                vector_de_repulsion[1][0] = 0.0
                vector_de_repulsion[2][0] = 0.0
            else:
                vector_de_repulsion = ((0.45 - modulo) / 0.45) * obstaculo

            vector_resultante[0] = KA * vector_hasta_destino[0][
                0] - KR * vector_de_repulsion[0][0]
            vector_resultante[1] = KA * vector_hasta_destino[1][
                0] - KR * vector_de_repulsion[1][0]
            vector_resultante[2] = KA * vector_hasta_destino[2][
                0] - KR * vector_de_repulsion[2][0]

            v = 0.2 * vector_resultante[0]
            w = 2 * vector_resultante[1]

            if (v > 0.2):
                v = 0.2
            if (v < -0.2):
                v = -0.2

            if (w > pi):
                w = pi
            if (w < -pi):
                w = -pi

            self.correr(v, w)

        self.parar()

    #Guardar datos
    def empezar_fichero(self, nombre_fichero, tiempo, *args, **kwargs):
        def hilo_fichero():
            self.t.start()
            while self.escribir_fichero_activo:
                for l in args:
                    if l == "tiempo":
                        self.f.write(str(self.t.value_ms / 1000) + " ")
                    elif l == "distancia_sonar":
                        self.f.write(str(self.s.distancia_sonar) + " ")
                    elif l == "otros_sensores_presentes":
                        self.f.write(
                            str(self.s.otros_sensores_presentes) + " ")
                    elif l == "color":
                        self.f.write(str(self.s.color) + " ")
                    elif l == "nombre_color":
                        self.f.write(str(self.s.nombre_color) + " ")
                    elif l == "ambiente":
                        self.f.write(str(self.s.ambiente) + " ")
                    elif l == "reflexion":
                        self.f.write(str(self.s.reflexion) + " ")
                    elif l == "rgb":
                        self.f.write(str(self.s.rgb) + " ")
                    elif l == "voltaje_bateria":
                        self.f.write(str(self.s.voltaje_bateria) + " ")
                    elif l == "corriente_bateria":
                        self.f.write(str(self.s.corriente_bateria) + " ")
                    elif l == "w_motor_derecho":
                        self.f.write(str(self.w_motor_derecho) + " ")
                    elif l == "w_motor_izquierdo":
                        self.f.write(str(self.w_motor_izquierdo) + " ")
                    elif l == "dc_motor_izquierdo":
                        self.f.write(str(self.dc_motor_izquierdo) + " ")
                    elif l == "dc_motor_derecho":
                        self.f.write(str(self.dc_motor_derecho) + " ")
                    elif l == "posicion_motor_derecho":
                        self.f.write(str(self.posicion_motor_derecho) + " ")
                    elif l == "velocidad_linear":
                        self.f.write(str(self.velocidad_linear) + " ")
                    elif l == "velocidad_angular":
                        self.f.write(str(self.velocidad_angular) + " ")
                    elif l == "odometria":
                        if "modo" in kwargs:
                            posicion = self.odometria(kwargs["modo"])
                            self.f.write(
                                str(posicion[0][0]) + " " +
                                str(posicion[1][0]) + " " +
                                str(posicion[2][0]) + " " +
                                str(posicion[3][0]) + " ")
                    elif l == "localizacion_probabilistica":
                        if ("mapa" in kwargs) and ("rox" in kwargs) and (
                                "roy" in kwargs) and (
                                    "rotheta" in kwargs) and ("Rk" in kwargs):
                            mu, sigma = self.localizacion_probabilistica(
                                kwargs["mapa"], kwargs["rox"], kwargs["roy"],
                                kwargs["rotheta"], kwargs["Rk"])
                            self.f.write(
                                str(mu[0][0]) + " " + str(mu[1][0]) + " " +
                                str(mu[2][0]) + " " + str(sigma[0][0]) + " " +
                                str(sigma[0][1]) + " " + str(sigma[0][2]) +
                                " " + str(sigma[1][0]) + " " +
                                str(sigma[1][1]) + " " + str(sigma[1][2]) +
                                " " + str(sigma[2][0]) + " " +
                                str(sigma[2][1]) + " " + str(sigma[2][2]) +
                                " ")
                self.f.write("\n")
                sleep(tiempo)

            self.t.stop()
            self.fin_escribir_fichero = True

        self.f = open(nombre_fichero, "w")
        self.escribir_fichero_activo = True
        self.fin_escribir_fichero = False
        self.id_hilo_fichero = Thread(target=hilo_fichero)
        self.id_hilo_fichero.start()

    def parar_fichero(self):
        self.escribir_fichero_activo = False
        if not self.fin_escribir_fichero:
            self.id_hilo_fichero.join(timeout=None)
        self.f.close()