前回のGnuplotアニメーションに続いて、今回はX軸をプロットする毎に16秒分変化させて、以前より滑らかに動くようにしてみました。
動画にした方法は、MacのVNC上で画面録画しただけです。録画時間は約5時間35分、これを2分10秒まで縮めました。
↑ offset値が頻繁に上下していますが、これは生活ノイズ(ここでは電化製品のオンオフなど電気的ノイズを表現)で上下しています。多分、裸のGPSモジュールとラズパイの配線がワニ口クリップの長い配線のせいかも知れません。また、ラズパイのアップグレード中も30μs位変化した所を見たので、そんな要因も含まれます。
↓ 生活ノイズが無いと、このように落ち着いています。
↓ この動画の元になったGnuplotのスクリプト(C言語)です。なぜC言語なのかと言うと、Gnuplotのスクリプトだけで現時刻に応じてX軸の範囲を設定する方法が分からなかったからです。
/*
* loopstats-plot.c
*
* gcc -Wall -o loopstats-plot loopstats-plot.c
* 2020/02/10
*
* loopstatsのoffset値をGnuplotでグラフ化する。
*
* X軸は現時刻から-3600秒前の値を使用。
* X軸は16秒毎に16秒分変化する。
*
*/
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#define YOHAKU 150
int main(void)
{
FILE *gp;
int s1, s2;
gp = popen("gnuplot -persist", "w");
fprintf(gp, "set encoding iso_8859_1\n");
fprintf(gp, "set grid y2tics\n");
fprintf(gp, "set y2range [-0.00004:0.00004]\n");
fprintf(gp, "set y2tics ('40' 0.00004, '30' 0.00003, '20' 0.00002, '10' 0.00001, '5' 0.000005, '0' 0.00000, '-5' -0.000005, '-10' -0.00001, '-20' -0.00002, '-30' -0.00003, '-40' -0.00004)\n");
fprintf(gp, "set xzeroaxis lt -1\n");
fprintf(gp, "set timestamp\n");
fprintf(gp, "unset ytics\n");
fprintf(gp, "set title 'loopstats offset' font 'Helvetica,16'\n");
fprintf(gp, "set xlabel '-3600 (s)' font 'Helvetica,14'\n");
fprintf(gp, "set y2label 'offset ({\265}s)' font 'Helvetica,14'\n");
fprintf(gp, "plot '< tail -225 /var/log/ntpstats/loopstats' using 2:3 with points axis x1y2\n");
while (1) {
time_t t = time(NULL);
s1 = t % 86400 + YOHAKU;
s2 = t % 86400 - 3600 - YOHAKU;
// X軸設定 [現時刻−3600秒:現時刻]
fprintf(gp, "set xrange [%d:%d]\n", s2,s1);
fprintf(gp, "replot\n");
fflush(gp); // ここで描画
sleep(16); // 再描画まで16秒待つ
}
fprintf(gp, "unset output\n");
fprintf(gp, "exit\n");
pclose(gp);
return 0;
}
$ gcc -Wall -o loopstats-plot loopstats-plot.c
$ ./loopstats-plot