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 iohub
o pyglet
la 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:
iohub
y pyglet
) en Windows o se ha topado con literatura sobre esto?En el foro de Psychopy he recibido algunos consejos:
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 .
steven jeuris
aliced
natalia
aliced
natalia
aliced
natalia