Saltar a contenido
← Volver a OPRobots.org

Simulador MMSIM

Integración

El proyecto soporta el simulador Micromouse Simulator (MMSIM) mediante compilación condicional:

#ifdef MMSIM_ENABLED

Cuando MMSIM_ENABLED está definido: - Las lecturas de hardware real (ADC, SPI, GPIO) se reemplazan por la API del simulador. - El robot "virtual" ejecuta el mismo código de navegación y control.

La API se encuentra en source_code/lib/mmsim_api/.


API de Paredes Virtuales

En modo simulación, las paredes se obtienen del simulador:

API_wallFront()   bool  // ¿Hay pared al frente?
API_wallLeft()    bool  // ¿Hay pared a la izquierda?
API_wallRight()   bool  // ¿Hay pared a la derecha?

Estas reemplazan las lecturas de get_walls() que en hardware real usan los sensores IR.

Visualización

En update_floodfill(), tras el BFS, se colorean las celdas del camino óptimo: - Rojo: celdas en la ruta óptima - Azul: otras celdas visitadas


Estimación de Tiempo

mmsim_get_estimated_time() en floodfill.c:1584:

  • Recorre la secuencia de movimientos generada.
  • Acumula tiempos de las tablas de pesos cinemáticos (straight_weights[], diagonal_weights[]).
  • Aplica penalizaciones por cambios de dirección.
  • Disponible solo en MMSIM_ENABLED.

Algoritmo

flowchart TD
    A["Para cada movimiento<br>en la secuencia"]
    A --> B{"¿Tipo?"}
    B -->|"Recto (F)"| C["tiempo +=<br>straight_weights[move_count].time"]
    B -->|"Giro (L/R)"| D["tiempo +=<br>diagonal_weights[move_count].time"]
    D --> E{"¿Cambió dirección<br>respecto al anterior?"}
    E -->|"Sí"| F["penalty +=<br>diagonal_weights[last_count].penalty"]
    E -->|"No"| G["move_count++<br>(misma dirección)"]
    C --> G
    F --> H["move_count = 0<br>(cambio de dirección)"]

Issue Conocido

  • FF-05: move_count se incrementa antes de usarse como índice. La primera celda usa weights[1].time en lugar de weights[0].time. Impacto: estimación incorrecta en simulador.

Compilación Condicional

Archivos afectados por MMSIM_ENABLED

Archivo Cambio
sensors.c get_walls() usa API simulador en lugar de ADC
sensors.h Omite includes de hardware
floodfill.c mmsim_get_estimated_time(), mmsim_finish_explore()
control.c Versión simplificada sin acceso a hardware
config.h Omite includes de hardware
move.c Ajustes en includes

Funciones exclusivas del simulador

Función Descripción
mmsim_get_estimated_time() Estima tiempo total de la carrera
mmsim_finish_explore() Finaliza exploración, imprime maze, llama API_setTime()

Herramientas Complementarias

En source_code/utils/: - simulator/: Simulador de laberinto en PC - visualizer/: Visualizador de rutas en Python


Documento generado el 2026-06-12. Ver también Floodfill, Arquitectura Software.