Одновременно получать данные и обновлять график, используя python и matplotlib - PullRequest
2 голосов
/ 01 апреля 2011

Я пишу код на Python для связи с ультразвуковым измерителем расстояния через последовательный порт, чтобы сделать следующее:
- Каждые 0,1 секунды, отправлять команду на датчик для измерения расстояния и регистрироватьотклик датчика
-Отобразите график всех измерений расстояния за последние 5 секунд

Вот мой код:

import serial
import numpy as np
import time
from matplotlib import pyplot as plt

tagnr=2#Tag number of the sensor that we're pinging  
samplingRate=.1#Sampling Rate in seconds  
graphbuf=50.#Buffer length in samples of logger graph  

!#Initialize logger graph  
gdists=np.zeros(graphbuf)  
ax1=plt.axes()  

!#Main loop  
nsr=time.time()#Next sample request  
try:  
    while True:  
        statreq(tagnr)#Send status request to sensor over serial port  
        temp,dist=statread(tagnr)#Read reply from sensor over serial port  
        gdists=np.concatenate((gdists[1:],np.array([dist])))  
        print gdists  
        nsr=nsr+samplingRate  
        while time.time()<nsr:  
            pass  

finally:  
    ser.close()#Close serial port  
    print 'Serial port closed.'  

Прямо сейчас мой код может получить массивиз последних 50 измерений, но я не знаю, как отобразить их на графике одновременно (я обычно строю свои графики с помощью Matplotlib).Должен ли я использовать потоки?Или использовать анимированный график, используя pyGTK или pyQt4?Я также думал об использовании Pygame?Мой механизм синхронизации тоже не очень оптимальный, но я думаю, что он довольно точный.

1 Ответ

1 голос
/ 01 апреля 2011

matplotlib имеет анимированные графики, которые позволяют обновлять данные во время отображения графика: посмотрите на эту страницу .

Ваш код может выглядеть так:1006 *

Просто несколько советов (возможно, плохих): я бы лично использовал time.sleep таким образом, чтобы освободить процессор без потери точности.Я бы также добавил некоторый тип ошибки в ваш блок try / кроме.И я думаю np.roll лучше / быстрее, чем concatenate.

...