Exemplo n.º 1
0
    // Update is called once per frame
    void Update()
    {
        if (!sensor.CercaDePared())
        {
            actuador.MoverAdelante();
        }

        if (sensor.CercaDeBasura())
        {
            //Vector posBasura = sensor.GetPosicionBasura();
            actuador.GirarDerecha();
            if (sensor.FrenteBasura())
            {
                actuador.MoverAdelante();
                if (sensor.TocandoBasura())
                {
                    actuador.Aspirar(sensor.GetBasura());
                }
            }
        }
        else
        {
            actuador.MoverAdelante();
        }
    }
 void evitaMuros()
 {
     sensorPared = sensor.CercaDePared();
     disponibles = new List <int>()
     {
         0, 1, 2, 3, 4, 5
     };
     foreach (int sID in sensorPared)
     {
         if (!bloqueados.Contains(sID))
         {
             bloqueados.Add(sID);
         }
         disponibles.Remove(sID);
     }
 }
    void FixedUpdate()
    {
        if (sensor.Bateria() <= 0)
        {
            return;
        }

        if (sensor.CercaDePared())
        {
            actuador.Flotar();
            actuador.Detener();
        }
        else
        {
            actuador.Flotar();
            actuador.Adelante();
        }
    }
    // A partir de este punto se representa un agente basado en modelos.
    // La idea es similar a crear una máquina de estados finita donde se hacen las siguientes consideraciones:
    // - El alfabeto es un conjunto predefinido de percepciones hechas con sensores del agente
    // - El conjunto de estados representa un conjunto de métodos con acciones del agente
    // - La función de transición es un método
    // - El estado inicial se inicializa en Start()
    // - El estado final es opcional
    Estado TablaDeTransicion(Estado estado, Percepcion percepcion)
    {
        switch (estado)
        {
        case Estado.Avanzar:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = Estado.Cargarse;
                break;
            }
            break;

        case Estado.Detenerse:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retroceder;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Girar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Girar;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = sensor.CercaDePared() == false ? Estado.Avanzar : Estado.Retroceder;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Ascender : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Girar:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retroceder;                                 //Antes avanzaba
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Girar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Avanzar : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Retroceder:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retroceder;
                break;

            case Percepcion.NoCercaDePared:
                //estado = sensor.FrenteAPared() == false ? Estado.Avanzar : Estado.Girar;
                //Debug.Log("Estoy aqui");
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = sensor.CercaDePared() == false ? Estado.Avanzar : Estado.Retroceder;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Avanzar : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Retornar:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Avanzar : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Cargarse:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = Estado.Cargarse;
                estado = sensor.Bateria() < sensor.BateriaMaxima() ? Estado.Cargarse : Estado.Ascender;
                break;
            }
            break;

        case Estado.Ascender:
            estado = transform.position.y >= 1.83 ? Estado.Detenerse : Estado.Ascender;
            break;
        }

        return(estado);
    }
Exemplo n.º 5
0
    // Update y FixedUpdate son similares en uso, pero por regla general se recomienda usar
    // FixedUpdate para calcular elementos físicos como el uso de Rigidbody
    void FixedUpdate()
    {
        // El agente no realiza ninguna acción si no tiene batería
        if (sensor.Bateria() <= 0)
        {
            return;
        }

        // A continuación se muestran ejemplos de uso de actuadores y sensores
        // para ser utilizados de manera manual (por una persona):

        if (Input.GetKey(KeyCode.I))
        {
            actuador.Ascender();
        }
        if (Input.GetKey(KeyCode.K))
        {
            actuador.Descender();
        }
        if (!Input.GetKey(KeyCode.I) && !Input.GetKey(KeyCode.K))
        {
            actuador.Flotar();
        }

        if (Input.GetAxis("Vertical") > 0)
        {
            actuador.Adelante();
        }
        if (Input.GetAxis("Vertical") < 0)
        {
            actuador.Atras();
        }

        if (Input.GetKey(KeyCode.J))
        {
            actuador.GirarIzquierda();
        }
        if (Input.GetKey(KeyCode.L))
        {
            actuador.GirarDerecha();
        }

        if (Input.GetAxis("Horizontal") > 0)
        {
            actuador.Derecha();
        }
        if (Input.GetAxis("Horizontal") < 0)
        {
            actuador.Izquierda();
        }


        if (sensor.TocandoBasura())
        {
            Debug.Log("Tocando basura!");
            actuador.Limpiar(sensor.GetBasura());
        }
        if (sensor.TocandoPared())
        {
            Debug.Log("Tocando pared!");
        }

        if (sensor.CercaDeBasura())
        {
            Debug.Log("Cerca de una basura!");
        }
        if (sensor.CercaDePared())
        {
            Debug.Log("Cerca de una pared!");
        }

        if (sensor.FrenteAPared())
        {
            Debug.Log("Frente a pared!");
        }


        if (Input.GetKey(KeyCode.F))
        {
            actuador.Detener();
        }
        if (Input.GetKey(KeyCode.G))
        {
            Debug.Log(sensor.Ubicacion());
        }
    }
