我是matlab编码的新手,所以我仍然试图解决问题。 我正在使用interia传感器,每隔10ms输出传感器方向数据。我能够将这些数据存储到一个不断更新的文本文件中。
我现在的任务是实时绘制这些数据。这涉及连续访问和读取文本文件(如果可能,每10毫秒)并根据时间绘制此数据。 你们中的任何人都可以给我一些指导,说明最有效的方法。
此时,文本文件仅存储有关一个参数(传感器的x坐标)的数据。我可以用两种方式存储这些数据: 方法1:每10ms新数据。每个都存储在一个新行中。 方法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的解决方案来进行定时文件读取和绘图更新。
我模仿了你的情况并学到了一些东西:
fread
时,MATLAB将不会查找新数据。使用下面fseek
函数中的readFile
查看解决方法。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来获取所有数据。
开始:编写一个只读取自上次调用以来写入的新数据的函数。要实现此目的,请不要关闭文件句柄。它存储位置。