ちろる

理系大学生が自由気ままに

C++からgnuplot -リアルタイムなグラフ描画-

使用環境: macOS Sierra ver 10.12.6、g++ 4.2.1
前提条件: gnuplotのPATHが通っている

まずは、C++からgnuplotを呼び出すプログラム

FILE* gnuplot = popen("gnuplot", "w"); 
fprintf(gnuplot, "plot 'Position_log.dat' using 1:4 with lines\n"); 
fflush(gnuplot); 

return EXIT_SUCCESS;

popen関数でプロセスへのパイプをオープンする。
Position_log.datには1列目に時間、2列目〜4列目に3次元で位置が記述されている。
fflushはバッファのフラッシュ(データの書き出し)を行なっている。

時間-高度グラフのリアルタイム表示

gnuplotでは以下のようにすると後から点を増やすことができる。eを入力すると終了する。

gnuplot> plot "-"
input data ('e' ends) > 2, 10
input data ('e' ends) > 4, 2
input data ('e' ends) > 3, 8
input data ('e' ends) > 8, 20
input data ('e' ends) > e

この機能を使って少しずつプロットするデータを増やしていけば良い。

FILE* gnuplot = popen("gnuplot", "w"); 
fprintf(gnuplot, "set xrange [0:15]\n");
fprintf(gnuplot, "set yrange [0:150]\n");

int step = 40000;

for (int j=1;j<step;j=j+100){  //j=0ではlineを作れないのでj=1からとする
	fprintf(gnuplot, "plot '-' with lines\n");
	for(int i=0; i<j; i=i+100){
		fprintf(gnuplot, "%lf, %lf\n",data[0][i],data[3][i]);
	}
	fprintf(gnuplot, "e\n"); 
	fflush(gnuplot);
	usleep(20000);
}

return EXIT_SUCCESS;

実時間と一致させるためには、描画時間を測って毎ループでjに足す数やusleepの時間を調整してやるか、
※data[0][:]に時間、data[3][:]に高度が入っている。