SlideShare una empresa de Scribd logo
1 de 18
Planificación de trayectorias
Bug 2
 Método Start – Goal
 Desconocemos los obstáculos
  existentes en el entorno
 Basado en 2 comportamientos
  fundamentales:
     Ir al Goal
     Rodear obstáculo
Algoritmo
               Generar una línea entre los
                puntos Start y Goal

               El robot seguirá esa
                trayectoria salvo que
                encuentre un obstáculo

               En este caso rodeará el
                obstáculo hasta que
                encuentre un punto
                perteneciente a la línea

               En ese momento dejará de
                rodear el obstáculo y
                continuará hacia el Goal
Player / Stage
   Los ficheros necesarios para la
    implementación y prueba de este algoritmo
    son:
     Simple.world  Definición del mundo por
     donde nos vamos a mover (obstáculos, punto
     de salida, tamaños etc..)

     bug2.cfg  Configuración donde se define el
     fichero de world y los drivers disponibles en los
     robots

     Pioneer.inc  Definición de los componentes
     del robot.
bug2.cfg
    Configuración:

                  # Plugin de simulacion para Stage
                  driver
                  (
                    name "stage"
                    provides ["simulation:0" ]
                    plugin "libstageplugin"

                      # Cargamos el mundo
                      worldfile "simple.world"
                  )

                  #definimos driver de sonar
                  driver
                  (
                    name "stage"
                    provides ["position2d:0" "sonar:0" ]
                    model "robot1"
                  )
simple.world
    Se definen variables del mapa como tamaño, resolución, refresco o tamaño
     de la ventana GUI

    También se describen en este fichero el mapa a utilizar y los robots que
     intervienen.
                       # defines Pioneer-like robots
                       include "pioneer.inc"

                       # defines 'map' object used for floorplans
                       include "map.inc"

                       # load an environment bitmap
                       map
                       (
                         bitmap "bitmaps/cave.png"
                         size [16 16]
                         name "cave"
                       )

                       # create a robot
                       pioneer2dx
                       (
                         name "robot1"
                         color "blue"
                         pose [-5 -5 0]
                       )
Pioneer.inc
  Configuración de un robot Pioneer con
   sonar.
  Definición de parámetros propios del robot
   como tamaño del robot, peso, forma, tipo
   de movimiento
Ejecución
   Para iniciar la
    ejecución:
     robot-player bug2.cfg


   Como veíamos en el
    fichero de configuración
    del mundo se indica la
    posición de salida del
    robot (al crear el robot):

       # create a robot
       pioneer2dx
       (
         name "robot1"
         color "blue"
         pose [-5 -5 0]
       )
Ejecución
               Para comenzar con el
                algoritmo basta con
                ejecutar la clase java que
                implementa el Bug 2.

               Java –jar Bug2.jar

               Cuando ejecutamos el
                código vemos que los
                sonar se activan.

               En nuestro caso, la
                posición Goal se
                encuentra en la
                coordenada 7,1
Ejecución
   El robot debería
    seguir la línea roja
    hasta encontrarse
    con un obstáculo.

   Cuando lo encuentre
    deberá rodearlo
    hasta que se vuelva
    a encontrar en la
    línea al Goal.

   En esta practica, se
    ha definido que los
    obstáculos se rodeen
    por la derecha.
Pasos del Algoritmo Bug 2
Resultado


   El resultado de
    la ejecución
    completa es la
    mostrada en la
    imagen.
Código fuente del algoritmo
 //Calculamos la pendiente entre el punto de origen definido en el plano y el punto final
 //(y-y0)/(x-xo) = m
 pendiente = (goalY-startY)/ (goalX-startX);

 // Para el calculo del angulo usamos trigonometria (arco-tangente)
 //angulo = (float) Math.atan(pendiente);                                                      Inicializaciones
 angulo = (float)Math.toDegrees(Math.atan(Math.abs(pendiente)));

 //Enfocamos al robot hacia el objetivo
                                                                                                de variables y
 apuntar(posi);

 //Cuando estamos enfocados iniciamos el proceso
                                                                                                calculo de la
 boolean rodear = false;
 boolean fin = false;
 state = 0;
                                                                                                recta, Angulo y
 while (!fin) {

 // obtenemos los datos de los sonar
                                                                                                pendiente.
 getSonars (soni);

 // salvo algo lo impida nos moveremos de frente
 xSpeed = DEF_X_SPEED;
 yawSpeed = 0;
Código fuente del algoritmo
 while (!posi.isDataReady ());
 float posRealx = posi.getX()+startX;

 while (!posi.isDataReady ());
         float posRealy = posi.getY()+startY;
         // si detecto un obstaculo -> rodear igual a true
         if (frontSide < MAX_WALL_THRESHOLD) {
                   rodear = true;
         }
         boolean enLinea = enLaLinea(posRealx,posRealy);
                                                                                  Core del
         if (enLinea && !rodear){
                   posi.setSpeed(xSpeed,yawSpeed);
                   if ( posRealx> (goalX - 0.5) && posRealx < (goalX + 0.5)
                                                                                   algoritmo, el
                   && posRealy > (goalY -0.5) && posRealy < (goalY + 0.5)) {
                                   posi.setSpeed(0,0);
                                   fin = true;
                                                                                   bucle se repite
                   }
         }else{
                   if (rodear){
                                                                                   hasta que se
                                   rodear(soni, posi);
                   }
                   if (state==5){
                                                                                   llegue al Goal.
                                   posi.setSpeed(0,0);
                                   apuntar(posi);
                                   rodear = false;
                                   state=0;
                                   posChoqueX = posRealx;
                                   posChoqueY = posRealy;
                   }
         }
         try { Thread.sleep (100); } catch (Exception e) { }
 }
 System.out.println("============== FIN =====================");
 return;
 }
Código fuente del algoritmo
                         static boolean enLaLinea(float x, float y){

                         float deno1 = 0;
                         float deno2 = 0;
                         float coeficiente = 0;
                         if (goalX-startX !=0){
                         deno1 = goalX-startX;
                         }
   Método de soporte    if (goalY-startY !=0){
    que devuelve si un   deno2 = goalY-startY;
                         }
    punto esta en la     if (deno1 == 0){
                                          coeficiente =0 - (y-startY)/deno2;
    línea o no           }else{
                                          if (deno2 ==0){
                                                            coeficiente =(x-startX)/deno1 - 0;
                                          }else{
                                                            coeficiente =(x-startX)/deno1 - (y-startY)/deno2;
   Tiene en cuenta un                    }

    posible margen de    }


    error                 if (-0.03f<coeficiente && coeficiente<0.03f){
                                          if (Math.abs(posChoqueX-x) < 0.5 && Math.abs(posChoqueY-y)
                         <0.5){
                                                          posChoqueX = x;
                                                          posChoqueY = y;
                                           }else{
                                                          state = 5;
                                          }
                                           return true;
                          }
                         return false;
                          }
Código fuente del algoritmo

static void apuntar(Position2DInterface posi) {

while (!posi.isDataReady ());                                              Método que produce
boolean salir =false;
                                                                            el giro del robot
                                                                            hasta que mire en la
while (!salir) {
                   // giramos                                               dirección del punto
                   posi.setSpeed(0, 0.15f);                                 Goal.
                   try { Thread.sleep (10); } catch (Exception e) { }

                   float min = (float)(angulo - 1.5f);
                   float max = (float)(angulo + 1.5f);                     También tiene en
                   if (posi.getYaw() > min && posi.getYaw() < max) {
                                                                            cuenta un rango en
                                  salir = true;                             el ángulo.
                   }
}

posi.setSpeed(0, 0);
}
Arturo San Feliciano Martín
Master en Sistemas Inteligentes – Universidad de Salamanca

Más contenido relacionado

La actualidad más candente

Programación de Videojuegos con Python y Pilas (IX)
Programación de Videojuegos con Python y Pilas (IX)Programación de Videojuegos con Python y Pilas (IX)
Programación de Videojuegos con Python y Pilas (IX)Fernando Salamero
 
Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swiftbetabeers
 
Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.jubacalo
 
