Оперативное графическое изображение/регистрация данных

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

Править: И между прочим, программа будет работать на машине Linux

5
задан Paul 3 February 2010 в 12:30
поделиться

6 ответов

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

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

1
ответ дан 14 December 2019 в 13:35
поделиться

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

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

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

1
ответ дан 14 December 2019 в 13:35
поделиться

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

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

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

0
ответ дан 14 December 2019 в 13:35
поделиться

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

0
ответ дан 14 December 2019 в 13:35
поделиться

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

3
ответ дан 14 December 2019 в 13:35
поделиться

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

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

1
ответ дан 14 December 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: