March 23, 2019

Caminos

Creemos que nos va a ser útil definir “caminos” a lo largo del laberinto, y poder indicarle al robot que vaya por una ruta preplanificada. Vamos a añadir esta implementación en su propio fichero camino.cpp.

Un camino es una secuencia de pasos, que únicamente pueden ser: RECTO, IZQUIERDA o DERECHA, y STOP.

enum tipo_paso {PASO_RECTO, PASO_DER, PASO_IZQ, PASO_STOP};

Los pasos estarán almacenados en el array de celdas, ocupando otros dos bytes en cada una de ellas:

typedef struct {
    volatile char paredN : 1;
    volatile char paredO : 1;
    volatile char visitada: 1;
    volatile tipo_paso paso: 2;
    volatile uint8_t flood;
} tipo_celda;

La idea es la siguiente: supongamos que queremos definir un camino en un laberinto de 3x4, que vaya por las siguientes casillas: 8, 9, 10, 11, 7, 3, 2, 1. El robot se encuentra inicialmente en la casilla 8, mirando al NORTE.

+-----+-----+-----+-----+
|                       |
|   0     1     2     3 |
+     +     +-----+     +
|                 |     |
|   4     5     6 |   7 |
+-----+-----+-----+     +
|                       |
|   8     9    10    11 |
+-----+-----+-----+-----+

Ese camino quedaría definido por los siguientes pasos: PASO_DERECHA (ya que se está mirando al NORTE y queremos ir a la casilla 9), PASO_RECTO hasta llegar a la casilla 11, PASO_IZQ para girar de nuevo hacia el norte, PASO_RECTO hasta llegar a la casilla 3, PASO_IZQ, y luego PASO_RECTO hasta llegar a la casilla 1.

Por convención, entenderemos que un PASO_IZQ o PASO_DER incluye el avance correspondiente después del giro. Esto nos soluciona un poco el almacenamiento en el array de celdas. La lista de pasos quedaría así:

  • PASO_DER (incluye el giro y el avanze a la casilla 9)
  • PASO_RECTO (de la casilla 9 a la 10)
  • PASO_RECTO (de la casilla 10 a la 11)
  • PASO_IZQ (incluye el giro y el avanze a la casilla 7)
  • PASO_RECTO (de la casilla 7 a la 3)
  • PASO_IZQ (incluye el giro y el avance a la casilla 2)
  • PASO_RECTO (de la casilla 2 a la 1)
  • PASO_STOP (marca el fin del camino).

Los pasos quedarían almacenados en el array de la siguiente manera (REC es RECTO):

+-----+-----+-----+-----+
|      STOP   REC   IZQ |
|   0     1     2     3 |
+     +     +-----+     +
|                 | REC |
|   4     5     6 |   7 |
+-----+-----+-----+     +
| DER   REC   REC   IZQ |
|   8     9    10    11 |
+-----+-----+-----+-----+