2011-10-02 23 views
5

Tengo una cámara infrarroja/rastreador con la que me comunico a través del puerto serie. Estoy usando el módulo pyserial para hacer esto en este momento. La cámara actualiza la posición de un objeto rastreado a una velocidad de 60 Hz. Para obtener la posición del objeto rastreado ejecuto un pyserial.write() y luego escucho una respuesta entrante con pyserial.read (serialObj.inWaiting()). Una vez que se ha recibido la respuesta/posición, se vuelve a ingresar el ciclo while y así sucesivamente. Mi pregunta tiene que ver con la fiabilidad y la velocidad de este enfoque. Necesito que la computadora obtenga la posición a una velocidad de al menos 60 Hz (y la posición se enviará a través de UDP a un sistema operativo en tiempo real). ¿Es esto algo de lo que Pyserial/Python son capaces o debería considerar enfoques alternativos basados ​​en C?pyserial/python y adquisición de datos en tiempo real

Gracias, Lucas

+1

¿Cómo resultó esto? ¿Qué tipo de tasas de muestreo fue capaz de obtener con Python? He hecho una adquisición simple de datos fuera de una escala ohaus sobre RS232, pero solo pude obtener 5hz (podría haber sido la escala) – Chris

Respuesta

0

Python debería seguir bien, pero lo mejor es asegurarse de controlar cuántas lecturas por segundo recibe. Cuente cuántas veces se completó la lectura cada segundo, y si este número es demasiado bajo, escriba en un registro de rendimiento o similar. También debería considerar desacoplar la parte de E/S del resto de su programa python (si hay uno) ya que las llamadas de lectura pyserial están bloqueando.

+1

gracias por todas las respuestas a todos. Supongo que probaré el rendimiento de las funciones pyserial de lectura/escritura antes de considerar pasar a otra cosa. pero podría explicar las llamadas en serie bloqueadas y por qué tal vez requieran desacoplamiento del resto del programa (tiene razón, la lectura/escritura es solo una pequeña parte de la funcionalidad requerida). – dataman

+0

Pyserial bloqueará de forma predeterminada las llamadas de lectura (puede configurarlo para que no lo haga). Lo que esto significa es que cuando llamas a 'leer', todo el programa se queda y espera a que se escriba algo, luego lo lee y luego tu programa puede continuar. Hay un par de formas de evitar esto, ya sea mediante el uso de llamadas no bloqueadas ('read' devuelve inmediatamente, pero tal vez sin nada), marcos basados ​​en eventos como twisted (twisted sabe que estás esperando y hace otras cosas mientras tanto), o usando procesos/subprocesos (aunque tiene el mismo problema para escuchar los mensajes entrantes del proceso). – jozzas

+1

Sí, he configurado el tiempo de espera = 0 y luego termino obteniendo un char a la vez. es decir, realizo serial.read (1) dentro de un ciclo while y verifico '\ r' que indica el final del comando return y cuando se cumple esa condición, entonces emite una nueva solicitud get position. a partir de una breve experimentación, no parece haber perdido marcos en el sistema de la cámara, lo cual es genial, aunque me gustaría de alguna manera asegurarme de que este sea siempre el caso. como si abriera un navegador mientras el programa se está ejecutando, ¿hay alguna manera de forzar al script a tener la más alta prioridad? – dataman

1

Esto es más una cuestión de latencia que la velocidad.

Python siempre realiza la asignación y liberación de la memoria, pero si los datos se reutilizan, la biblioteca C reutilizará la misma memoria. Entonces, el sistema operativo (biblioteca C/pila UDP/IP) tendrá más impacto que el propio Python.

Realmente creo que debería usar un puerto serie en su máquina RTOS y usar el código C y los búferes preasignados.

0

Sospecho que Python se mantendrá actualizado con los datos. Mi consejo sería que probarlo, y si Python parece retrasarse, a continuación, tratar PyPy lugar - una implementación de Python que recoge la mayor parte de sus bucles internos a código de máquina para la velocidad cerca para que de C.

http://pypy.org/

Cuestiones relacionadas