PDA

Ver la versión completa : Pantalla táctil en Bennu



Segata Sanshiro
11/08/2010, 14:50
Estoy haciendo una pequeña prueba con la pantalla táctil, pero me encuentro con que "tiembla" mucho. Es decir, yo dejo el puntero apretando en un sitio fijo, pero el cursor tiembla alrededor de él.

La solución es tomar continuamente muchas muestras de la posición del puntero y hacer una especie de media ponderada. En este post (http://www.gp32x.com/board/index.php?/topic/52849-touchscreen-jitter-filter/page__view__findpost__p__836469) de Senor Quack se enlaza a una implementación de tslib para la GP2X F-200 que por lo visto es muy buena filtrando el movimiento para que no tiemble.

La pregunta número uno es: ¿hay implementado ya algún tipo de filtro, en las SDL de la Wiz? Por los resultados que obtengo parece que no...

La segunda: ¿sería fácil compilar una nueva tslib que incluyera el código que pongo más arriba, y hacer que Bennu la usara? (En lugar de sustituir la que hay en la NAND).

La tercera: si todo lo demás falla, habría que implementar el filtro en mi propio juego. ¿Es posible obtener varios valores de mouse.x y mouse.y en cada frame? Es decir, si uso set_fps(60,0), poder obtener más de 60 valores por segundo.

Thank you very much :D

Aiken
11/08/2010, 15:06
tambien puedes utilizar un granulado menos fino. es decir dividir en bloques de 3x3 pixeles (o de 2x2), en lugar de 1x1 pixel.

yo lo que hago es que el cursor (que persigue al proceso mouse) lo que hace es que todo lo que esta en un bloque de 3x3 se lo asigna al pixel central, sea cual sea de los 3x3 pixeles el que se haya pulsado.

pierdes precision, pero bueno, normalmente los juegos de tactil, suelen tener areas sensibles mas grandes de 3x3.

nota: aunque la verda si es cierto que seria mucho mas comodo una solucion a nivel de SDL.

Aiken

SplinterGU
11/08/2010, 16:25
de cuanto es la variacion? de 1 pixel o mas?

podrias descartar 1 o 2 bits menos significativos de la muestra.

hopez
11/08/2010, 17:13
Esta mañana precisamente he estado recompilando las tslib y SDL...

SDL usa las librerías tslib de /usr/lib pero se puede reprogramar para que use lo que interese, no es demasiao complicado.

Por lo que veo Senor Quack lo ha juntado todo en un solo archivo .c que puede sustituirse en la carga desde SDL, mañana (o esta tarde si consigo un cygwin usable) lo intentaré a ver si no temblequea...

Aiken
11/08/2010, 19:54
de cuanto es la variacion? de 1 pixel o mas?
podrias descartar 1 o 2 bits menos significativos de la muestra.

yo diria que son un par de pixeles, supongo que ser porque al presionar cierto punto, los puntos de alrededor tambien reciben algo de presion, y como supongo que la pantalla tactil no es analogica pues detecta como si pulsaras todos los pixeles de alrededor a la vez.

Aiken

Drumpi
11/08/2010, 20:51
Puede tomar una muestra por frame y luego hacer una media... o seguir el consejo de despreciar los 2 bits menos significativos (por lo que cada punto del ratón equivaldría a 4x4 pixels de pantalla).

De todas maneras, uno de los minijuegos del juego que hemos mandado al concurso requiere cierto nivel de precisión, y mi betatester no se ha quejado, por lo que seguramente no sea para tanto... a menos que andes haciendo un programa de dibujo o similar.

Yo siempre he pensado que la pantalla detecta todos los pixels que hacen contacto, y mediante un HW, calcula el centro de toda la zona presionada, para mandarlo como la coordenada final.

hardyx
11/08/2010, 21:58
A mí me tiembla una barbaridad el puntero con el propio ScummVM. Yo creo que te va a ser más fácil hacer una función en Bennu que saque la media que compilar la tslib. Ya que es usada por el firmware y puedes liarla bien.

SplinterGU
11/08/2010, 22:01
no me convence meter una funcion en bennu para eso, le quitaria precision.

tendria que probarlo, tambien pueden hacer una funcion desde codigo .prg.

hardyx
11/08/2010, 22:06
A eso me refería Splinter, a una función de usuario.

Aiken
11/08/2010, 22:15
no me convence meter una funcion en bennu para eso, le quitaria precision.

podria ser una funcion generica que permitiera cambiar la "granularidad" del cursor.
asi si no configuras nada se quedaria con precision de 1 pixel, y sino puedes aumentar la granularidad y que sea de 2 pixeles o 3 pixeles.

Aiken

fbustamante
11/08/2010, 22:19
Puede tomar una muestra por frame y luego hacer una media... o seguir el consejo de despreciar los 2 bits menos significativos (por lo que cada punto del ratón equivaldría a 4x4 pixels de pantalla).

De todas maneras, uno de los minijuegos del juego que hemos mandado al concurso requiere cierto nivel de precisión, y mi betatester no se ha quejado, por lo que seguramente no sea para tanto... a menos que andes haciendo un programa de dibujo o similar.

Yo siempre he pensado que la pantalla detecta todos los pixels que hacen contacto, y mediante un HW, calcula el centro de toda la zona presionada, para mandarlo como la coordenada final.

¡Aquí el betatester! :D

Yo ya lo había notado, pero no le dí importacia porque no restaba jugabilidad. No era cuestión de saturar al programador que ya tenía mucho que hacer. :D

Se ve claramente que tiembla el cursor, pero sin embargo, no tiembla lo que se supone que estamos controlando.

Me explico mejor. Podemos mover al personaje con el stilus. El cursor que señala donde está el estilus tiembla, pero el personaje no. O al menos yo no me he dado cuenta.

Saludos.

Segata Sanshiro
11/08/2010, 23:04
y como supongo que la pantalla tactil no es analogica pues detecta como si pulsaras todos los pixeles de alrededor a la vez.

Ojo, según el código de la tslib de Senor Quack, el controlador de la pantalla da coordenada x, coordenada y y presión. De hecho, una de las mejoras que incluye es una presión mínima para no detectar falsas pulsaciones.


Puede tomar una muestra por frame y luego hacer una media... o seguir el consejo de despreciar los 2 bits menos significativos (por lo que cada punto del ratón equivaldría a 4x4 pixels de pantalla).

Sí, gracias a todos por la idea, es una solución muy buena. Aunque creo que no es válida para el programa que estoy haciendo


Yo creo que te va a ser más fácil hacer una función en Bennu que saque la media que compilar la tslib. Ya que es usada por el firmware y puedes liarla bien.

Si pones la nueva tslib en el mismo directorio que el ejecutable bgdi, ¿no usa esa versión, en lugar de usar la del sistema? Yo hice pruebas con una libSDL_sound modificada, y si ponía mi versión en la carpeta del ejecutable, me cargaba esa en lugar de la otra. Si realmente funciona así y no me equivoco, no sería problema ya que no hay que sustituir la que viene con el firmware.

SplinterGU
11/08/2010, 23:24
A eso me refería Splinter, a una función de usuario.

habia entendido en C, coincido.


podria ser una funcion generica que permitiera cambiar la "granularidad" del cursor.
asi si no configuras nada se quedaria con precision de 1 pixel, y sino puedes aumentar la granularidad y que sea de 2 pixeles o 3 pixeles.

Aiken

si me decis que vibra estando estatico, entonces no se podria hacer un promedio a 1pixel de precision, ademas de necesitarse varias muestras (frames).

hopez
12/08/2010, 00:41
Bueh, he inserido el código de Senor Quack en las librerías SDL directamente para que en vez de llamar a la librería se haga todo internamente, pero por alguna razón que ya investigaré cuando me despierte los eventos no recogen correctamente los valores de x,y,presión.

Supongo que acabaré machacando los cambios a manija en la tslib, una vez echo esto es simplemente, como comenta Segata, poner la tslib en el mismo path que el ejecutable y la cargará antes que la del path de libs del sistema.

Drumpi
12/08/2010, 03:24
Si pones la nueva tslib en el mismo directorio que el ejecutable bgdi, ¿no usa esa versión, en lugar de usar la del sistema? Yo hice pruebas con una libSDL_sound modificada, y si ponía mi versión en la carpeta del ejecutable, me cargaba esa en lugar de la otra. Si realmente funciona así y no me equivoco, no sería problema ya que no hay que sustituir la que viene con el firmware.

Si eso es verdad, hace eones que tendríamos un port de BennuGD para GP2X con buen rendimiento. Nadie que lo haya probado me ha dicho que funcione... aunque creo que nadie lo ha probado.

hopez
13/08/2010, 13:27
Buennno he encontrado la manera de solucionar el problema de temblequeo, esta tarde colgaré un parche de la librería, es una modificación del modulo variance de tslib...

Estoy preparando el script de backup y tuneo del parámetro que lo soluciona/minimiza.

El problema es que con mi método se produce un poco de lag al arrastrar el cursor, a ver que os parece.

Segata Sanshiro
13/08/2010, 13:39
Buennno he encontrado la manera de solucionar el problema de temblequeo, esta tarde colgaré un parche de la librería, es una modificación del modulo variance de tslib...

Estoy preparando el script de backup y tuneo del parámetro que lo soluciona/minimiza.

El problema es que con mi método se produce un poco de lag al arrastrar el cursor, a ver que os parece.

Genial tío, muchas gracias :brindis: Pero una pregunta, relativo a lo último que dices. Ya sin método especial, se nota bastante el lag al arrastrar el cursor, tanto en Bennu como en la pantalla de calibración del firmware ¿Por qué puede ser? Tiene una respuesta lentísima :( Bueno, me estoy quejando, pero luego igual no molesta, no sé.

SplinterGU
13/08/2010, 16:05
para mi es evidente que va a funcionar mas lento, si estas promediando varias muestras o frames, vas a tener lag. a menos que promedies sobre un historico constante de X muestras anteriores.

hopez
13/08/2010, 19:43
Vamos pues, a ver si alguien lo prueba y funciona...

En principio hace backup de todo lo que se modifica, por tanto no tendría que haber problemas para volver atrás.

fixit.gpe hace el trabajo sucio, dentro hay un parámetro DELTA que sirve para tunear la configuración:

mayor número = menos temblor y sensibilidad y más lag en movimiento

por los valores probados entre 8 y 30 no suelen dar demasiado problema

restore.gpe restaura a originales

Sobre lo del lag que comentais no se por pue puede ser, pero tengo compilado por casa el ts_test original de la librería y ahí noto muucho menos el lag, supongo que es por la manera en como SDL llama a las librerías, tengo que investigarlo

Drumpi
13/08/2010, 20:42
para mi es evidente que va a funcionar mas lento, si estas promediando varias muestras o frames, vas a tener lag. a menos que promedies sobre un historico constante de X muestras anteriores.

Hombre, lo suyo es tener un buffer circular con los X últimos valores y hagas la media con respecto a ellos, lo que pasa es que la media de una linea es el centro de la misma, quizás ahí esté el lag.

Lo mismo se puede aplicar un algoritmo de estimación, que en función de los valores anteriores, diga cual debería ser la posición correcta, eliminado el margen de error. Tendría que mirar mis apuntes de Métodos Numéricos :P

SplinterGU
13/08/2010, 20:44
yo no dije que no, es correcto lo que decis.

hopez
13/08/2010, 21:02
No he tocada nada de como se hace el promedio en la librería original.

Simplemente si mirais el fuente que está incluido he retocado la detección de ruido ya implementada, el problema es que si hay movimiento con valores altos de delta lo caza como ruido y tiene algo de lag para empezar el movimiento.

Por otro lado en el ts_test hay dos botones: uno para mover un cross y otro para pintar lineas blancas en la pantalla.
Cuando SDL pinta el cross el cursor tiene lag, en cambio si dibuja la línea es instantaneo...

Por si alguien lo quiere probar lo dejo aquí también, pero contad que no está reprogramado y por lo tanto la única manera de salir es apagando la wiz.

hopez
14/08/2010, 19:45
Algún feedback? Funciona?

Es por si es publicable o no... que con las marranadas que le he hecho a mi wiz cualquiera se fia... xD

Segata Sanshiro
14/08/2010, 20:00
A mí es que me da un poco de cosa alterar la NAND. ¿No se puede hacer lo de poner la librería en la carpeta del programa que quieres ejecutar?

Rivroner
14/08/2010, 20:09
Splinter, podrías hacer tests de performance en Wiz y Caanoo para ver si rinden igual ambas.

SplinterGU
14/08/2010, 20:21
Splinter, podrías hacer tests de performance en Wiz y Caanoo para ver si rinden igual ambas.

sin problemas, pasame tests de pruebas de lo que quieras que pruebe y yo te paso los resultados.

hopez
14/08/2010, 21:06
A mí es que me da un poco de cosa alterar la NAND. ¿No se puede hacer lo de poner la librería en la carpeta del programa que quieres ejecutar?

Si se puede, tengo que retocar un poco la librería SDL + tslib para que carguen del mismo path la configuración.
Ahora en cuanto publique el último port (antes que salga el concurso XD) me pongo a ello, supongo que no tendreis problema por usar las últimas SDL de ikari

eolpxw
14/08/2010, 23:04
Lo he probado en mi Wiz. No he modificado ningún valor de los que hablas, así que lo he ejecutado como viene por defecto, y sí que se nota bastante la eliminación del tembleque, ya está prácticamente eliminado.
También probé ayer una aplicación que creo que hiciste tú, hopez, pero no la encuentro ahora por el foro, era para decirte que también me funciona y ya puedo acercarme a los bordes de la pantalla, así que en ese aspecto también solucionado. :)

Segata Sanshiro
14/08/2010, 23:34
Qué bueno hopez :brindis: Va a venir de perlas para el ScummVM, fue con ese programa con el que me di cuenta del problema y de lo cantoso que era, y luego vi que una idea que tuve era básicamente impracticable con lo que temblequeaba el puntero, cosa que ahora parece que queda erradicado :)

