sábado, 25 de abril de 2020

Un volante virtual para GNU/Linux

En épocas de aislamiento obligatorio hay que invertir el tiempo libre en casa. No es que tenga más tiempo libre, solo que funciona distinto. Entre las cosas que empecé (o que volví) a hacer a cambio de las que temporalmente no puedo está jugar videojuegos. Tenía desde hace años una deuda pendiente con el fantástico Grand Prix 4 de Geoff Crammond. El problema fue que mi viejo joystick comenzó a fallar a mitad del campeonato. En un simulador, es muy importante que la entrada sea analógica; el teclado degrada mucho la experiencia. Y tenía que resolverlo sin salir de casa.

Buscando alternativas me encuentro con la idea de usar un smartphone como joystick. Estos aparatos tienen sensores que les permiten conocer su inclinación. Entonces, parece una idea factible usar eso para que nosotros podamos agarrarlo como si fuera un pequeño volante y girarlo en el aire. Googleando un poco llego a una aplicación llamada TouchRacer. Funciona así: una app de Android le envía a la PC los datos por wifi o bluetooth; en la PC un programa recibe esos datos y se los pasa a un joystick virtual; y los juegos creen que están hablando con un joystick regular.

No le tenía mucha fe a esta solución. A pesar de que me pareció una gran idea, pensé que no iba a ser tan cómodo, y que mi teléfono de gama baja baja no iba a colaborar. Pero igual, sin otras alternativas, me dispuse a probarlo. Y aquí aparece el 2do problema: la app para la PC es solo para Windows. Vale notar que el juego en cuestión también es para Windows, pero funciona de maravillas con wine. La app de TouchRacer, no. Depende de un componente llamado vjoy, que a su vez depende de un componente de Windows que no está reimplementado en wine.


Y entonces surgió la pregunta ¿será difícil hacer algo equivalente para GNU/Linux? Rehacer la app de Android no se me pasó por la cabeza, dado que tengo cero experiencia en programación para Android, y no se justificaba invertir demasiadas horas solo para jugar. Peeero... clonar la app de Windows en GNU/Linux parecía más accesible. Analizando el tráfico wifi con wireshark, veo que la comunicación es muy simple y directa. La parte que no tenía ni idea, y parecía complicada, era la de traducir eso en algo que el sistema crea que es un joystick. Googleando un poco me encuentro con que en GNU/Linux esto es muy fácil. Hay módulo llamado uinput para hacer esto, y muchos ejemplos en internet. Copiando y pegando un poco de aquí, un poco de allá, en un par de horas tenía una prueba de concepto funcionando.

Y funcionó mucho mejor de lo que esperaba. Si hay buena conexión (juego cerca del router, o conecto la PC directamente al hotspot de Android), realmente funciona. Lleva unas vueltas acostumbrarse, pero al final es mucho mejor que el joystick que tenía (en mi experiencia, hace falta muy poquito para ser mejor que un joystick Genius), y aún jugando con uno de los teléfonos más baratos del mercado (Nokia 1).

Así que me puse en contacto con el desarrollador original, que se interesó en la propuesta, y me dio el visto bueno para compartirlo. Ahora pueden encontrar la nueva app para GNU/Linux en sourceforge. Se usa en combinación con la app para Android original. Y esa no es código abierto :), pero por el momento sí es gratuita y no tiene publicidad, cosa que se agradece mucho.


Tan bien funcionó la cosa que el fin de semana emprendí un proyecto de hardware: armarle una base al teléfono para que quede como un volante. Juntando un rulemán viejo que alguna vez hubo que cambiarle a mi bici, la base pesada de un trofeo, unas chapitas que compré para colgar algo que nunca colgué, unos cartones bastante firmes, una tapita de botella, algunos precintos, pegamento de silicona, y un par de banditas elásticas en homenaje a MacGyver, salió ese engendro de la foto. Realmente ayuda, porque el celu en el aire no es tan estable, y uno sin darse cuenta lo mueve mucho además de girarlo. Sujeto a una base, reduce bastante ese ruido y transmite más confianza.

En conclusión, les comparto una pequeña contribución para los linuxeros que deban quedarse en casa y les gusten las carreras. Además de jugar, también le dediqué tiempo a ZinjaI y PSeInt, hay cambios muy interesantes en camino, pero eso será tema para otro post.

5 comentarios:

  1. Esta muy bueno
    Te doy una idea, si usas lo que aprendiste y lo incorporas al MotoGP que lo tenes olvidado???

    ResponderEliminar
    Respuestas
    1. No me olvido! Tengo mil ideas en el to-do de motogt, y regularmente sigue creciendo, todavía piense a cada rato y tomo nota de cosas nuevas. Solo que habiendo todavía tanto que hacer con pseint y zinjai para ponerme al día, motogt queda relegado. Además, estaba muy avanzada la reconstrucción desde cero de motogt, así que a esta altura no invertiría tiempo en mejorar el orginal, sino en terminar el nuevo.
      De todas formas, esto en particular funcionaría con motogt tal como está, porque lo vería como un joystick cualquiera, y motogt tenía soporte para joystick.

      Eliminar