2010-02-03 70 views
5

我打算编写一个程序,绘制连接到计算机的传感器的数据。传感器值将被绘制为时间的函数(传感器值在y轴上,时间在x轴上)。我希望能够实时向剧情添加新的值。用C++做什么最好?实时绘图/数据记录

编辑:顺便说一下,该方案将在Linux机器

+1

保罗,这不是一个真正的问题,它更多的是一个建议的请求,即使那么它是模糊的。我猜你正在寻找一个图表库,允许你动态地将数据添加到图表中。我建议从该句中选择关键字并前往Google。 – Lazarus 2010-02-03 12:35:02

+0

您是否需要准确的时间或相对时间是否足够?从操作系统获取相对时间可能比绝对时间快。 – 2010-02-03 18:17:07

回答

1

上运行写,可以在你喜欢的方式从传感器.push_back()值绘制std::deque,然后继续向队列,因为他们来的函数可用的和.pop_front()值来自队列,如果它变得太长以至于很好的绘图。

您的绘图功能的确切性质取决于你的平台上,需要,审美意识等

+0

看起来很有希望。我会看看它。谢谢! – Paul 2010-02-03 12:45:46

+2

你不能遍历一个'std :: queue',所以你可能想直接使用'std :: deque';你仍然可以通过deque来push_back和pop_front。 – 2010-02-03 13:57:44

+0

这是一个很好的观点,我会更新我的答案。 – 2010-02-03 22:59:25

0

您可以使用ring buffers。在这样的缓冲区中你已经读取了位置和写入位置。这样一个线程可以写入缓冲区和其他读取并绘制图形。为了提高效率,您通常最终会编写自己的框架。

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

这也取决于您是否想要存储未压缩的数据,存储渲染图 - 所有这些都用于进一步的离线分析。在非RTOS环境中,您的“实时”取决于处理速度:您可以多快地检索/存储/处理和绘制数据。通常它接近实时效率。

0

我做了一个类似的事情,对于通过RS232连接了渗透性传感器的设备。

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

顺便说一句,我认为有这么多的图书馆,只是寻找他们:

0

我假设你将在RTOS上部署这个应用程序。但是,数据传输率和实时要求是什么?因此,如上所述,一个简单的解决方案可能绰绰有余。但是,如果你有严格的实时限制,一切都会发生巨大的变化。使用数据管道的多线程设计可以解决您的实时问题。

3

您是否特别关注C++方面?通过将gnuplot放入读取/绘图/刷新循环或使用LiveGraph而没有任何问题,我已经完成了10Hz左右的速率数据,而不会出汗。

1

您可能想查看RRDtool以查看它是否符合您的要求。

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