【问题标题】:Plot Sensor data in real time using Python使用 Python 实时绘制传感器数据
【发布时间】:2019-08-29 08:01:19
【问题描述】:

我有一个传感器,它每秒提供近 500 次数据,我已连接到 Arduino,我正在使用 Python 读取数据,因为我将在下一步处理它。

我尝试使用来自 Matplolib 的 FuncAnimation

这是动画函数:

def animate(i):
    global data

    # Data comes as one sample per line
    char = ''
    res = ''
    while char != b'\n':
        char = s.read()
        res += char.decode("utf-8")
    res = res[:-1] # To remove a \r added by arduino

    data = data[1:] + [float(res)]

    ax.set_ylim(min(data), max(data))

    line.set_ydata(data)
    return line,

我正在计算使用此代码获取单个值的大致时间:

start = datetime.datetime.now()
while count < 1000:
    char = s.read()
    if char == b'\n':
        count += 1
        print(count)

end = datetime.datetime.now()

T = ((end - start).total_seconds()) / 1000

最后将动画初始化为:

ani = animation.FuncAnimation(fig, animate, interval=T * 1000, blit=False)

当我在 Arduino 上平均大约五个值然后绘图时,它工作正常,它工作但当我全速运行它时 python 崩溃,这让我相信问题与速度有关。此外,即使我对这些值进行平均,情节也落后于实际行动约 5 秒。

如何实时绘制所有值?

【问题讨论】:

    标签: python matplotlib real-time


    【解决方案1】:

    在大多数情况下,许多操作(例如通过连接来增长不可变字符串或连接列表)似乎不会太耗时,但在像这样高速运行时可能会出现问题。

    由于高速采样所需的所有低级优化的麻烦,您最好将这项任务交给生活和呼吸它的人。例如pylslLab Streaming Layer (LSL) 提供了一个 Python 接口,(我认为)它就是为这类事情而设计的。

    此外,即使您以 500 Hz 的频率从数据中采样,也无法有效地更新 500 Hz 的图,而只能以显示器的刷新率(通常为 60 Hz)进行更新。即在 500 Hz 时,您可以在每个 16.666 毫秒的屏幕刷新周期内收集大约 8 个样本。将这些样本中的每一个单独传递到图表是没有意义的,因为直到下一个 16.666 毫秒周期过去后它们才会显示在屏幕上。因此,以 60 Hz(或更低)的频率将它们分块传递。

    【讨论】:

    • 我理解您所说的要点,但不幸的是,我不明白如何在我的应用程序中使用 pylsl。关于如何通过 Arduino 和 lsl 发送数据样本,我找不到任何帮助。我找到的所有示例都给出了它们从其他成熟计算机传输随机数据的示例。您能帮我了解如何使用 lsl 从 Arduino 传输数据吗?
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2016-12-08
    • 2021-01-26
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多