Programación de Videojuegos con Python y Pilas (VIII)
Programación de Videojuegos con Python y Pilas (VIII)Programación de Videojuegos con Python y Pilas (VIII)
Programación de Videojuegos con Python y Pilas (VIII)Fernando Salamero
 
Programación de Videojuegos con Python y Pilas (VI)
Programación de Videojuegos con Python y Pilas (VI)Programación de Videojuegos con Python y Pilas (VI)
Programación de Videojuegos con Python y Pilas (VI)Fernando Salamero
 
Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)Fernando Salamero
 
Symfony2, Jornadas Symfony
Symfony2, Jornadas SymfonySymfony2, Jornadas Symfony
Symfony2, Jornadas SymfonyJavier Eguiluz
 
Dflapo tarea files_dos
Dflapo tarea files_dosDflapo tarea files_dos
Dflapo tarea files_dosanitacris92
 
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...David Zapateria Besteiro
 
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...David Zapateria Besteiro
 
ESTRUCTURAS ARRAYS Y DATOS C++
ESTRUCTURAS ARRAYS Y DATOS C++ESTRUCTURAS ARRAYS Y DATOS C++
ESTRUCTURAS ARRAYS Y DATOS C++Riki Tapia
 

La actualidad más candente (19)

Tipos de operadores_velazquez
Tipos de operadores_velazquezTipos de operadores_velazquez
Tipos de operadores_velazquez
 
Programación de Videojuegos con Python y Pilas (IX)
Programación de Videojuegos con Python y Pilas (IX)Programación de Videojuegos con Python y Pilas (IX)
Programación de Videojuegos con Python y Pilas (IX)
 
tipos de operadores
tipos de operadores tipos de operadores
tipos de operadores
 
Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swift
 
Lenguajec++
Lenguajec++Lenguajec++
Lenguajec++
 
Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.
 
Programación de Videojuegos con Python y Pilas (VIII)
Programación de Videojuegos con Python y Pilas (VIII)Programación de Videojuegos con Python y Pilas (VIII)
Programación de Videojuegos con Python y Pilas (VIII)
 
Programación de Videojuegos con Python y Pilas (VI)
Programación de Videojuegos con Python y Pilas (VI)Programación de Videojuegos con Python y Pilas (VI)
Programación de Videojuegos con Python y Pilas (VI)
 
Semana 5 Java Swing
Semana 5   Java SwingSemana 5   Java Swing
Semana 5 Java Swing
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
 
Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (X)
 
Symfony2, Jornadas Symfony
Symfony2, Jornadas SymfonySymfony2, Jornadas Symfony
Symfony2, Jornadas Symfony
 
Profesora Asociada Facultad de Ingeniería UTB
Profesora Asociada Facultad de Ingeniería UTBProfesora Asociada Facultad de Ingeniería UTB
Profesora Asociada Facultad de Ingeniería UTB
 
Dflapo tarea files_dos
Dflapo tarea files_dosDflapo tarea files_dos
Dflapo tarea files_dos
 
Programación con Pygame IV
Programación con Pygame IVProgramación con Pygame IV
Programación con Pygame IV
 
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
Javascript Módulo 5 - Bucles, Arrays. Funciones como objectos. Ámbitos. Cierr...
 
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
Javascript Módulo 7 - PROFUNDIZACIÓN EN ARRAYS, OBJETOS, PROPIEDADES, MÉTODOS...
 
Herencia y polimorfismo
Herencia y polimorfismoHerencia y polimorfismo
Herencia y polimorfismo
 
ESTRUCTURAS ARRAYS Y DATOS C++
ESTRUCTURAS ARRAYS Y DATOS C++ESTRUCTURAS ARRAYS Y DATOS C++
ESTRUCTURAS ARRAYS Y DATOS C++
 

Destacado

Primary School, Oxford
Primary School, OxfordPrimary School, Oxford
Primary School, OxfordBex Lewis
 
