快速绘制Python中的数据

2024-06-01 22:16:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用arduino绘制mpu6050 imu的数据。MPU6050发送数据的速度比plot快。Arduino代码提供6个数据,分别是来自串行端口的偏航、俯仰、横摇、轴、轴和轴。我需要快速策划的建议。

Python代码:

import serial
import matplotlib.pyplot as plt #import matplotlib library
from drawnow import * 

ser = serial.Serial('COM9', 115200)
yaw = 0.0
pitch =0.0
roll =0.0
ax =0.0
ay =0.0
az =0.0
o_yaw= [0]
o_pitch= [0]
o_roll= [0]
o_ax= [0]
o_ay= [0]
o_az= [0]
plt.ion()
cnt=0
def makeFig(): 
    plt.ylim(-1000,1000)                                 
    plt.grid(True)
    plt.ylabel('Magnitude')  
    plt.plot(olculen_ax, 'ro-', label='ax') 
    plt.plot(olculen_ay, 'bo-', label='ay')  
    plt.plot(olculen_az, 'go-', label='az')                               
    plt.legend()                    
while True:
    incoming=ser.readline()
    if ("hand" in incoming):
        incoming=incoming.split(":")
        if len(incoming)==8:
            yaw = float(incoming[1])
            pitch = float(incoming[2])
            roll = float(incoming[3])
            ax = float(incoming[4])
            ay = float(incoming[5])
            az = float(incoming[6])
            print "Split works"
    else:
        print incoming
    o_ax.append(ax)                    
    o_ay.append(ay)    
    o_az.append(az)
    o_yaw.append(yaw)
    o_pitch.append(pitch)
    o_roll.append(roll)              

    drawnow(makeFig)                       
    plt.pause(.00001)                     
    cnt=cnt+1
    if(cnt>50):                            
        o_ax.pop(0)
        o_ay.pop(0)                     
        o_az.pop(0)

Arduino代码(我只是添加循环。源于this的代码:

void loop() {
    if (!dmpReady) return;
    while (!mpuInterrupt && fifoCount < packetSize) {
    }

    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    fifoCount = mpu.getFIFOCount();

     if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
    mpu.resetFIFO();
    //Serial.println(F("FIFO overflow!"));
} else if (mpuIntStatus & 0x02) {
    while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
    mpu.getFIFOBytes(fifoBuffer, packetSize);
    fifoCount -= packetSize;
    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetAccel(&aa, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
    mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
    mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
    Serial.print("hand:");
    Serial.print(ypr[0] * 180/M_PI);
    Serial.print(":");
    Serial.print(ypr[1] * 180/M_PI);
    Serial.print(":");
    Serial.print(ypr[2] * 180/M_PI);
    Serial.print(":");
    Serial.print(aaWorld.x);
    Serial.print(":");
    Serial.print(aaWorld.y);
    Serial.print(":");
    Serial.print(aaWorld.z);
    Serial.println(":");
}

}

Tags: ifserialpltaxfloatazprintroll
2条回答

pyqtgraph模块是一个很好的解决方案。这是非常快和容易的。

以下是新代码:

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
from pyqtgraph.ptime import time
import serial

app = QtGui.QApplication([])

p = pg.plot()
p.setWindowTitle('live plot from serial')
curve = p.plot()

data = [0]
raw=serial.Serial('COM9', 115200)


def update():
    global curve, data
    line = raw.readline()
    if ("hand" in line):
       line=line.split(":")
       if len(line)==8:
            data.append(float(line[4]))
            xdata = np.array(data, dtype='float64')
            curve.setData(xdata)
            app.processEvents()

timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)

if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

在Matplotlib中实时绘图?你买的所有电力都要付出代价。自动缩放、自动轴等。。。一切都需要时间!

一个快得多的解决方案是使用一个工具包,比如Gtk,然后自己绘制,使用一个画布,比如googlecanvas。

不过,为了加快绘图速度,您可以做一些事情。

  • 为什么是暂停语句?
  • 将通信拆分到另一个线程,并使绘图在准备就绪时获取以下示例(跳过输入队列中的值)
  • 您正在追加,这使绘图经常重新缩放。采集N个样品后,取出第一个样品。
  • 我相信可以用MatPlotLib(不确定)在后台打印,然后不那么频繁地复制到屏幕上。

相关问题 更多 >