2010-02-03 19 views
5

Voy a escribir un programa que traza los datos de un sensor conectado a la computadora. El valor del sensor se trazará como una función del tiempo (valor del sensor en el eje y, tiempo en el eje x). Quiero poder agregar nuevos valores a la trama en tiempo real. ¿Con qué sería mejor hacer esto en C++?Trazado en tiempo real/registro de datos

Editar: Y por cierto, el programa se ejecuta en una máquina Linux

+1

Paul, esto no es realmente una pregunta, es más una petición de asesoramiento e incluso entonces es vago. Supongo que está buscando una biblioteca de gráficos que le permita agregar datos a la trama de forma dinámica. Sugiero seleccionar las palabras clave de esa oración y dirigirse a Google. – Lazarus

+0

¿Necesita tiempo exacto o el tiempo relativo es suficiente? La obtención de tiempo relativo desde el sistema operativo puede ser más rápido que el tiempo absoluto. –

Respuesta

1

Escribir una función que puede trazar un std::deque de una manera que te gusta, entonces .push_back() los valores del sensor en la cola, ya que vienen disponible, y .pop_front() valores de la cola si se vuelve demasiado larga para un buen trazado.

La naturaleza exacta de su dibujo de las funciones depende de su plataforma, necesidades, sentido de la estética, etc.

+0

Eso parece prometedor. Lo echaré un vistazo. ¡Gracias! – Paul

+2

No puede iterar sobre 'std :: queue', por lo que probablemente quiera usar' std :: deque' directamente; aún puede 'push_back' y' pop_front' con un deque. –

+0

ese es un muy buen punto, actualizaré mi respuesta. –

0

Puede utilizar ring buffers. En dicha memoria intermedia, ha leído la posición y la posición de escritura. De esta forma, un hilo puede escribir en el buffer y otro leer y trazar un gráfico. Por eficiencia, generalmente terminas escribiendo tu propio marco.

El tamaño de dicha memoria intermedia se puede estimar utilizando, por ejemplo, la velocidad de entrega de datos del sensor (40 KHz?), El tamaño de una sonda y el tiempo que desea conservar para el trazado.

También depende de si desea almacenar dichos datos sin comprimir, almacenar trama representada, todo para un análisis fuera de línea adicional. En un entorno que no es RTOS, su "tiempo real" depende de la velocidad de procesamiento: qué tan rápido puede recuperar/almacenar/procesar y trazar los datos. Por lo general, es una eficacia casi en tiempo real.

0

Hice una cosa similar para un dispositivo que tenía un sensor de permeabilidad conectado a través de RS232.

  • paquete de bytes recibidos desde el sensor en paquetes
  • utilizar una colección (principalmente una lista) para almacenarlos
  • impedir el cobro para repasar un tamaño fijo al destrozar los valores mínimos recientes antes de otros nuevos llegan
  • encontrar una biblioteca de gráficos adecuado para dibujar con (tal vez SDL si quiere mantener con calma y multiplataforma), pero esta opción depende de qué tipo de gráfico que necesita (ncurses pueden ser suficientes)
  • último pero no menos importante: ya que está usando un sensor, supongo que su enfoque será de subprocesos múltiples, así que piénselo y use una colección sincronizada o una colección que permita agregar valores cuando otros hilos los estén recuperando (así que olvidé iteradores, tal vez array es suficiente)

por cierto creo que hay tantas bibliotecas, sólo la búsqueda de ellos:

0

Supongo que implementará esta aplicación en un RTOS. Pero, ¿cuál será la tasa de datos y cuáles son los requisitos en tiempo real? Por lo tanto, como se describió anteriormente, una solución simple puede ser más que suficiente. Pero, si tiene restricciones de tiempo reales, todo cambia drásticamente. Un diseño de subprocesos múltiples con tubos de datos puede resolver sus problemas en tiempo real.

3

¿Le preocupa particularmente el aspecto C++? He hecho una frecuencia de 10Hz o más sin perder el tiempo poniendo gnuplot en un ciclo de lectura/trazado/actualización o con LiveGraph sin problemas.

1

Es posible que desee comprobar RRDtool para ver si cumple con sus requisitos.

RRDtool es un sistema de registro de datos y gráficos de alto rendimiento para datos de series de tiempo.

Cuestiones relacionadas