🏎 📈 Telemetría de Fórmula 1 en tiempo real con Go e InfluxDB
En este proyecto desarrollo una herramienta para visualizar la telemetría del juego Formula 1 en tiempo real, usando Go, Docker e InfluxDB.
El proyecto final es Open Source, lo tenéis en GitHub/pirobtumen/f1-telemetry.
Introducción al proyecto
Desde chico me ha gustado el mundo de la automoción. Recientemente he vuelto a ver la Fórmula 1, lo que me llevó a comprarme el juego (Fórmula 1 2021) en Steam.
Tras unas cuantas horas de juego y comprarme un volante (Logitech G29), me di cuenta que el juego te permite emitir la telemetría de tu partida en tiempo real.
¿Por qué no visualizarla y ser piloto, ingeniero de pista e ingeniero de software a la vez? 😏
Analizando los requisitos del proyecto
En primer lugar, vi que el juego emite la telemetría a través de UDP a un host (ip/puerto) que podemos configurar a nuestro gusto.
Por otro lado, necesitamos saber cuál es la estructura de los paquetes que se envían por el socket. Con una simple búsqueda tenemos la especificación de estos en la web de Codemaster (aunque ahora es propiedad de EA).
Entonces planteamos el problema: tenemos un cliente que emite datos a través de UDP, por lo que necesitamos un servidor que lo procese, una base de datos para almacenarlos y una interfaz para verlos.
- Cliente: Ordenador con Windows que ejecuta el juego F1 2021. No hay mucho que analizar.
- Servidor: aquí hay muchas alternativas, como Python o Node (con typescript). Me apetecía desarrollar en Go, que viene siendo el lenguaje que más uso recientemente y que quiero fortalecer, así que elegí este (además que es realmente eficiente y me resulta muy rápido desarrollar).
- Base de datos: como vamos a trabajar las series temporales elegí InfluxDB. Me gusta mucho para este tipo de tareas y es muy fácil de utilizar.
- Visualización: InfluxDB trae ya su propia herramienta de monitorización Chronograf. En cualquier caso siempre podríamos usar Grafana y conectarla a través de un data source a InfluxDB.
El diagrama de funcionamiento del proyecto sería algo así:
Ya tenemos todas las piezas del puzle, nos falta los más divertido: unirlas.
Desarrollo
Respecto al desarrollo del proyecto no voy a entrar mucho en detalles ya que el código se explica por sí sólo. Al inicio del post dejo el enlace al repositorio de GitHub. A grandes rasgos:
- Levantar un servidor UDP en un puerto.
- Conectarse a la base de datos.
- Procesar los mensajes en base a la especificación.
- Guardar el mensaje.
- Por último, configurar el juego para que emita telemetría a la IP del ordenador.
Durante el proceso me encontré con una issue de Docker Desktop: no funciona la comunicación UDP con el port-binding, por lo que el servidor se tiene que ejecutar de forma nativa. La base de datos se levanta con docker/docker-compose.
Una vez esta parte está lista, podemos configurar el dashboard y voilà.
Mejoras del proyecto
- Completar los datos de telemetría.
- Tener una interfaz custom que te muestre el circuito y tu posición.
Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.