Silvia Calvo Cabello
- El sensor proporciona 360 lecturas, una por cada grado.
- El láser 0 apunta hacia delante y el láser 270 hacia la derecha.
- El alcance máximo del sensor es de 3.5 metros.
- Es imprescindible conocer la orientación del robot para poder transformar correctamente los ángulos del láser al marco global.
- Primero localiza la pared más cercana en la dirección Este.
- Después recorre todo el perímetro del entorno siguiendo la pared y actualizando el mapa.
- Una vez delimitado el contorno, se ejecuta un recorrido completo del área utilizando un algoritmo de Bsa , asegurando así que el robot visita todas las zonas libres identificadas.
- Mapeo dinámico con mapping()
- Recorrido de paredes para delimitar el entorno
- Conversión del mapa a celdas
- Generación de recorrido completo mediante zigzag y BFS
- Seguimiento celda a celda mediante go_to()
- Mapa en píxeles
- Mapa en celdas
- pixel_a_celda(): pasa de píxeles a celda
- celda_a_pixel(): devuelve el centro de una celda en píxeles
- Calcula el error angular
- Elige el giro más corto
- Gira hasta que el error sea menor a 0.1 rad
- Detiene el movimiento angular
- Guarda posición inicial
- Lee el láser continuamente
- Detiene el avance si aparece un obstáculo
- Detiene el avance si llega a la distancia requerida
- Actualiza el mapa y celdas visitadas
- Obtiene la pose
- Convierte a píxeles → celda
- Marca la celda como visitada
- Mira si tiene pared a la derecha
- Si no hay pared, gira a la derecha y avanza
- Si la hay, avanza recto
- Si encuentra un obstáculo frontal, gira a la izquierda
- Va rellenando mapa y celdas visitadas
- Termina al volver cerca del punto inicial
- Convierte la pose actual a píxeles
- Calcula la dirección hacia el objetivo
- Orienta el robot
- Avanza hasta alcanzar el punto o detectar un obstáculo
- Divide el mapa en bloques del tamaño CELDA
- Calcula el brillo promedio
- Celdas claras → libres (255)
- Celdas oscuras → ocupadas (0)
- Actualiza WebGUI
- Por cada celda ocupada, marca como ocupadas las celdas vecinas
- Expande en 4 direcciones
- Guarda el camino recorrido
- Devuelve la lista de celdas desde origen a destino
- Expande BFS desde la posición actual
- Detiene al encontrar la primera celda libre sin visitar
- Obtiene todas las celdas libres no visitadas
- Comienza desde la celda inicial
- Intenta avanzar en prioridad N → O → E → S
- Si no puede avanzar, usa BFS para saltar a la celda libre más cercana
- Continúa hasta visitar todas las celdas
- Para cada rayo calcula el punto final
- Dibuja en mapa los puntos libres hasta ese punto
- Si hubo impacto, marca el punto final como ocupado
- Carga inicial y cálculo de escala metro → píxel
- Orientación inicial hacia el Este
- Avance hasta detectar una pared
- Orientación hacia el Norte
- Recorrido completo de pared con mapeo
- Engordar el mapa
- Conversión del mapa en una cuadrícula de celdas
- Generación del recorrido completo zigzag
- Seguimiento celda a celda usando go_to()
- Marcado de celdas visitadas
- Detención del robot al terminar
- VIDEO DE MUESTRA
La práctica consiste en generar un mapa del entorno a partir de la información obtenida por el sensor LIDAR del robot. El objetivo principal es desarrollar un algoritmo de navegación capaz de explorar de forma autónoma un área de almacén mientras construye un mapa preciso del entorno utilizando los datos del láser. Posteriormente, empleando ese mismo mapa, se implementa un algoritmo basado en BSA que permite recorrer sistemáticamente todas las zonas accesibles.
Para construir el mapa a partir de los datos del láser es necesario conocer varios parámetros fundamentales:
Para obtener un mapa completo y fiable es necesario diseñar un recorrido adecuado. La solución adoptada se inspira en el comportamiento de robots domésticos como las aspiradoras tipo Roomba: primero recorren el perímetro del área para definir los límites del espacio y luego realizan un barrido sistemático del interior. En esta práctica, el robot sigue una estrategia similar:
Explicación del programa
Este programa implementa un sistema autónomo de exploración del entorno mediante mapeo, recorrido de paredes, conversión del mapa a cuadrícula, engrosamiento de obstáculos y finalmente la generación de un camino zigzag tipo cobertura que recorre todas las celdas libres del mapa. Utiliza la simulación provista por HAL y la visualización mediante WebGUI, construyendo un mapa propio a partir del láser.
Este sistema funciona con:
Funciones del programa
pixel_a_celda() y celda_a_pixel()
El robot usa dos espacios de coordenadas:
orientar()
Ajusta la orientación del robot hacia un ángulo objetivo:
avanzar()
Avanza una distancia dada mientras no haya obstáculos.
map_visit_rellenar()
Marca en una matriz qué celdas ha visitado el robot:
recorrer_pared()
Implementa un algoritmo de seguimiento de pared (wall-following):
go_to()
Mueve el robot hacia un punto dado en píxeles.
convert_map_to_grid()
Convierte el mapa continuo en una cuadrícula binaria:
engordar_obstaculos()
Expande los obstáculos del grid para aumentar la seguridad:
bfs_find_shortest_path()
Busca un camino más corto entre dos celdas libres usando BFS:
bfs_find_nearest_free_cell()
Encuentra la celda libre más cercana no visitada:
zigzag_spiral_path()
Genera el camino completo para cubrir el mapa:
mapping()
Construye dinámicamente un mapa de ocupación usando el láser:
metros_a_pixeles()
Convierte distancias en metros a desplazamientos en píxeles usando WebGUI.
Flujo principal del programa
El programa sigue los siguientes pasos:
Al finalizar, el robot habrá mapeado el entorno y recorrido la totalidad del espacio navegable.
Video de la construccion de mapa recorriendo la pared.
Ver el video