我有一个传感器,它每秒可以提供近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秒钟。
如何实时绘制所有值?
答案 0 :(得分:0)
许多操作,例如通过连接来增长不可变的字符串或连接列表,在大多数情况下似乎不太耗时,但是在像这样高速运行时可能会出现问题。
由于高速采样需要进行低级优化,因此最好将这项任务交给生活和呼吸的人们。例如pylsl
为Lab Streaming Layer(LSL)提供了Python接口,(我认为)LSL专为此类事情而设计。
此外,即使您以500 Hz的频率对数据进行采样,也无法有效地以500 Hz的频率更新绘图,而只能以监视器的刷新率(通常为60 Hz)进行更新。也就是说,在500 Hz的频率下,您可以在每个16.666 ms屏幕刷新周期内收集大约8个样本。将这些样本中的每个样本单独传递到图形没有意义,因为直到下一个16.666毫秒的时间段过去,它们才会在屏幕上显示。因此,请将它们以60 Hz(或更小)的频率成团通过。