CAR - AUTOPARKING
Silvia Calvo Cabello


La practica consiste en un coche autonomo. El coche tiene que poder aparcar en paralelo, ya sea teniendo dos coches de referencia (delante y detrás) o solo uno (delante o detrás). Para esto, cuenta con tres láseres de 180°: uno delante, uno detrás y uno a la derecha. Con ellos detectamos si hay hueco para aparcar y nos aseguramos de no chocar. Además, el coche tiene odometría, pero no se usará para localización global; solo servirá de manera incremental para movimientos relativos.
Al principio, como no sabemos cómo está orientado ni posicionado el coche, este se coloca para que la calle quede paralela. Luego, se sitúa a la distancia correcta para poder aparcar.
Para calcular el hueco mido las lineas con espacio estado a la derecha recto del coche. Cuando detecta que hay sufieciente hueco con la media en angulo 90, empieza a aparcar.
Al principio intenté aparcar con dos giros: primero hacia atrás y luego hacia adelante, pero no funcionaba.

Luego probé a hacerlo como en la vida real: girar hacia atrás, continuar con el giro contrario y finalmente colocarte correctamente hacia adelante.

Para calcular la maniobra, primero probé usando los láseres de delante y detrás, pero podría no haber un coche de referencia, así que finalmente usé la odometría incremental. También se usa para avanzar una distancia concreta una vez detectado el hueco, ya que no podemos asumir que siempre habrá un coche delante.

Explicación del programa

Este programa implementa un sistema de aparcamiento autónomo para un vehículo controlado mediante sensores láser y módulos de simulación proporcionados por la interfaz HAL y WebGUI. El objetivo es que el coche detecte un espacio libre en el lateral derecho, se coloque de forma paralela al entorno, y luego realice una maniobra de aparcamiento en varias fases hasta quedar correctamente estacionado entre dos obstáculos simulados.

El flujo principal comienza con una alineación del vehículo respecto a la acera (determinando si está paralelo mediante un análisis de los datos del láser derecho). Una vez que el coche está bien orientado, avanza por la vía mientras busca huecos adecuados para estacionar utilizando los datos del láser lateral.

Cuando se detecta un espacio libre que cumpla las condiciones de tamaño mínimo, el programa ejecuta la secuencia de maniobra de aparcamiento: avanza para posicionarse, da marcha atrás girando primero hacia un lado, luego hacia el contrario, y finalmente ajusta su orientación hasta quedar recto.

Durante todo el proceso, el sistema analiza los datos de los sensores delantero, trasero y lateral para evitar colisiones. También verifica si existen vehículos delante o detrás (mediante detección de distancias cortas), y modifica la estrategia en función de ello.

Una vez completada la maniobra, el vehículo se detiene completamente.

Funciones del programa

is_paralell()

Analiza los datos del láser derecho para determinar si el coche está paralelo a una pared o línea lateral.
El proceso consiste en segmentar los puntos válidos del láser, calcular el tramo más largo (la pared detectada), y obtener su pendiente mediante la diferencia entre el primer y último punto del segmento.
Si el ángulo de esa línea está dentro del rango de 89.5° a 90.8°, se considera que el coche está recto respecto a la pared y devuelve 90.
En caso contrario, devuelve el ángulo calculado, indicando el grado de desviación.

is_horizontal(laser)

Evalúa si los datos de un sensor láser (ya sea el delantero o el trasero) corresponden a una superficie horizontal al coche.
Divide las lecturas en segmentos continuos, calcula la inclinación de cada tramo y comprueba si alguno de ellos tiene un ángulo entre 89.5° y 90.5°.
Si lo encuentra, devuelve True, indicando que el coche está alineado correctamente frente a una pared u obstáculo.

get_space()

Analiza las lecturas del láser derecho para detectar huecos libres que puedan ser utilizados como plazas de aparcamiento.
Considera un punto como “libre” si su distancia es igual o mayor que el rango máximo menos un umbral (threshold).
Cuando detecta una secuencia continua de puntos libres, la registra como un posible hueco, guardando el índice de inicio, fin y el número de lecturas consecutivas.
Devuelve una lista con todos los espacios detectados.

is_parking_lot(wanted_mid, min_ang, min_count)

Determina si existe un espacio adecuado para aparcar en el área lateral del coche.
Utiliza los huecos encontrados por get_space() y verifica si alguno cumple con dos condiciones: que esté dentro del rango angular deseado y que tenga al menos un tamaño mínimo.
Si cumple ambos criterios, devuelve True e imprime el mensaje “Hueco detectado”.

park()

Ejecuta lamaniobra completa de aparcamiento en varias fases, controlando las velocidades lineal y angular del coche.
Las etapas son:

El bucle finaliza cuando el coche queda recto (según los sensores) o cuando detecta una distancia de seguridad mínima.

colocar_coche()

Función auxiliar encargada de ajustar la posición inicial del coche antes de iniciar la búsqueda de aparcamiento. Primero avanza hasta acercarse a una pared delantera (a 1.5 m), luego realiza un giro controlado hasta que la función is_paralell() determine que el coche está correctamente alineado (ángulo de 90°). Al finalizar, el coche queda preparado para recorrer la vía en busca de huecos.