Построение в реальном времени / регистрация данных - PullRequest
5 голосов
/ 03 февраля 2010

Я собираюсь написать программу, которая отображает данные с датчика, подключенного к компьютеру. Значение датчика будет отображаться как функция времени (значение датчика по оси Y, время по оси X). Я хочу иметь возможность добавлять новые значения на график в режиме реального времени. Что было бы лучше всего сделать это в C ++?

Редактировать: И, кстати, программа будет работать на машине Linux

Ответы [ 6 ]

3 голосов
/ 13 июня 2010

Вы особенно обеспокоены аспектом C ++?Я сделал примерно 10 Гц или около того, чтобы оценить данные без проблем, поместив gnuplot в цикл чтения / печати / обновления или LiveGraph без проблем.

1 голос
/ 22 июня 2010

Возможно, вы захотите проверить RRDtool , чтобы убедиться, что оно соответствует вашим требованиям.

RRDtool - это высокопроизводительная система регистрации и отображения данных для временных рядов.

1 голос
/ 03 февраля 2010

Вы можете использовать кольцевые буферы . В таком буфере вы прочитали положение и записали положение. Таким образом, один поток может записать в буфер, а другой - прочитать и построить график. Для эффективности вы обычно пишете свои собственные фреймворки.

Размер такого буфера можно оценить, используя, например: скорость доставки данных от датчика (40 кГц?), Размер одного зонда и временной интервал, который вы хотели бы сохранить для построения графиков.

Это также зависит от того, хотите ли вы хранить такие данные в несжатом виде, сохранять отрисованный график - все это для дальнейшего анализа в автономном режиме. В среде без RTOS ваше «в реальном времени» зависит от скорости обработки: насколько быстро вы можете извлекать / хранить / обрабатывать и отображать данные. Обычно это эффективность почти в реальном времени.

1 голос
/ 03 февраля 2010

Напишите функцию, которая может отображать std::deque так, как вам нравится, затем .push_back() значения от датчика в очередь по мере их поступления и .pop_front() значения из очереди, если она становится слишком длинной для хорошего черчения.

Точный характер вашей функции печати зависит от вашей платформы, потребностей, чувства эстетики и т. Д.

0 голосов
/ 02 апреля 2010

Я предполагаю, что вы развернете это приложение в ОСРВ. Но какова будет скорость передачи данных и каковы требования в реальном времени! Поэтому, как написано выше, простого решения может быть более чем достаточно. Но, если у вас есть жесткие ограничения реального времени, все резко меняется. Многопоточная конструкция с каналами данных может решить ваши проблемы в реальном времени.

0 голосов
/ 03 февраля 2010

Я сделал то же самое для устройства, к которому подключен датчик проницаемости через RS232.

  • пакетных байтов, полученных от датчика в пакеты
  • использовать коллекцию (в основном список) для их хранения
  • не позволяет коллекции превышать фиксированный размер, удаляя самые последние значения до поступления новых
  • найдите подходящую графическую библиотеку для рисования (возможно, SDL , если вы хотите, чтобы она была простой и кроссплатформенной), но этот выбор зависит от того, какой граф вам нужен ( ncurses может быть достаточно)
  • последнее, но не менее важное: поскольку вы используете датчик, я полагаю, что ваш подход будет многопоточным, поэтому подумайте об этом и используйте синхронизированную коллекцию или коллекцию, которая позволяет добавлять значения, когда их извлекают другие потоки (так что забыли итераторы, может быть, достаточно массива)

Кстати, я думаю, что библиотек так много, просто поищите их:

...