«La perfección no se alcanza cuando no hay nada que añadir, sino cuando no queda nada que quitar»

«La perfección no se alcanza cuando no hay nada que añadir, sino cuando no queda nada que quitar»

Práctica 3 - Autoparking

Introducción

En esta práctica se tiene una calle, con un hueco en el que cabe un coche con el objetivo de conseguir algoritmo de aparcamiento automático o autoparking. Se tiene un coche omnidireccional que funciona como una aspiradora robótica, ya que puede modificar su angulo de guiñada o yaw sin necesidad de desplazarse linealmente para lograrlo, a diferencia del sistema de movimiento Ackermann, que necesita una velocidad lineal para ejecutar una velocidad angular, como hacen los coches comunes.

Sin embargo, el movimiento que simularemos será parecido, ya que se intentará avanzar o retroceder siempre que se vaya a girar, es decir, que a pesar de poder realizar giros sobre su propio eje central, estos no se harán.

El coche descrito anteriormente también dispone de 3 lásers, uno al frente, otro en el lateral derecho y otro en la parte trasera. Además se dispone de la ayuda del GPS pero también se intentará llegar a una solución en la que no se requiera este sensor, para poder realizar un control puramente por velocidad sin basar nada en el control por posición.

Finalmente se asumirá que solo veremos un coche detrás del nuestro, pero no podremos asumir que hay otro delante, aunque en las primeras pruebas asumiremos que hay un coche delante y otro detrás del hueco de aparcamiento.

Una vez descrito el problema, ya sabemos qué debemos usar y qué no, por lo que podemos dividir el problema para poder solventarlo, en este caso podremos introducir subproblemas en una máquina de estados para ir resolviéndolos de unos en uno con una lógica correcta:

  • Primero deberemos encontrar el hueco para aparcar.
  • Una vez encontrado avanzaremos para posicionarnos a cierta distancia y poder así dar marcha atrás.
  • Comenzaremos la maniobra de aparcamiento.

Para el primer subproblema estamos asumiendo que el coche está perfectamente alineado, pero mejoraremos esto, añadiendo un nuevo estado previo que alinee el coche con los de su derecha, puesto que tampoco tenemos cámaras para poder ver el carril por el que vamos, y obtener así un algoritmo mucho más robusto posteriormente.

Con esto la máquina de estados queda de la siguiente forma:


Implementación


Estado de búsqueda de aparcamiento.

Para este estado lo que se hace es avanzar comprobando siempre el láser derecho hasta que se encuentra un hueco donde  cabría el coche, en este momento se pasa al siguiente estado.


Estado de avance.

Una vez encontrado se sigue avanzando hasta que nos encontramos a cierta distancia del coche de atrás, para poder maniobrar marcha atrás.


Estado de aparcamiento.

En este momento comenzaremos con la maniobra mencionada anteriormente, acercándonos al coche de detrás con una velocidad lineal constante no muy grande, buscando el angulo del láser que menor distancia recibe, es decir, el punto más cercano del coche posterior mediante un control proporcional y con un offset de 5º para acercar más la parte trasera al interior del aparcamiento.

Cuando se está a cierta distancia de este coche se realiza lo mismo con el láser frontal, incluyendo aquí también un offset de -5º, buscando acercarse al coche de delante, que de momento asumiremos que existe, aunque mejoraremos esto más adelante.

Con este comportamiento conseguiremos que el coche se vaya introduciendo en el hueco al cabo de un par de iteraciones, sin necesidad de poner explícitamente una W constante, sino que con un par de controladores se realiza de manera automática, por lo que funcionará con distintas distancias entre coches, por tanto es robusto.



 

Mejoras.

 

Mejoras del algoritmo de aparcamiento.

Para esta mejora lo que haremos será no asumir que existe el coche de delante, pero teniéndolo en cuenta en caso de que exista para no chocarnos con él.

En este caso seguiremos realizando las marchas atrás de la misma manera, pero cuando demos marcha adelante nos fijaremos en la orientación inicial, la cual guardaremos justo en el estado anterior (el de avance), para reorientarnos al avanzar intentando obtener dicha orientación más 5 grados adicionales, para luego repetir estos dos pasos de nuevo, como antes, pero esta vez hasta que el coche quede completamente orientado y en su sitio.


También podríamos incluir un cambio, de manera que al avanzar en este estado de parking, no se fijase en el ángulo de la calle, sino en el láser trasero para reorientarse, de la misma manera que se explica a continuación en un esquema y en la siguiente mejora de reorientación, ya que sería hacer lo mismo pero con el láser trasero. Debido a la robustez de nuestro algoritmo no es necesario, ya que aparca suficientemente bien.

 

 

Adición de reorientación durante el estado de búsqueda de aparcamiento.

Haremos que el coche empiece en la misma orientación con un poco de ruido aleatorio para simular que no está completamente orientado en la calle, y añadiremos un nuevo algoritmo de reorientación que solvente este problema, usando el láser derecho en el estado de búsqueda de aparcamiento.

El algoritmo consistirá en fijarse en dos rangos de dicho láser, uno que apunta un poco hacia el frente (+30º) y otro que lo haga un poco atrás (-30º) de un ancho aproximado de unos 10º, para compararlos obteniendo un error, que podremos usar en un controlador proporcional como hemos hecho anteriormente en otros estados, en este caso para controlar la velocidad angular (W), para girar hacia la derecha si el rango frontal es menor que el trasero, o a la izquierda en caso contrario.

Con todas estas mejora el algoritmo queda funcionando de la siguiente manera:



Comentarios

Entradas populares de este blog