1

私はmatlabコーディングが初めてなので、まだ頭を悩ませようとしています。10msごとにセンサーの向きデータを出力するinteriaセンサーを使用しています。このデータを、継続的に更新されるテキスト ファイルに保存できます。

私の仕事は、このデータをリアルタイムでプロットすることです。これには、テキスト ファイルへの継続的なアクセスと読み取り (可能であれば 10 ミリ秒ごと) が含まれ、このデータを時間に関してグラフ化します。これを行うための最も効果的な方法について、どなたかアドバイスをいただけないでしょうか。

現時点では、テキスト ファイルには 1 つのパラメーター (センサーの x 座標) に関するデータのみが格納されます。このデータは 2 つの方法で保存できます。方法 1: 10 ミリ秒ごとに新しいデータを保存します。それぞれが新しい行に格納されます。方法 2: テキスト ファイルに最新のデータのみを含めることができます (以前のデータを消去します)。これらの方法のいずれかを使用できます。

他のサードパーティ製ソフトウェアを使用してテキスト ファイルからこのデータをグラフ化しようとしましたが、それらはすべて非常に不安定に見え、テキスト ファイルから十分な速さで読み取ることができませんでした。

ありがとう。

4

2 に答える 2

2

MATLAB タイマー オブジェクトが役立ちます。たとえば、このリンクUsing MATLAB to process files in real-time after every instance a file is created by a separate program を参照してください。

単一のファイルへの書き込み (他のプロセス) と読み取り (MATLAB) の同時実行に関して、いくつかの懸念があるかもしれません。あなたの状況は、ファイルよりもパイプに適している可能性があります:パイプと一時ファイルですが、時間指定されたファイルの読み取りとプロットの更新のための MATLAB ベースのソリューションに進みます。

私はあなたの状況をエミュレートし、いくつかのことを学びました:

  • MATLAB ファイル ハンドルは現在の位置を格納します。ただし、file-id に end of file フラグが設定されている場合、MATLAB は後続の への呼び出しfreadが行われたときに新しいデータを検索しません。fseek以下の関数で使用する回避策を参照してくださいreadFile
  • 10 ミリ秒は楽観的です。MATLAB は点を見逃すことはありませんが、通常、更新ごとに 1 つではなく 4 つ以上のデータ点が追加されます。
  • データのソースがバッファー ファイル書き込みを使用している場合、バッファーがディスクにフラッシュされるまで、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()
于 2013-12-24T19:51:34.387 に答える
0

ハード リアルタイム条件を使用してプロットすることはできないため、matlab が 10 ミリ秒のタイムスロットを見逃すことが常に発生する可能性があります。すべてのデータを取得するには、オプション 2 を使用する必要があります。

開始するには: 最後の呼び出し以降に書き込まれた新しいデータのみを読み取る関数を作成します。これを実現するには、ファイル ハンドルを閉じないでください。位置を格納します。

于 2013-12-24T01:03:17.767 に答える