viernes, 2 de diciembre de 2011

Robot Sumo

Robot Destructor
Autor: Felipe Lagos Morapasten
Competencia: Creatividad e innovación. (Nivel 1)
Palabras Clave: Programación de Robot, NXC, Robótica, Kit Lego.


Descripción de la Actividad

Realizando la competencia de Creatividad e innovación, quiero mostrar a ustedes la actividad número 5 del Curso de Programación de Robots, donde se tuvo que realizar un código fuente en NXC.

La problemática de la actividad consistió en crear un robot luchador para la competencia de Torneo de Sumos, donde nuestro robot, se debía enfrentar a más adversarios robots, todo esto fue determinado de manera aleatoria con la realización de un sorteo, el robot necesita establecer una estructura (diseño) específica para combatir, además de un patrón para cuando ataca y a su vez cuando se defiende, evitando en cualquier momento salirse de la plataforma, con forma ovalada (circulo), todo lo anteriormente nombrado es se puede llevar a cabo con el uso de sensores (luz, tacto, proximidad). 

 Solución:

Para resolver esta actividad, lo primero que se debe realizar es diseñar la estructura que posee el robot para combatir para luego pasar a la realización del pseudocódigo, que nos ayuda en la creación del código fuente

El Robot SUMO está diseñado para resistir ataques del enemigo y a su vez para derribarlo, todo esto tiene una serie de partes dedicadas a cada función.

El robot, consta de una tracción de 4 ruedas delanteras que están comandadas por dos motores (A, C) y un eje trasero encargado de realizar los giros, el uso del eje disminuyo considerablemente el tiempo de giro de nuestro robot, lo cual es una evidente ventaja a la hora de esquivar o buscar el punto débil del otro robot:



Con referencia al ataque el robot tiene una rampla para desestabilizar al enemigo, la cual está ubicada en el frente del robot, sin espacios libres y anclada firmemente al chasis, su función es desestabilizar al robot oponente y dejarlo boca arriba.


Además el robot tiene unos engranajes montados sobre la rampla, accionados por un motor (B), que actúan como impulso extra para desestabilizar y a su vez desarmar al enemigo, ya que estos engranajes giran de manera ascendente hacia la rampla:
 

Para la ubicación del enemigo, el robot consta de un sensor de ultra sonido ubicado en la zona superior de este, el sensor de ultra sonido está montado de una manera tal que el robot oponente jamás llegue a él y aunque lo hiciera, no podría desmontarlo:



Por otra parte, para su defensa el robot SUMO consta de dos sensores de tacto, ubicados a su costado, que detectan enemigos que ataquen por los lados, los sensores están anclados al chasis y a los motores principales (A y C), lo que les da una firmeza a prueba de golpes:

 


Además Consta de un chasis, con los motores de movimiento ubicados a los constados del ladrillo (Cerebro del Robot), esto le da más estabilidad al momento de impactarse contra su oponente, la rueda de eje está protegida por biga y además el sensor de luz, que evita que el robot salga de la arena, está protegido por la rampla, unas vigas de costado y dos ligas que le dan una especie de suspensión para amortiguar los impactos de la rampla.




Pseudocodigo:

modo_ataque
  {  Si (US detecta algo a 20 cm)
          {avanzar y embestirlo } }

modo_defensa1
   { avanzar doblando a la derecha}

 modo_defensa2
  {avanzar doblando a la izquierda}

modo_antisalida
  {retroceder}

Mientras(Siempre)
    { activar sensores luz, US Tacto1,Tacto2
     avanzar 1/2s
      giro aleatorio
     Si (US detecta algo a 20cm)
      { apagar motores
       modo_ataque}
 
    Si (sensor Tacto1 ==1)
       {apagar motores
        modo_defensa1}
 
    Si(sensor Tacto2 ==1)
      {apagar motores
       modo_defensa2}

    Si(sensor luz 1 detecta Negro)
       { apagar motores
        modo_antisalida }
    }

 
Uso de sensores:
El uso de los sensores del robot es de esencial importancia en esta lucha de sumo. A continuación explicaré el uso correspondiente de cada uno de los sensores:

Sensor de luz: Está ubicado en frente del robot y por debajo de la pala, apuntando hacia el piso. Su trabajo consiste en que si el sensor encuentra una superficie distinta a la blanca (negro) entonces el robot tiene que retroceder y dar un giro para así no poder salirse de la pista.

Sensor de ultrasonido: Está ubicado adelante del robot, por encima de la pala y apuntando hacia adelante, la acción de este sensor consiste en que si se detecta algo por delante de él, el robot se dirige derecho accionando sus motores a la máxima potencia.

Sensores de tacto: Estos están ubicados en los laterales del robot, ellos actúan al ser presionados lo cual provoca que un motor retroceda y otro siga su curso hacia adelante dependiendo del sensor que se accione. Por ejemplo  al ser accionado el sensor izquierdo el robot gira hacia la izquierda y si es accionado el de la derecha girara en esa dirección.

Patrón de ataque y defensa:

 La lógica para esta actividad, que al principio llevó tiempo que sea aprobada, aceptada y que para esta actividad se usó con la finalidad de ganar fue la de emplear el método while que realiza todo esto siempre si la condición se cumple (sea verdadera) , la condición en este caso es verdadera por lo que lo ejecuta indefinidamente, la única forma de detenerlo es hacerlo por uno mismo ,manualmente dentro de esto lo primero fue realizar un avance que nos posicionará cerca del centro del círculo para ganar una mejor visión sobre nuestra rival a derrotar, mientras pasa este avance existen diferentes otras condiciones que permiten que el rumbo cambie de lo que tiene pensando ejecutar, tomando otro camino, pasando a otro patrón. Un patrón relevante en esta actividad que nos lleva hacia el resultado positivo es el patrón de ataque que necesita visualizar a los enemigos para ejecutarse, si existe ataque a la vez también existe la defensa, el patrón de defensa en este caso se divide en 2 partes por los diferentes sucesos que pueden ocurrir durante una pelea, algunos inesperados como el ataque por la parte trasera, nuestro robot en este caso tiene 2 sensores que están ubicados a los lados del robot (izquierdo y derecha), al finalizar el patrón sea cual sea el resultado vuelve a lo inicial en busca de iniciar otro patrón.
 sub modo_antisalida()
{
OnRev(OUT_AC,100);
Wait(800);
OnFwd(OUT_C,100);
OnRev (OUT_A,100);
Wait(1000);
}
 Esta parte del código nos permite mantenernos dentro del círculo que igual se podría considerar como defensa importante para no realice un suicidio nuestro robot (algo que se pudo apreciar en el torneo) funciona con el sensor de luz mediante una condición esto hace que retroceda por 1 segundo y realice un giro (entre)  lo que se hace que se posicione en dirección al centro del círculo y vuelva a tener una visión que le permite efectuar algún patrón.
sub modo_ataque()
{
OnFwd (OUT_AC,100);
Wait (500);
}
Este trozo del código corresponde al patrón de ataque utilizado que consiste es embestir con una máxima potencia (100) hasta que el robot detectado producto de la embestida salga del circulo o bien no sea visualizado, desaparezca de la vista del robot por medio del sensor de proximidad a una cierta distancia declarada (10 centímetros) donde la fuerza y potencia que ejerce nuestro robot lo convierte en un buen patrón de ataque.
 sub modo_defensa1()   
{
OnFwd(OUT_A,100);
OnFwd(OUT_C,50);  
Wait (800);
}
 Este fragmento del código  donde el sensor de tacto izquierdo corresponde a la defensa1 que hace que si se activa mediante un golpe se desviará en el mismo sentido donde fue detectado el golpe del rival o los rivales, esto quiere decir si fue golpeado a la lado izquierdo, la desviación ocurrirá hacia el lado izquierdo esquivando al robot que nos ataca con la intención de derrotarnos.
 sub modo_defensa2()
{
OnFwd(OUT_C,100);
OnFwd(OUT_A,50);  
Wait (800);
}
Esta última parte del código correspondiente a la defensa2 donde el sensor de tacto se ubica a lado derecho de nuestro robot, al momento de activarse mediante un golpe se va a desviar en el mismo sentido que detecte el golpe, en este caso lo detecta en la dirección derecha, el movimiento de doblar lo realizar a esa misma dirección del golpe lo que realiza que esquive al robot que nos ataca con la intención de derrotarnos.


