实时绘图/数据记录

7
我将编写一个程序,该程序可以绘制与计算机连接的传感器的数据。传感器值将作为时间函数绘制(传感器值在y轴上,时间在x轴上)。我希望能够实时向图表添加新值。在C++中,最好用什么来实现这个功能?
编辑:顺便说一下,该程序将在Linux机器上运行。

1
Paul,这不是一个问题,更像是一次请求建议,即使是这样也很模糊。我猜你正在寻找一个图表库,它允许你动态地添加数据到绘图中。我建议从那个句子中挑选关键词并前往谷歌搜索。 - Lazarus
你需要精确时间还是相对时间就足够了?从操作系统中获取相对时间可能比绝对时间更快。 - Thomas Matthews
6个回答

4

您是否特别关注C++方面?我通过将gnuplot放入读取/绘图/刷新循环或使用LiveGraph 轻松完成了大约10Hz的数据率,没有遇到任何问题。


2

编写一个函数,可以以您喜欢的方式绘制std :: deque,然后在传感器可用时将值.push_back()到队列中,并从队列中.pop_front()值,如果它变得太长以进行良好的绘图。

您的绘图函数的确切性质取决于您的平台、需求、审美感等。


看起来很有前途。我会看一下的。谢谢! - Paul
2
你不能迭代遍历std::queue,所以你可能想直接使用std::deque;你仍然可以使用双端队列进行push_backpop_front - James McNellis

1

你可以使用环形缓冲区。在这样的缓冲区中,您有读取位置和写入位置。这样,一个线程可以向缓冲区写入数据,另一个线程可以读取并绘制图形。为了提高效率,通常需要编写自己的框架。

可以通过以下方式估算这种缓冲区的大小:传感器的数据传输速度(40KHz?),一个探头的大小以及您想要保留用于绘图目的的时间跨度。

这还取决于您是否希望存储此类数据未压缩,存储渲染后的图形以供进一步离线分析。在非RTOS环境中,您的“实时”取决于处理速度:您检索/存储/处理和绘制数据的速度有多快。通常它是接近实时效率的。


1

你可能想要查看RRDtool,以确定它是否符合你的需求。

RRDtool是一个高性能的时间序列数据记录和绘图系统。


0

我曾经为一个通过RS232连接的渗透传感器设备做过类似的事情。

  • 将从传感器接收到的字节打包成数据包
  • 使用集合(主要是列表)来存储它们
  • 在新值到达之前,通过删除最近的值来防止集合超过固定大小
  • 找到一个合适的图形库进行绘制(如果你想保持简单和跨平台,可以选择SDL),但这个选择取决于你需要什么样的图表(ncurses可能已经足够了)
  • 最后但并非最不重要的一点:由于你正在使用传感器,我想你的方法将是多线程的,所以请考虑使用同步集合或允许在其他线程检索值时添加值的集合(因此忘记迭代器,也许一个数组就足够了)

顺便说一句,我认为有很多库,只需要搜索一下:


0

我假设你会在一个实时操作系统上部署这个应用程序。但是,数据速率是多少?有什么实时要求呢!因此,如上所述,一个简单的解决方案可能就足够了。但是,如果你有强实时约束,一切都会变得截然不同。一个带有数据管道的多线程设计可以解决你的实时问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接