miércoles, 2 de mayo de 2018

Práctica 1: Follow line (Prueba 2)

En la segunda prueba que se ha realizado se ha empleado un control PD en vez de un control P, ya que como vimos en la prueba 1 el fórmula 1 oscilaba mucho si empleamos únicamente un control P.

Como vimos en la anterior entrada, solamente se analizaba una única fila de la imagen, lo cual no nos proporciona suficiente información para saber si nos encontramos en recta o en curva. En esta prueba se ha modificado este procesamiento de la imagen. En esta prueba se analizan tres filas de la imagen izquierda para saber si el coche se sitúa encima de una recta o de una curva, o si por otro caso se ha salido el coche de la línea. En este caso se analizan las filas situadas en las posiciones y1 = 260, y2 = 310, e y3 = 350. En estas líneas se calcula el centro de la línea roja, para lo cual se comprueban los valores de la imagen filtrada. Con estos centros podremos saber si nos encontramos en recta o curva.

El siguiente paso es procesar esta información. El centro de la línea roja situado en la fila y1 (260) será el único que no perderemos siempre que nos encontremos cerca de la línea roja, ya que es la posición que está situada más arriba. Si no encontramos la línea roja en la posición y1 es debido a que nos hemos salido de la línea roja. En esta situación el coche deberá ir hacia atrás y girar hacia el circuito para continuar su recorrido. Si la última vez que se ha visto la línea estaba a la izquierda de la imagen, quiere decir que el coche se ha salido hacia la derecha, y por tanto tendrá que girar a la izquierda y viceversa. Este caso se ha añadido en la práctica.

Los centros situados de la línea roja situados en las líneas y2 e y3 es posible que se pierdan al llegar a una curva grande. Esto introducirá errores.

La desviación que se tiene se calcula respecto a la posición ideal, que hemos visto en diferentes pruebas que es x=326. Para esto se calculará la diferencia entre la posición x de y1 (260) y la posición ideal. Esta es la desviación que tendremos en cuenta a la hora de hacer los diferentes controles PD que se van a hacer. Como hemos visto anteriormente, se tiene un caso por si el coche se ha salido del circuito.

Otro de los casos que se han tenido en cuenta es si el centro situado en la fila situada más abajo (y3 = 350) se ha perdido. Esto puede ocurrir si estamos en una curva grande. Si se da este caso se realizará un control PD adaptado a esta excepción. En función de la desviación que hay entre el centro situado en la fila de arriba (y1) y el centro situado en la fila de en medio (y2), se darán diferentes situaciones en las que se ajustará un PD diferente.
Hay que mencionar que un control PD está definido por un control proporcional y un control derivativo. El control PD sigue la siguiente fórmula:

Corrección = kp * error + kd * (error - error_anterior)


Otro caso que evaluaremos es si nos situamos en recta o curva. Si estamos en recta se aplicarán unas situaciones de control PD y si estamos en curva otras. Para diferenciar si nos encontramos en recta o en curva se empleará la diferencia entre la posición x de y3 y de y1. Lo que se hace exactamente es calcular la recta que pasa por el centro de y1 e y3, y después se mira la posición de x que se encuentra en esta recta para la fila y2 (310). De este modo conociendo el centro de la fila y2 y el punto x que se encuentra en la recta calculada, podemos saber si estamos en curva o recta. Esto se explica mejor a continuación. Para saber si es curva o recta se siguen los siguientes pasos:

1. Conociendo la ecuación de una recta (y = m *  (x - x1) + y1) podemos calcular la pendiente de la recta del siguiente modo:

y = m *  (x - x1) + y1

260 - 350 = m * (x_arriba - x_abajo)

m = -90 / (x_arriba - x_abajo)

Donde x_arriba es el centro de la fila y1 y x_abajo es el centro de la fila de abajo.

2. Una vez conocida la ecuación de la recta que pasa por estos dos puntos, vamos a calcular el punto x de la fila de en medio (y2) que pasaría por esta recta. Este valor de x lo calculamos del siguiente modo:

 y2 - y3 = m * (x - x_abajo)

(310 - 350) * (x_arriba - x_abajo) / (-90) = (x - x_abajo) 

x = (310 - 350) * (x_arriba - x_abajo) / (-90) + x_abajo


3. Una vez tenemos el punto x que pasa por la recta calculada a partir de y1 e y3, podemos calcular la desviación de x respecto al centro de y2. Si esta desviación es mayor a un umbral es que estamos en curva y si no es que estamos en recta. Y como hemos dicho aplicamos unas situaciones de PD para recta y otras para curva.

Hay que mencionar que se ha tratado de ajustar los valores de los controles PD para que no oscilara mucho el coche, aunque sigue oscilando un poco, pero no tanto como en la prueba 1. 

Se ha hecho una prueba en la que se ha modificado la posición del Fórmula 1 en la salida para que no esté situado el coche justamente encima de la línea roja. En este caso se pone el coche en la zona izquierda de la línea. En el vídeo siguiente, se puede observar que el vehículo es capaz de volver otra vez encima de la línea roja.



Se ha hecho una prueba en la que durante la ejecución del código se mueve el vehículo con el teleoperador. En el vídeo siguiente, se puede observar que el vehículo es capaz de volver otra vez encima de la línea roja a pesar de intentar girar el coche con el teleoperador.



A continuación, se puede ver un vídeo de los resultados obtenidos en esta prueba. En esta prueba el tiempo de simulación en completar una vuelta es de 1 minuto y 34 segundos, mientras que el tiempo real es aproximadamente 2 minutos y 30 segundos.


 


A continuación se explica a que se debe esta diferencia entre el tiempo simulado y el tiempo real. En la parte inferior de Gazebo se puede ver el Real Time, el Sim. Time (tiempo simulado) y el Real Time Factor, los cuales tienen mucho que ver en el tiempo de ejecución de Gazebo. El parámetro Real Time expresa el tiempo real en ejecución. El factor Sim. Time expresa el tiempo simulado. Si utilizáramos un ordenador potente entonces el Sim. Time deberı́a estar próximo al Real Time. Mientras que si usamos un ordenador sin tantas capacidades veremos que el Sim. Time es mucho menor que el Real Time. Por su parte, el factor Real Time Factor es un producto de la tasa de actualización y el tamaño del paso. Si queremos obtener un tiempo de simulación bajo deberá estar alrededor de 1. Si este parámetro es menor que 1 veremos que la ejecución es más lenta, y cuando se aproxima a 0.2 o menos es demasiado lenta. 

En el caso del ordenador empleado para la práctica, el Real Time Factor es muy
bajo en algunas ocasiones durante el pilotaje, lo que hace que el Real Time sea mucho mayor que el Sim. Time. En este ordenador el Real Time Factor normalmente oscila entre 0.4 y 0.7, siendo en grandes ocasiones cercano a 0.55. Esto implicará que haya una gran diferencia entre el tiempo simulado y el tiempo real.


No hay comentarios:

Publicar un comentario