【问题标题】:Real time plotting/data logging实时绘图/数据记录
【发布时间】:2010-02-03 12:30:31
【问题描述】:

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

编辑:顺便说一下,程序将在 Linux 机器上运行

【问题讨论】:

  • 保罗,这不是一个真正的问题,它更像是一个寻求建议的请求,即使这样也很模糊。我猜你正在寻找一个图表库,它允许你动态地将数据添加到绘图中。我建议从那句话中挑选关键词并前往谷歌。
  • 您需要准确的时间还是相对时间足够?从操作系统获取相对时间可能比绝对时间快。

标签: c++ plot real-time


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    编写一个函数,该函数可以以您喜欢的方式绘制std::deque,然后将传感器中的.push_back() 值在可用时放入队列中,如果队列变得太长,则从队列中取出.pop_front() 值。绘图。

    绘图功能的确切性质取决于您的平台、需求、审美意识等。

    【讨论】:

    • 这看起来很有希望。我会看看它。谢谢!
    • 你不能迭代std::queue,所以你可能想直接使用std::deque;你仍然可以使用双端队列 @9​​87654326@ 和 pop_front
    【解决方案3】:

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

    此类缓冲区的大小可以通过以下方式估算:传感器的数据传输速度(40KHz?)、一个探针的大小以及您希望为绘图目的保留的时间跨度。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我对一个通过 RS232 连接了磁导率传感器的设备做了类似的事情。

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

        顺便说一句,我认为有很多图书馆,只需搜索它们:

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2013-05-21
            • 1970-01-01
            • 1970-01-01
            • 2013-07-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-08
            • 2011-12-26
            相关资源
            最近更新 更多