Exemplo n.º 6
0
    // En cada frame decidimos el comportamiento del agente.
    // Para este caso, tenemos un control "manual" del agente, es decir, un usuario puede controlarlo mediante
    // un control/gamepad o flechas del teclado y imprime información en consola.
    void Update()
    {
        if (bateria < 50.0f && !sensor.TocandoEstacion())
        {
            actuador.Regresar(actuador.StackX(), 0.25f, actuador.StackZ());
        }
        else if (!sensor.TocandoEstacion())
        {
            actuador.CaminoRegreso(actuador.GetX(), actuador.GetY(), actuador.GetZ());
        }
        if (sensor.TocandoEstacion() && bateria < maxBateria)
        {
            bateria += Time.deltaTime * factorRecarga;
        }
        else
        {
            if (sensor.FrentePared())
            {
                if (bandera == true)
                {
                    actuador.GirarIzquierda();
                }
                else
                {
                    actuador.GirarDerecha();
                    //bandera = !bandera;
                }
            }

            if (sensor.TocandoPared())
            {
                actuador.Detener();
                actuador.MoverAtras();
                if (bandera == true)
                {
                    actuador.GirarIzquierda();
                }
                else
                {
                    actuador.GirarDerecha();
                    //bandera = !bandera;
                }
            }


            if (!sensor.CercaDeBasura())
            {
                actuador.MoverAdelante();
            }
            else
            {
                if (!sensor.FrenteBasura())
                {
                    if (bandera == true)
                    {
                        actuador.GirarIzquierda();
                    }
                    else
                    {
                        actuador.GirarDerecha();
                        //bandera = !bandera;
                    }
                }
                else
                {
                    actuador.MoverAdelante();
                }
                if (sensor.TocandoBasura())
                {
                    actuador.Aspirar(sensor.getBasura());
                    sensor.setTouchBasura(false);
                    sensor.setCercaBasura(false);
                }
            }
        }



        // La batería se consume lentamente. En caso de que se termine, no realiza ninguna acción
        if (bateria <= 0)
        {
            return;
        }
        else
        {
            bateria -= Time.deltaTime;
        }
        // Recargar batería al contacto, sin rebasar límite de carga
        if (sensor.TocandoEstacion() && bateria < maxBateria)
        {
            bateria += Time.deltaTime * factorRecarga;
        }

        /*
         * // Ejemplo de control no-automatico. Requiere de la intervención de una persona
         * // Se realiza con fines demostrativos y de prueba de actuadores y sensores
         * if(Input.GetKeyDown(KeyCode.UpArrow) || Input.GetAxis("Vertical") == 1)
         *      actuador.MoverAdelante();
         * if(Input.GetKeyDown(KeyCode.DownArrow) || Input.GetAxis("Vertical") == -1)
         *      actuador.MoverAtras();
         * if(Input.GetKeyDown(KeyCode.RightArrow) || Input.GetAxis("Horizontal") == 1)
         *      actuador.GirarDerecha();
         * if(Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetAxis("Horizontal") == -1)
         *      actuador.GirarIzquierda();
         */

        // Imprime informacion en la consola (Debug) para verificar algunos eventos
        if (sensor.TocandoPared())
        {
            Debug.Log("Tocando pared");
        }
        if (sensor.TocandoBasura())
        {
            Debug.Log("Tocando basura");
        }
        if (sensor.CercaDeBasura())
        {
            Debug.Log("Cerca de basura");
        }
        if (sensor.CercaDePared())
        {
            Debug.Log("Cerca de pared");
        }
        if (sensor.FrenteBasura())
        {
            Debug.Log("Frente a basura");
        }
        if (sensor.FrentePared())
        {
            Debug.Log("Frente a pared");
        }
    }