gnuplot を利用して、センサの測定値をグラフ描画できるようになりました。しかし、測定値をデータ ファイルに一旦書き出してからグラフを描くため、まさに今、センサがどのような測定値を出力して、どのように測定値が変化しているのか、その変化をリアルタイムに見ることができませんでした。この記事では、センサなどの測定値を、リアルタイムに gnuplot でグラフ描画する方法を紹介します。
先の例と同じように、測定プログラムを実行して、センサの測定値をデータ ファイルに書き出します。そして、この測定プログラムを走らせたまま、平行して、データ ファイルからデータを読出し、グラフを描画します。
先ず、下準備として、gnuplot の一連のコマンドを書いた gnuplot.cmd
を作成しておきます。このファイルには、sensor.txt
からデータを読み出し、一定周期で繰り返しグラフを描画するようコマンドが書かれています。
set xrange [-1.5:1.5] set yrange [-1.5:1.5] plot "< tail -10 sensor.txt" using 2:3 w l pause 0.1 reread
set xrange [下限値:上限値]
)tail
を利用して、データ ファイルの末尾からデータを取り出し、その結果を gnuplot に取り込みます(<
)。測定プログラムは、データ ファイルの末尾に新しい測定値データを追記していきますので、最新のデータから 10 行だけを取り出してグラフを描画します。この数値を増やすと、グラフの軌跡が長くなります。pause 0.1
)、reread
)。
測定プログラムを実行中のターミナル ウィンドゥとは別に、新しいターミナル ウィンドゥを開き、gnuplot の引数に gnuplot.cmd
を与えて実行します。すると、gnuplot のグラフ ウィンドゥが表示され、データ ファイルの内容が(ほぼ)リアルタイムにグラフ描画されます(Fig.1 )。スクリーン ショットでは判りませんが、センサを傾けると、その動きに応じて即座にグラフが変化します。測定を止めたり、グラフ描画を止めるには、ターミナル ウィンドゥで Ctrl+C を押します*1。
$ gnuplot gnuplot.cmd
この方法の大きなメリットは、測定値などのデータをテキスト形式で書き出せるプログラムであれば、改造を必要とせずにそのまま使えるという点です。実際、この例でも、前回使った測定プログラムをそのまま使っています。
先のデータ ファイルを介してグラフ描画を行う方法とは別に、プロセス間通信(パイプ)を利用して gnuplot でグラフ描画を行う方法を紹介します。gnuplot は標準入力からコマンドやデータを受け取ることができるので、測定プログラム内において gnuplot を子プロセスとして起動し、gnuplot へパイプを介して測定値を書き出すことで、gnuplot にグラフを描画させることができます。
gnuplot.cmd
)を必要とせず、計測プログラムを一つを実行するだけで、測定とグラフ描画を行えます。測定プログラムを実行すれば、測定とグラフ描画を開始します。測定を止めるには Ctrl+C でプログラムを止めます。
$ python i2c_mpu6050_pipe.py
: # gnuplot を子プロセスとして起動 g = os.popen( 'gnuplot -noraise', 'w' ) : # gnuplot にコマンドを書き出す g.write(""" set xrange [-1.5:1.5] set yrange [-1.5:1.5] set zrange [-1.5:1.5] splot '-' with lines linewidth 3 """) while i < BUFFER_SIZE: g.write( "%f %f %f\n" % ( accel_x[i], accel_y[i], accel_z[i] )) g.write( "e\n" ) g.flush() # 即時反映 : g.close()
プログラム全体が長く、センサからの測定値の取得処理などは全く同じですので、要所のみ説明します。他に少し違う点としては、軌跡を描く際に必要な過去のデータを自前で保持する必要があり、その目的で ring buffer を使用するようになっています。
w
)で、子プロセスとして起動し、そのパイプ(g
)を取得します。-persist
オプションを付けると、プログラムが終了してパイプが閉じられても、gnuplot のウィンドゥは閉じられずに残ったままになります。測定プログラムを何度も実行すると、ウィンドゥが次々と開いて鬱陶しいので付けていません。-noraise
オプションを付けると、ウィンドゥが前に固定されません。ターミナル ウィンドゥで Ctrl+C しないと終了できないので、このオプションがあった方が良いと思います。g.write
)。'-'
)からデータを読込み、3 次元グラフを描画(splot
)します。パイプは gnuplot の標準入力に繋がっているので、パイプに対して直接データを流し込むことが可能です。e
を書き込みます。これは gnuplot のデータ列の仕様です。g.close
) gnuplot を終了します。