0

センサーのスキャン値をリアルタイムでプロットする必要があります。この目的で gnuplot を使用しています。これまでのところ、c++ プログラムから gnuplot と通信できます。.DAT ファイルを使用していくつかのサンプル プロットを試してみましたが、うまくいきました。ここで、私の要件は、比較のためにセンサー スキャン値の最後の 5 つの値を 1 つのプロットにプロットすることです (つまり、10 個のデータ配列を保存する必要があります。1 つのスキャンには 2 つの配列 X と Y があります)。

私がやろうとしているのは、最後の 5 つのスキャン値をこのような .DAT ファイルの列形式で保存することです。ここで、x、y は各スキャンの 2 つの配列です。次に、gnuplot コマンド"plot 'filename.dat'を使用します。 1:2" "plot 'filename.dat' 2:3" など. 次に、5回のスキャンごとにファイルを書き直す必要があります。

X1  Y1   X2  Y2   X3  Y3   X4  Y4   X5  Y5 
2.3 3.4  6.6 3.6  5.5 6.5  8.5 5.5  4.5 6.6
4.3 4.5  6.2 7.7  4.3 9.2  1.4 6.9  2.4 7.8

先に進む前に、これがリアルタイム処理に効率的かどうかを確認したいだけです。また、gnuplot には、.dat ファイルを使用せずに 2 つの配列から直接プロットするコマンドがありますか。検索しても見つかりませんでした。

どんな提案も役に立ちます。

4

2 に答える 2

3

おそらく、パイプ経由で gnuplot と通信しています。gnuplot は別のプロセスであるため、プログラムのメモリ空間にアクセスできず、何らかの方法で送信しないとデータをプロットできません。最も簡単な方法は、あなたが言及した方法です(一時ファイルを作成し、コマンドをgnuplotに送信して一時ファイルを読み取り/プロットします)。もう 1 つの簡単な方法は、gnuplot のインライン データを使用することです。次のように動作します。

plot '-' using ... with ...
   x1 y1
   x2 y2
   x3 y3
   ...
   e

この場合、データファイルは gnuplot パイプに直接書き込まれ、一時ファイルは必要ありません。(疑似ファイル '-' に関するその他の質問についてhelp datafile special-filenamesは、gnuplot のドキュメントを参照してください)。

このアプローチがリアルタイムで有用である限り、gnuplot のレンダリング速度が再レンダリング間の時間と比較して高速である限り、問題なく動作するはずです。(配列がHUGEの場合、いくつかのメモリの問題もあると思いますが、実際のアプリケーションが 10 個の 1-D 配列のみに制限されるとは思えません。また、配列がそれほど大きい場合は、おそらく全体を送信するべきではありません。とにかくgnuplotすること)

于 2012-04-12T12:43:46.613 に答える
1

これを見てください: https://github.com/dkogan/feedgnuplot

標準入力をプロットするための汎用ツールです。とりわけ、入ってくるデータのリアルタイム プロットを作成できます。直接サポートされていない形式のデータがある場合は、awk や perl などでストリームを前処理します。

于 2012-04-20T07:10:50.913 に答える