lunes, 18 de abril de 2011

Detección precisa de rectas y curvas

Actualmente me encuentro en la etapa de diseño de reglas, y para ello es imprescindible detectar correctamente cuándo se está en una curva o una recta.
Hasta ahora esto lo detectaba a través del sensor que me proporcionase la mayor distancia, pero daba algunos problemas al encontrarse en curvas y en paralelo al eje de la pista (daba como resultado que estaba en una recta en ese caso). La forma correcta de hacer esta comprobación es la siguiente:

- Hay que calcular la pendiente entre el sensor 0-1 y el 1-2 para la zona izquierda del coche y comprobar si son aproximadamente iguales, esto es, que estén alineados.
Se comprobará que sean aproximadamente iguales porque una recta perfecta no existe en TORCS.

- Para la zona derecha el método es el mismo pero para los pares 16-17 y 17-18.

Si tanto en la derecha como en la izquierda se detectan que los puntos están alineados, entonces se podrá afirmar con seguridad que se está en una recta, y en caso contrario, en una curva. Para saber el sentido de la curva si se podrá utiliza el sensor que nos proporcione la máxima distancia, aunque previamente habrá que calcular cuál es el eje de referencia, que dependerá del ángulo del coche respecto al eje de la pista.

He de decir que tras realizar multitud de pruebas, no me salían alineados los puntos cuándo el coche estaba en una recta y no estaba parelelo al eje, y descubrí a qué era debido... vi que en el fichero SimpleDriver, los autores modificaban los ángulos de separación de los sensores de distancia al inciarse el conductor (en la función initAngles), y por defecto no están a 10º como pensábamos, sino que tienen distintas precisiones. Por ello, cuando estaba en la fase del diseño de la GUI de telemetría no me salían correctamente las distancias... es decir que no era necesario calcular el radio pequeño que se comentó hace varias entradas.
Aquí dejo una captura en la que se puede ver que ahora se perciben las rectas con gran precisión.



Y aquí dejo otra captura mostrando el método que he nombrado anteriormente. Lo he modificado de forma que los sensores queden separados cada 10º.


Una vez que tenga resuelto el problema de detección de curvas/rectas pasaré a diseñar una máquina de estados, que me servirá para poder elegir distintos conjuntos de reglas, según la situación en la que se esté.
En principio se tendrán los siguientes estados: Inicial, Recta, Curva, Adelantamiento.
Se cambiará de estado cuándo se dispare alguna regla que contenga como consecuente un cambio de estado.

Ejemplo de reglas del estado "adelantar":
0 hay_hueco(izquierda)&da_tiempo(adelantar)->adelantar(izquierda)
1 hay_hueco(derecha)&da_tiempo(adelantar)->adelantar(derecha)
2 hay_hueco(centro)&da_tiempo(adelantar)->adelantar(centro)

Se puede observar que cada vez los antecedentes y los consecuentes están siendo más complejos e inteligentes.

También hay algunas ideas más por desarrollar como:

- La comprobación de la velocidad del oponente para ver si es alcanzable antes de que se llegue a una curva (esto es imprescindible para poder tener antecedentes del tipo "me da tiempo de adelantar").
- El diseño de un controlador difuso para el control de las marchas.
- Diseñar un controlador PID (http://es.wikipedia.org/wiki/Proporcional_integral_derivativo) para realimentar la entrada con la dirección.
- Aplicar teoría del campo eléctrico para realizar adelantamientos (basándose en el comportamientos de cargas del mismo signo, que se repelen)



Y para finalizar esta entrada, dejo 2 vídeos más sobre los adelantamientos que se están logrando



4 comentarios:

  1. Hola Ricardo,
    Ya he vuelto del viaje y he visto la entrada. Me gusta, aunque es muy densa!!

    Creo que podrías hacer una entrada para cada uno de los temas que pones y tratarlos un pelín más en profundidad. Por ejemplo, ver el resultado de la detección de curvas, si es bueno o hay que buscar otro!

    Otra cosa son los vídeos... MU CHULOS!!
    En el primero se ve una cosa MUY importante... las reglas no están bien construidas u ordenadas!, ya que adelanta por el sitio más estrecho!!
    Eso no se arregla cambiando las reglas de orden, ya que si te encuentras el coche en el otro lado te pasa lo mismo, por lo que.. y si cambiamos la percepcion??

    da_tiempo(adelantar) & mayor_hueco(derecha) -> ....

    que te parece?

    G

    ResponderEliminar
  2. Hola Gonzalo, espero que hayas disfrutado del viaje :)
    Me parece bien usar las reglas con los antecedentes da_tiempo y mayor_hueco, estoy diseñando los métodos relacionados con esos antecedentes, que seguro que dan mejores resultados en las reglas.

    Por otra parte, el tema de detección de curvas/rectas ya lo tengo resuelto, le he dado de margen 1º de diferencia entre las pendientes y da muy buen resultado, incluso no estando el coche paralelo al eje. Colgaré algún vídeo dónde se vaya mostrando la detección.

    También me han surgido algunas dudas ...
    por ejemplo en el diseño del controlador difuso, no tengo muy claras qué entradas tomar. De momento estoy tomando como entradas
    -las RPM
    -el nivel de aceleración-frenado
    -la marcha actual,
    y estoy teniendo como salida la nueva marcha , crees que faltan o sobra alguna entrada en el controlador?. También había pensado que se podría tener únicamente como entrada la velocidad.

    ResponderEliminar
  3. Hola Ricardo, la verdad es que SI... que he disfrutado del viaje... GRACIAS!!

    Me alegro que hayas resuelto lo de la detección de rectas, las matemáticas al final sirven para algo, no??? Ahora nos queda las curvas, con su radio de curvatura!. Eso es igual de fácil que las rectas, con un poquito de matemáticas... y lo dejamos para la próxima tutoría... ok??

    Con respecto a las dudas... del sistema difuso... lo hablaré con M.A. y ya te comento algo... ya que yo no soy experto en difuso. Aún así te diría que para el controlador de marchas no sólo influye la velocidad... ya que el tema de la aceleración es clave para aprovechar al máximo la fuerza del motor.

    Seguimos trabajando!
    Gonzalo.

    ResponderEliminar
  4. Circunferencia que pasa por 3 puntos...

    Aquí vas a encontrar un primer paso teórico de cómo se halla la ecuación(general) de la circunferencia: http://prepa8.unam.mx/colegios/mate/geogebra/circ3puntos_i.html

    y aquí, como encontrar los datos que más nos interesan, y extraidos de la base teórica:
    http://espanol.answers.yahoo.com/question/index?qid=20071110153959AAT9TMl

    Un saludo.
    G

    ResponderEliminar