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][:]に高度が入っている。