hopez
25/08/2010, 00:35
Buenas de nuevo, tengo algo ya medio funcionando, es una libSDL de la última versión para wiz que sacaron con los módulos de tslib incorporados directamente, pero se me plantea una duda:

Tslib carga la configuración de dos archivos diferentes, no se si interesa que el tslib.conf sea específico de cada aplicación. Al haber hecho las modificaciones para reducir el temblequeo yo entiendo que lo ideal sería tener un tlib.conf con los valores específicos en la misma carpeta donde metemos nuestra libsdl dinamica pero me gustaría saber vuestra opinión...

¿Cargo la configuración general como siempre o modifico la ruta de búsqueda para hacerla local?

romeroca
25/08/2010, 10:45
Desde mi humilde opinión pienso que la mejor opción es tener un tlib.conf en la misma carpeta donde tenemos nuestra libsdl.

Pero es sólo mi opinión.

Por cierto Hopez, gran trabajo.


Buenas de nuevo, tengo algo ya medio funcionando, es una libSDL de la última versión para wiz que sacaron con los módulos de tslib incorporados directamente, pero se me plantea una duda:

Tslib carga la configuración de dos archivos diferentes, no se si interesa que el tslib.conf sea específico de cada aplicación. Al haber hecho las modificaciones para reducir el temblequeo yo entiendo que lo ideal sería tener un tlib.conf con los valores específicos en la misma carpeta donde metemos nuestra libsdl dinamica pero me gustaría saber vuestra opinión...

¿Cargo la configuración general como siempre o modifico la ruta de búsqueda para hacerla local?

hopez
25/08/2010, 23:32
Ok esta tarde lo he montado para que pirmero busque en la carpeta local un ts.conf, y si no existe va a buscar el original cargado con el entorno.

El problema es que algo no he integrado correctamente porque no detecto correctamente algunos clicks.

Por desgracia el maldito alien se me ha puesto ****** y cuando está así me cuesta mucho centrarme y ponerme a programar, a ver si la medicación se ajusta y vuelvo a ser persona, mientras haré lo que me deje... :brindis:

saboteur
02/09/2010, 21:32
He probado el apaño con mi Ultratumba y con el Scumm y la mejora es increíble. Esto y el calibrado de la pantalla debería haber sido corregido por GPH desde el principio.

Gracias.

Segata Sanshiro
02/09/2010, 21:49
Esto y el calibrado de la pantalla debería haber sido corregido por GPH desde el principio.

Como de costumbre, los que más hacen por sus consolas son sus usuarios, incluso en aspectos básicos como éste que deberían haber arreglado ellos. Gracias de nuevo hopez :brindis: