Precisión de la medición de la duración de las pulsaciones de teclas psicopáticas

Estoy usando Psychopy y este código para medir la duración de las pulsaciones de teclas como se sugiere en esta respuesta para mi pregunta anterior :

from psychopy.iohub import launchHubServer 
io = launchHubServer()
keyboard = io.devices.keyboard
count = 0
keyinfo = ""
duration = 0
key = ""

io.clearEvents('all')

print 'begin'

while key not in ['escape', 'esc']:
    key_info = keyboard.waitForReleases()[0] 
    count += 1
    key = key_info.key
    keyinfo = key_info
    duration = key_info.duration
    key = key_info.key
    print 'round number:' , count
    print key_info
    print 'Press time was', key_info.duration
    print 'key', key_info.key

Las primeras pruebas parecen prometedoras, pero me preguntaba si hay una diferencia en la precisión iohubo pygletla función en Psychopy. ¿O si hubiera una solución más precisa que usar una de estas dos? Y cómo es la medición de la duración de las pulsaciones. Lo he estado buscando pero no he encontrado ningún dato para Windows. Lo único que encontré son estas pruebas ¿Alguien se topó con una publicación sobre la precisión?

Además, no sé qué tan buenas deberían ser la RAM y la CPU, sé que estoy usando una computadora portátil ASUS con Intel Core i7 2.6 GHz y 16 GB de RAM (Bluetooth, Ethernet. Wi-Fi, móvil y otro tipo de conexiones deshabilitadas) ; efectos visuales de escritorio deshabilitados; antivirus, actualizaciones de software, programas en segundo plano y otro tipo de fuentes de eventos asincrónicos deshabilitados) y la última versión de PsychoPy2.

Traté de hacer pruebas preliminares para medir la precisión de mi prueba y medir la duración de la pulsación de teclas con Psychopy y mi dispositivo de simulación de teclado. Antes de alquilar un equipo más caro, he intentado probar la precisión con una cámara de 60 fps grabando el momento del toque y sin tocar el dispositivo y midiendo con Psychopy al mismo tiempo, para poder comparar estos valores para tener la precisión. . Los 60 fps significan que entre fotogramas hay 16,67 ms. La prueba preliminar de mi cámara barata mostró que la mayor parte del tiempo de procesamiento sería un máximo de aproximadamente 8 ms, por lo que creo que lograré valores aún más bajos con un mejor equipo de grabación con una velocidad de fotogramas más alta. Pero aproximadamente cada décima medición tengo un procesamiento de señal de 24-36 ms.

Mis preguntas resumidas:

  1. ¿Alguien sabe cuál podría ser la razón de que aproximadamente cada décima medición tenga tiempos de procesamiento de señal más altos?
  2. ¿Cómo podría hacer que la medición de la duración de las pulsaciones de teclas sea más precisa?
  3. ¿Alguien ha medido la precisión de la duración de la pulsación de teclas de las diferentes funciones de psychopys2 (por ejemplo, iohuby pyglet) en Windows o se ha topado con literatura sobre esto?
Esta es una muy buena pregunta y ¡bienvenida aquí! Sin embargo, en caso de que no obtenga respuestas de inmediato aquí, le recomiendo que haga una pregunta similar (reformulada para centrarse más en la tecnología específica) en Stack Overflow . Si obtiene una respuesta allí, ¡por supuesto que puede agregar su propia respuesta aquí!
¿Qué es exactamente iohub o pyglet? ¿Cuál es la precisión de 16,67 ms? Quiero decir, ¿qué midió y cómo define la precisión? Y usted dice ... los datos medidos están en algún lugar alrededor de 8 ms , ¿qué datos? ¿Qué mediste? La pregunta es bastante confusa en esta etapa. Además, hay muchas preguntas enterradas en la publicación. ¿Qué es lo que necesitas saber? Por favor sea claro y explícito.
He tratado de reformular la pregunta y hacer que la información sea más clara. Gracias Steven Jeuris por la sugerencia, ¡ese será mi segundo paso!
Gracias por esto. Entonces, básicamente está preguntando cuál podría ser la razón de que ... [A] aproximadamente cada décima medición tengo un procesamiento de señal de 24-36 ms .
Gracias por la sugerencia, las preguntas ahora se resumen al final.
¿Cuál es la relación entre la duración de la pulsación de tecla y la velocidad de fotogramas? Además, la precisión de la duración de la pulsación de tecla es difícil de cuantificar, ya que necesita saber cuánto tiempo se presionó en realidad en comparación con lo que está midiendo. Así que todavía es difícil interpretar tu publicación. Además, es importante saber con qué frecuencia ocurren los lapsos. Quiero decir, si es aleatorio, el problema subyacente será diferente que cuando exactamente uno de cada diez está mal. Pero lo más importante es: ¿qué probaste exactamente?
la cámara con este framerate es solo una forma de probar la medición (pero la cámara no es tan precisa por el bajo framerate), para ver si lo que mido es correcto uso la cámara, porque de momento no tengo cualquier otro método confiable y debido a que no sé cuánto tiempo se presionó realmente, es por eso que estoy grabando la presión de la tecla con la cámara y comparándola con los valores medidos con mi dispositivo. Y aproximadamente cada décima pulsación de tecla, se miden tiempos más largos de los que registra la cámara.

Respuestas (2)

En el foro de Psychopy he recibido algunos consejos:

  • Una sería cambiar el código: eliminar el comando de impresión, sin redefinición de variables
  • USB, dispositivo USB, Python y las bibliotecas del sistema deben ser las más nuevas y rápidas, si es posible, ya que podrían influir en la precisión.
  • Y ese foro de Psychtoolbox podría tener la solución, pero de momento no la he encontrado.
Esto es lamentablemente una ausencia total de respuesta. Referirse a fuentes externas sin verificar no es una buena contribución a este sitio.
Esta no es mi respuesta, como se indicó, y por lo tanto tampoco se verificó como la solución del problema. Siguiendo el consejo de Steven Jeuris, hice la pregunta en un foro diferente y solo resumí la respuesta que recibí aquí, para compartir esta información o generar algunas ideas. Tal vez hubiera sido mejor un comentario, pero la pregunta anterior tenía tantos comentarios que pensé que sería demasiado confuso.

Esto, francamente, debería haberse preguntado en SO, ya que es 99% una pregunta de programación. Hay muchas cosas que pueden contribuir a la precisión "puntiaguda" que ha visto:

  • lenguaje/tiempo de ejecución: Python no es una buena idea para nada que requiera precisión en tiempo real. Es un lenguaje interpretado con recolección de basura . Las [re] asignaciones en su bucle (eventualmente) activarán eso. Una vez escribí una interfaz Python GTK para un dispositivo en tiempo real, pero el código que controlaba el dispositivo estaba completamente en C, y no se hizo nada crítico en el tiempo en el lado de Python.

  • En última instancia, las asignaciones de memoria dinámica en tiempo de ejecución de C (en las que finalmente se basa Python ) tampoco son predecibles en términos de tiempo , aunque probablemente esto no sea lo que está viendo. Para el software en tiempo real, generalmente se evita la asignación dinámica.

  • sistema operativo: no se ejecuta con la prioridad de proceso/subproceso lo suficientemente alta, por lo que ocasionalmente otros procesos/subprocesos lo reemplazan.

  • hardware/controlador: USB envía datos en paquetes a una velocidad de sondeo limitada; 8 ms (125 Hz) es el valor predeterminado para la mayoría de los dispositivos de entrada. A menos que pueda cambiar el valor predeterminado, un teclado PS/2 suele ser más rápido; ver tabla 2 en Shimizu 2002 ; la peor desviación estándar (SD) para el tiempo de respuesta que se vio allí para un teclado USB fue de alrededor de 10 ms, lo que parece menos de lo que vio, por lo que probablemente tenga problemas adicionales. Solo un teclado PS/2 supera los 3ms SD (por un poco).

  • el microcontrolador (o posiblemente chips adicionales, por ejemplo ) en su teclado implementan algo llamado antirrebote, que suaviza las pulsaciones y liberaciones para compensar las características mecánicas de los interruptores del teclado. Sin esto, tendrás prensas basura como en el caso de algunas computadoras portátiles Dell hace algunos años. El rebote se aplica tanto a las pulsaciones como a las liberaciones de teclas. Para la mayoría de los teclados, el rebote no será configurable o será muy fácil averiguar cuáles son las configuraciones.

Desde una perspectiva de ingeniería, lo primero que hay que preguntarse es qué precisión necesita realmente. Y desde una perspectiva científica, ¿para qué necesita esta medida? Su pregunta huele a un gran problema xy .