Localización, planificación de rutas y guiado visual en interiores
Localización, planificación de rutas y guiado visual en interioresLocalización, planificación de rutas y guiado visual en interiores
Localización, planificación de rutas y guiado visual en interioresArturo San Feliciano Martín
 
Vision por computadora y Robotica 3d
Vision por computadora y Robotica 3dVision por computadora y Robotica 3d
Vision por computadora y Robotica 3dDavid Görcke
 
Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)
Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)
Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)Edinson Saldaña
 
Deformacion axial
Deformacion axialDeformacion axial
Deformacion axialJulio Ramos
 
Inteligencia Artificial y Sistemas Expertos
Inteligencia Artificial y Sistemas ExpertosInteligencia Artificial y Sistemas Expertos
Inteligencia Artificial y Sistemas ExpertosMelissa Eslava
 

Destacado (8)

Bug1 y bug2
Bug1 y bug2Bug1 y bug2
Bug1 y bug2
 
Primary School, Oxford
Primary School, OxfordPrimary School, Oxford
Primary School, Oxford
 
Localización, planificación de rutas y guiado visual en interiores
Localización, planificación de rutas y guiado visual en interioresLocalización, planificación de rutas y guiado visual en interiores
Localización, planificación de rutas y guiado visual en interiores
 
Vision por computadora y Robotica 3d
Vision por computadora y Robotica 3dVision por computadora y Robotica 3d
Vision por computadora y Robotica 3d
 
Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)
Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)
Robotica - Edinsoncs - Ockangplc-automatas cinematica(automatizacion y robotica)
 
Deformacion axial
Deformacion axialDeformacion axial
Deformacion axial
 
Algoritmos ejemplos
Algoritmos ejemplosAlgoritmos ejemplos
Algoritmos ejemplos
 
Inteligencia Artificial y Sistemas Expertos
Inteligencia Artificial y Sistemas ExpertosInteligencia Artificial y Sistemas Expertos
Inteligencia Artificial y Sistemas Expertos
 

Similar a Planificación de trayectorias con algoritmo Bug 2

Similar a Planificación de trayectorias con algoritmo Bug 2 (20)

Acmar trucos de visual basic(2)
Acmar   trucos de visual basic(2)Acmar   trucos de visual basic(2)
Acmar trucos de visual basic(2)
 
Descripcion de algoritmo
Descripcion de algoritmoDescripcion de algoritmo
Descripcion de algoritmo
 
Decompiladores
DecompiladoresDecompiladores
Decompiladores
 
Lab
LabLab
Lab
 
Curso basico c sharp
Curso basico c sharpCurso basico c sharp
Curso basico c sharp
 
Introducción a las librerías PyGame y PyOpenGL
Introducción a las librerías PyGame y PyOpenGLIntroducción a las librerías PyGame y PyOpenGL
Introducción a las librerías PyGame y PyOpenGL
 
Curso basico c sharp
Curso basico c sharpCurso basico c sharp
Curso basico c sharp
 
Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)
 
HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5
 
Guía de programacion de videojuegos II
Guía de programacion de videojuegos IIGuía de programacion de videojuegos II
Guía de programacion de videojuegos II
 
JavaScript no es Vietnam
JavaScript no es VietnamJavaScript no es Vietnam
JavaScript no es Vietnam
 
Jf 3 9_sg_esp(2)(3)
Jf 3 9_sg_esp(2)(3)Jf 3 9_sg_esp(2)(3)
Jf 3 9_sg_esp(2)(3)
 
Greenfoot 9
Greenfoot 9Greenfoot 9
Greenfoot 9
 
Pra9
Pra9Pra9
Pra9
 
Jf 3 9_sg_esp(2)(3)
Jf 3 9_sg_esp(2)(3)Jf 3 9_sg_esp(2)(3)
Jf 3 9_sg_esp(2)(3)
 
CAPITULO 9 DE GREENFOOT
CAPITULO 9 DE GREENFOOTCAPITULO 9 DE GREENFOOT
CAPITULO 9 DE GREENFOOT
 
Greenfoot 9
Greenfoot 9Greenfoot 9
Greenfoot 9
 
Capitulo9 greenfoot
Capitulo9  greenfootCapitulo9  greenfoot
Capitulo9 greenfoot
 
Jf 3 9_sg_esp(2)(3)
Jf 3 9_sg_esp(2)(3)Jf 3 9_sg_esp(2)(3)
Jf 3 9_sg_esp(2)(3)
 
Greenfoot 9
Greenfoot 9Greenfoot 9
Greenfoot 9
 

Más de Arturo San Feliciano Martín

Más de Arturo San Feliciano Martín (7)

Robots Autonomos - Sumo roomba y odometria
Robots Autonomos - Sumo roomba y odometriaRobots Autonomos - Sumo roomba y odometria
Robots Autonomos - Sumo roomba y odometria
 
Navegacion de Robots
Navegacion de RobotsNavegacion de Robots
Navegacion de Robots
 
Web usage mining tools
Web usage mining toolsWeb usage mining tools
Web usage mining tools
 
La estructura de la argumentación
La estructura de la argumentaciónLa estructura de la argumentación
La estructura de la argumentación
 
Metrica 3
Metrica 3Metrica 3
Metrica 3
 
Informatica Industrial - Simulación de RC con condensador
Informatica Industrial - Simulación de RC con condensadorInformatica Industrial - Simulación de RC con condensador
Informatica Industrial - Simulación de RC con condensador
 
RNA aplicadas a economía - Predicción de demanda eléctrica
RNA aplicadas a economía - Predicción de demanda eléctricaRNA aplicadas a economía - Predicción de demanda eléctrica
RNA aplicadas a economía - Predicción de demanda eléctrica
 

