如何在MATLAB中从文本文件中绘制实时数据

时间:2013-12-24 00:53:55

标签: matlab plot text-files real-time real-time-data

我是matlab编码的新手,所以我仍然试图解决问题。 我正在使用interia传感器,每隔10ms输出传感器方向数据。我能够将这些数据存储到一个不断更新的文本文件中。

我现在的任务是实时绘制这些数据。这涉及连续访问和读取文本文件(如果可能,每10毫秒)并根据时间绘制此数据。 你们中的任何人都可以给我一些指导,说明最有效的方法。

此时,文本文件仅存储有关一个参数(传感器的x坐标)的数据。我可以用两种方式存储这些数据: 方法1:每10ms新数据。每个都存储在一个新行中。 方法2:我可以使文本文件只有最新的数据(删除以前的数据) 我能够使用这些方法中的任何一种......无论你认为哪种方法都会更容易。

我已尝试使用其他第三方软件从文本文件中绘制这些数据,但它们看起来都很跳跃,无法快速从文本文件中读取。

感谢。

2 个答案:

答案 0 :(得分:2)

MATLAB计时器对象会有所帮助。例如,请参阅此链接Using MATLAB to process files in real-time after every instance a file is created by a separate program

对于同时写入(您的其他过程)和读取(MATLAB)可能会有一些担心单个文件。您的情况可能更适合管道而不是文件:Pipe vs. Temporary File但我将继续使用基于MATLAB的解决方案来进行定时文件读取和绘图更新。

我模仿了你的情况并学到了一些东西:

  • MATLAB文件句柄存储当前位置。但是,如果为file-id设置了文件结束标志,则在后续调用fread时,MATLAB将不会查找新数据。使用下面fseek函数中的readFile查看解决方法。
  • 10毫秒是乐观的。 MATLAB不会遗漏点,但每次更新通常会添加四个或更多数据点而不是一个。
  • 如果数据源使用缓冲文件写入,则在将缓冲区刷新到磁盘之前,MATLAB将不会看到新数据。下面的python代码用于模拟数据源。该文件已打开,无需缓冲即可写入:fobj = open('test.dat', 'wb', 0)

下面的MATLAB代码:

function [t] = livePlot(period, filename)
    //%   inputs : period : update rate in seconds
    //%            filename : name of the file to get data from
    //%
    //%   outputs: t      : the timer object
    //%                     >> stop(t) 
    //%                     ends streaming
    //%%

    close all;        
    t = timer('StartDelay', 1, 'Period', period, ...
              'ExecutionMode', 'fixedRate');
    //%% timer object callback functions
    t.StopFcn  = {@stopFigure};
    t.TimerFcn = {@updateFigure};
    //%% initialize timer object user data
    d = get(t, 'UserData');
    d.data = []; % array for the data to plot
    axes('Position', [0 0 1 1], 'Visible', 'off');
    d.axes_handle = axes('Position', [.2 .1 .7 .8]);
    d.line_handle = plot(NaN,NaN);
    d.fid = fopen(filename, 'r');    
    set(t, 'UserData', d);    
    start(t);
end

function stopFigure(obj, event)
    //% close function handle
    d = get(obj, 'UserData');
    fclose(d.fid);
end

function updateFigure(obj, event)
    d = get(obj, 'UserData');        
    //% read new data from file
    tmp = readFile(obj);
    //% append to array in user data
    d.data = [d.data transpose(tmp)];
    //% update the plot 
    set(gcf, 'CurrentAxes', d.axes_handle);
    set(d.line_handle, 'XData', 1:length(d.data), 'YData', d.data);
    //% store the timer object user-data
    set(obj, 'UserData', d);
end

function [tmp] = readFile(obj)
    //% read binary data. file-ID is in the timer user-data
    d = get(obj, 'UserData');
    tmp = fread(d.fid);
    fprintf('Current file location : %d \n', ftell(d.fid));
    //% fprintf('End of file indicator : %d \n', feof(d.fid));
    //% reset the end-of-file indicator
    fseek(d.fid, -1, 0);
    fseek(d.fid, 1, 0);
    //% fprintf('End of file indicator : %d \n', feof(d.fid));
    set(obj, 'UserData', d); 
end

每隔~10毫秒将数据写入文件的Python代码:

#!/anaconda/bin/python
import numpy as np
from time import sleep
sleep_time = 0.01
sigma = 5
fobj = open('test.dat', 'wb', 0)
for i in range(5000):
    sleep(sleep_time)
    x = int(np.random.normal(sigma))
    fobj.write('%c' % x)
fobj.close()

答案 1 :(得分:0)

你不能使用硬实时条件进行绘图,因此matlab总是会错过10ms的时间段。您必须使用选项2来获取所有数据。

开始:编写一个只读取自上次调用以来写入的新数据的函数。要实现此目的,请不要关闭文件句柄。它存储位置。