使用Python实时绘制传感器数据

时间:2019-08-29 08:01:19

标签: python matplotlib real-time

我有一个传感器,它每秒可以提供近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秒钟。

如何实时绘制所有值?

1 个答案:

答案 0 :(得分:0)

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

由于高速采样需要进行低级优化,因此最好将这项任务交给生活和呼吸的人们。例如pylslLab Streaming Layer(LSL)提供了Python接口,(我认为)LSL专为此类事情而设计。

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