Planificación de trayectorias con algoritmo Bug 2

  • 2. Bug 2  Método Start – Goal  Desconocemos los obstáculos existentes en el entorno  Basado en 2 comportamientos fundamentales:  Ir al Goal  Rodear obstáculo
  • 3. Algoritmo  Generar una línea entre los puntos Start y Goal  El robot seguirá esa trayectoria salvo que encuentre un obstáculo  En este caso rodeará el obstáculo hasta que encuentre un punto perteneciente a la línea  En ese momento dejará de rodear el obstáculo y continuará hacia el Goal
  • 4. Player / Stage  Los ficheros necesarios para la implementación y prueba de este algoritmo son:  Simple.world  Definición del mundo por donde nos vamos a mover (obstáculos, punto de salida, tamaños etc..)  bug2.cfg  Configuración donde se define el fichero de world y los drivers disponibles en los robots  Pioneer.inc  Definición de los componentes del robot.
  • 5. bug2.cfg  Configuración: # Plugin de simulacion para Stage driver ( name "stage" provides ["simulation:0" ] plugin "libstageplugin" # Cargamos el mundo worldfile "simple.world" ) #definimos driver de sonar driver ( name "stage" provides ["position2d:0" "sonar:0" ] model "robot1" )
  • 6. simple.world  Se definen variables del mapa como tamaño, resolución, refresco o tamaño de la ventana GUI  También se describen en este fichero el mapa a utilizar y los robots que intervienen. # defines Pioneer-like robots include "pioneer.inc" # defines 'map' object used for floorplans include "map.inc" # load an environment bitmap map ( bitmap "bitmaps/cave.png" size [16 16] name "cave" ) # create a robot pioneer2dx ( name "robot1" color "blue" pose [-5 -5 0] )
  • 7. Pioneer.inc  Configuración de un robot Pioneer con sonar.  Definición de parámetros propios del robot como tamaño del robot, peso, forma, tipo de movimiento
  • 8. Ejecución  Para iniciar la ejecución:  robot-player bug2.cfg  Como veíamos en el fichero de configuración del mundo se indica la posición de salida del robot (al crear el robot): # create a robot pioneer2dx ( name "robot1" color "blue" pose [-5 -5 0] )
  • 9. Ejecución  Para comenzar con el algoritmo basta con ejecutar la clase java que implementa el Bug 2.  Java –jar Bug2.jar  Cuando ejecutamos el código vemos que los sonar se activan.  En nuestro caso, la posición Goal se encuentra en la coordenada 7,1
  • 10. Ejecución  El robot debería seguir la línea roja hasta encontrarse con un obstáculo.  Cuando lo encuentre deberá rodearlo hasta que se vuelva a encontrar en la línea al Goal.  En esta practica, se ha definido que los obstáculos se rodeen por la derecha.
  • 12. Resultado  El resultado de la ejecución completa es la mostrada en la imagen.
  • 13.
  • 14. Código fuente del algoritmo //Calculamos la pendiente entre el punto de origen definido en el plano y el punto final //(y-y0)/(x-xo) = m pendiente = (goalY-startY)/ (goalX-startX); // Para el calculo del angulo usamos trigonometria (arco-tangente) //angulo = (float) Math.atan(pendiente);  Inicializaciones angulo = (float)Math.toDegrees(Math.atan(Math.abs(pendiente))); //Enfocamos al robot hacia el objetivo de variables y apuntar(posi); //Cuando estamos enfocados iniciamos el proceso calculo de la boolean rodear = false; boolean fin = false; state = 0; recta, Angulo y while (!fin) { // obtenemos los datos de los sonar pendiente. getSonars (soni); // salvo algo lo impida nos moveremos de frente xSpeed = DEF_X_SPEED; yawSpeed = 0;
  • 15. Código fuente del algoritmo while (!posi.isDataReady ()); float posRealx = posi.getX()+startX; while (!posi.isDataReady ()); float posRealy = posi.getY()+startY; // si detecto un obstaculo -> rodear igual a true if (frontSide < MAX_WALL_THRESHOLD) { rodear = true; } boolean enLinea = enLaLinea(posRealx,posRealy);  Core del if (enLinea && !rodear){ posi.setSpeed(xSpeed,yawSpeed); if ( posRealx> (goalX - 0.5) && posRealx < (goalX + 0.5) algoritmo, el && posRealy > (goalY -0.5) && posRealy < (goalY + 0.5)) { posi.setSpeed(0,0); fin = true; bucle se repite } }else{ if (rodear){ hasta que se rodear(soni, posi); } if (state==5){ llegue al Goal. posi.setSpeed(0,0); apuntar(posi); rodear = false; state=0; posChoqueX = posRealx; posChoqueY = posRealy; } } try { Thread.sleep (100); } catch (Exception e) { } } System.out.println("============== FIN ====================="); return; }
  • 16. Código fuente del algoritmo static boolean enLaLinea(float x, float y){ float deno1 = 0; float deno2 = 0; float coeficiente = 0; if (goalX-startX !=0){ deno1 = goalX-startX; }  Método de soporte if (goalY-startY !=0){ que devuelve si un deno2 = goalY-startY; } punto esta en la if (deno1 == 0){ coeficiente =0 - (y-startY)/deno2; línea o no }else{ if (deno2 ==0){ coeficiente =(x-startX)/deno1 - 0; }else{ coeficiente =(x-startX)/deno1 - (y-startY)/deno2;  Tiene en cuenta un } posible margen de } error if (-0.03f<coeficiente && coeficiente<0.03f){ if (Math.abs(posChoqueX-x) < 0.5 && Math.abs(posChoqueY-y) <0.5){ posChoqueX = x; posChoqueY = y; }else{ state = 5; } return true; } return false; }
  • 17. Código fuente del algoritmo static void apuntar(Position2DInterface posi) { while (!posi.isDataReady ());  Método que produce boolean salir =false; el giro del robot hasta que mire en la while (!salir) { // giramos dirección del punto posi.setSpeed(0, 0.15f); Goal. try { Thread.sleep (10); } catch (Exception e) { } float min = (float)(angulo - 1.5f); float max = (float)(angulo + 1.5f);  También tiene en if (posi.getYaw() > min && posi.getYaw() < max) { cuenta un rango en salir = true; el ángulo. } } posi.setSpeed(0, 0); }
  • 18. Arturo San Feliciano Martín Master en Sistemas Inteligentes – Universidad de Salamanca