viernes, 28 de enero de 2011

Cálculo del radio de la semicircunferencia de los sensores

En la última reunión con mi director de proyecto, estuvimos comentando que los sensores no parten de un mismo punto, sino que est´distribuidos formando una semicircunferencia; de ahí que no se representasen bien las distancias en el gráfico de telemetría cuándo el coche estaba en una recta, ya que estuve considerando que todos los sensores partían del mismo punto.
Surgió entonces un nuevo problema: es necesario calcular el radio de esa pequeña circunferencia para poder representar correctamente las distancias que hay desde el centro de dicha circunferencia.

Después de pensar varias estrategias sobre cómo calcular el radio formado por los sensores, di con esta solución:

La componente "x" de cada distancia en coordenadas polares de la zona de los sensores de la derecha (o izquierda) es la misma cuándo el coche está en una recta. Esto se observa mejor en la siguiente imagen que he diseñado en Photoshop para ilustrar la solución:

Matemáticamente ya tengo resuelto este problema, pero ahora hay que trasladarlo a TORCS, y hay un pequeño problema, que es que para aplicar ésto el coche tiene que estar paralelo al eje de la carretera (trackAngle = 0 ó lo más cercano posible).

He obtenido estos resultados en rectas largas de diferentes circuitos:
ángulo: 1.71836E-4 9.90371 19.8133 RADIO:6.733958448107313
ángulo: 0,000171836 RADIO:6.733958448107313

ángulo 9.63449E-4 Sensor0º:9.15691 S40º:18.3444 RADIO:6.2490239668582515
ángulo 9.64467E-4 Sensor0º:11.963 S40º:23.9661 RADIO:8.164038600679886
ángulo -9.91996E-4 Sensor0º:11.9658 S40º:23.8905 RADIO:8.092102355791852
ángulo 3.01992E-7 Sensor0º:6.66667 S40º:13.3333 RADIO:4.52927539845111

Parece ser que el valor del radio está alrededor de 6.5 , pero tengo que realizar más pruebas para comprobarlo. En el caso de no conseguir un rango más pequeño de variaciones del radio, creo que habría que tomar la media de radios conseguidos, aunque en teoría el valor del radio debe ser exacto.

Saludos.

domingo, 23 de enero de 2011

Geometría y Álgebra

Por fin he conseguido calcular el centro de las circunferencias de las curvas.
Apliqué la idea que escribí en el comentario del post anterior con unos resultados excelentes. Finalmente resolví el sistema de ecuaciones mediante la regla de Cramer. Hice una prueba ayudándome de Matlab para representar gráficamente lo que obtenía en Java y aquí está el resultado :
Como se puede observar, he conseguido una circunferencia que pasa por 3 puntos de forma exacta, y ya he cumplido mi objetivo de poder obtener el centro de la circunferencia, y de ahí la distancia a uno de los puntos, con lo que tengo el radio de la curva.
Ahora me queda integrarlo con el módulo de telemetría, pero ya la parte más dura está conseguida.
Para conseguir ésto, me basé en fórmulas de Geometría y de Álgebra, y tengo que decir que no encontré ninguna librería en Java adecuada a mis necesidades y tuve que diseñar todas las funciones geométricas necesarias (construcción de ecuaciones de rectas dados un punto y una pendiente, cálculo de distancias euclídeas, cálculo del punto medio, cálculo de recta perpendicular), así como implementar un módulo para resolver ecuaciones 2x2 mediante Cramer.

sábado, 1 de enero de 2011

Novedades y correcciones

Tras el parón navideño, he comenzado a modificar varias cosas en el proyecto. He estado modificando la interfaz, ahora la ventana contendrá 2 pestañas, una para las gráficas de velocidad, RPM y aceleración y otra pestaña para la telemetría.
Además estas gráficas las diseñaré desde 0, ya que las que diseñé con la librería JFreeChart tienen el problema de que no se podía modificar la variable del eje X, e interesa poder modificar ese eje para representar la distancia desde la salida en él.

Por otra parte, la idea que comenté en la entrada anterior no era correcta, ya que lo correcto es calcular el radio de curvatura para ver lo abierta o cerrada que es una curva. Para ello emplearé fórmulas matemáticas de Geometría, tales como la fórmula para calcular una circunferencia dados 3 puntos. Imaginando que estos 3 puntos son A,B y C ésto consistiría en calcular la mediatriz entre los puntos AB y también BC. El punto dónde se corten las mediatrices será el centro de la circunferencia, y sabiendo el centro ya si se podrá calcular el radio (y por tanto sabremos la curvatura, a más radio será mas abierta).

También, como era de esperar, me han surgido nuevos problemas en la interfaz:
- El gráfico de telemetría aparece también en la otra solapa de gráficas por algún problema de refresco.
-Tengo que tomar una decisión sobre qué hacer cuándo la gráfica de velocidad (y de RPM y aceleración) lleguen al límite derecho del panel cuando lo represento. Lo ideal (pero que no se como implementarlo de momento), sería que se desplazase dinámicamente tal y como sucedía con la librería JFreeChart. También he pensado que otra solución sería que cuándo llegue al borde del panel, comience a pintar de nuevo desde el principio, en el borde izquierdo. Y otra posible solución sería que fuese scrollable (algo parecido a la idea que tenía para representar el mapa, pero que no funcionaba también por problemas de refresco).


Además de estas correcciones, también tengo que comprobar como están espaciados los sensores del coche, ya que parece ser que no parten todos desde el mismo punto.

Saludos.