具有MatplotlibAnimation的Arduino Live串行绘图速度变慢

常春藤

我正在制作一个实时绘图仪,以显示Arduino传感器的模拟变化。Arduino将波特率为9600的值打印到串行中。Python代码如下所示:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import serial
import time

ser = serial.Serial("com3", 9600)
ser.readline()

optimal_frequency = 100

fig = plt.figure(figsize=(6, 6))
ax1 = fig.add_subplot(1, 1, 1)

# the following arrays must be initialized outside the loop

xar = []
yar = []

print(time.ctime())

def animate(i):
    global b, xar, yar # otherwise a

    for i in range(optimal_frequency):

        a = str(ser.readline(), 'utf-8')
        try:
            b = float(a)
        except ValueError:
            ser.readline()
        xar.append(str(time.time()))
        yar.append(b)
    ax1.clear()
    ax1.plot(xar, yar)

ani = animation.FuncAnimation(fig, animate, interval=optimal_frequency)
plt.show()

在该图中可以得到良好的响应时间,但是当我绘制20分钟以上时,反应时间会增加到大约1分钟。也就是说,图形需要1分钟才能使用新值进行更新。我也尝试过使用PyQtGraph,但这从一开始就被延迟了。

除了延迟超过20分钟以外,我在图中还出现了一些过冲和下冲的情况。

有什么帮助吗?

朝日朝日

如评论中所述,您做错了两件事:

  • 您一直在将传入数据追加到数组中,而这些数据在一段时间后会变得巨大
  • 您可以清除轴并ax.plot()在每次迭代中创建一个新轴

您要执行的操作是:

在初始化函数中,创建一个空的Line2D对象

def init():
    line, = ax.plot([], [], lw=2)
    return line,

然后在更新功能(animate())中,line.set_data()用于更新点的坐标。但是,为了保持性能,您必须将阵列的大小保持在合理的大小,因此,随着新数据的传入,您将必须删除旧数据。

def animate(i):
    (...)
    xar.append(str(time.time()))
    yar.append(b)
    line.set_data(xar, yar)
    return line,

看看一些像这样的教程关于SO的问题也很多,已经回答了您的问题。例如,此答案包含使代码正常工作所需的所有元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

插入Arduino串行通讯时YOLOV2变慢

来自分类Dev

重新打开后,arduino 和 pyserial 之间的串行连接变慢

来自分类Dev

python串行到arduino速度测试

来自分类Dev

用 arduino 和 vb 制作串行绘图仪

来自分类Dev

串行打印会减慢代码的执行速度。Arduino到期

来自分类Dev

Xcode,带有arduino的C ++串行端口

来自分类Dev

有许多小的CATextLayers使调整窗口的速度变慢

来自分类Dev

Qt没有从Arduino接收串行数据

来自分类Dev

arduino有时仅执行串行命令

来自分类Dev

mysql中的'IN'子句使执行速度变慢,还有其他选择吗?

来自分类Dev

多个表上的带有 WHERE 子句的 SQL JOIN 速度变慢

来自分类Dev

具有串行通信C#的GUI

来自分类Dev

Arduino串行命令

来自分类Dev

Arduino VirtualBox串行端口

来自分类Dev

Java的Arduino串行通信

来自分类Dev

串行python到arduino

来自分类Dev

Arduino - 处理串行通信

来自分类Dev

Arduino串行解析

来自分类Dev

具有结构无效输出的 Arduino

来自分类Dev

Oracle过程的速度变慢

来自分类Dev

Java游戏速度变慢

来自分类Dev

使ConEmu滚动速度变慢

来自分类Dev

SpriteKit游戏速度变慢

来自分类Dev

绘图,具有多个单词名称的列

来自分类Dev

绘图,具有多个单词名称的列

来自分类Dev

具有RGB颜色的MATLAB绘图

来自分类Dev

在 Arduino Micro 上,有没有办法通过引脚连接使用“串行”端口?

来自分类Dev

几次串行写入后Arduino串行超时

来自分类Dev

具有速度控制的图像动画