El código fuente para la actividad de Lucha de Sumo en NXC es el siguiente: 

#define DISTANCIA 10  // Variable usada para que el sensor de proximidad
                                       // detecte algo a los 10 cm
#define NEGRO 40 // Rango de luz para considerar que es negro

sub modo_antisalida()
{
  OnRev(OUT_AC,100); // Instrucción para que retroceda
  Wait(800);
  OnFwd(OUT_C,100); // Las dos instrucciones juntan hacen que gire por 1 segundo.
  OnRev (OUT_A,100);
  Wait(1000);

  }

sub modo_ataque()
{ OnFwd (OUT_AC,100); // Instruccion que valla hacia adelante por medio segundo
  Wait (500);
     }

sub modo_defensa1()   // Ubicado en el lado izquierdo
{ OnFwd(OUT_A,100);  // Orden sumada a la siguiente que hace que doble
  OnFwd(OUT_C,50);  // usada para esquivar el golpe.
  Wait (800);

}

 sub modo_defensa2() // Lado derecho
{
  OnFwd(OUT_C,100); // Orden en conjunto con la siguiente  usada para doblar
  OnFwd(OUT_A,50);  // al lado contrario del golpe
  Wait (800);

}

task main ()
  {
       SetSensorLight (IN_3); // Encender sensor de luz
       SetSensorTouch (IN_1); // Encender sensor de tacto izquierdo
       SetSensorTouch (IN_2); // Encender sensor de tacto derecho
       SetSensorLowspeed (IN_4); // Encender sensor de proximidad


         while (true) // Mientras sea verdadero
         {
if (Sensor(IN_3) > NEGRO)   // Si el sensor de luz detecta mayor que Negro
{ OnFwd (OUT_ABC, 100); }  // Instruccion que valla hacia adelante.


       if (SensorUS(IN_4) < DISTANCIA) // Si el sensor de proximidad es menor
                                       //  a la distancia
       {

       modo_ataque();   // Hace un llamado al modo_ataque
        }

       if (Sensor(IN_1) == 1) // Si el sensor de tacto izquierdo es igual a 1
      {
       modo_defensa1(); // Llama a este modo_defensa1 para que se ejecute
       }

       if (Sensor(IN_2) == 1) // Si el sensor tacto derecho es igual a 1
       {
        modo_defensa2();// Llamado a este modo para que se ejecute
        }

        if (Sensor(IN_3) < NEGRO)  // Si el sensor de luz detecta un valor menor
        {                          // al negro
         modo_antisalida();        // Instruccion para que se ejecute este modo
         }

       }      // Cierre del While
       }      // Cierre del task main

En el código se puede apreciar el uso de subrutinas para los patrones de ataque, defensa y evitar que salga, además de decisiones con distintas condiciones para la ejecución del programa, por ejemplo cuando el sensor de proximidad detecte algo menor a la distancia ( 10 centímetros) debe embestir

El video de esta actividad es el siguiente:



Reflexión:

Para la realización de esta actividad, la mayor dificultad se presentó en diseñar un modelo, acorde a lo que el robot debe efectuar, en este caso luchar contra sus contrincante, la programación que contiene el robot, no presento conflicto ya que está marcado por condiciones la actividad, esto determina que debe hacer en un momento, como cuando detecta un golpe en el sector de tacto derecho, este realiza un giro opuesto al golpe recibido(izquierdo).

Te invito a que si tienes dudas o quieres complementar esta actividad mediante opiniones, otras informaciones no tengas miedo de emitir tus comentarios, a participar donde cada comentario hará que se haga más interactivo este espacio.






No hay comentarios:

Publicar un comentario