2022 年度 OSS リテラシ 3 : センサーの較正 (超簡易版)

はじめに

センサーの出力値には必ず誤差が含まれる. 基準からの絶対誤差を精度 (Accuracy) と言い, センサーのデータシートで確認することができる. 例えば Si7021 のデータシート からは, 温度の絶対誤差は ± 0.4℃であることがわかる.

利用するセンサーの 1 つ 1 つについて特性を調べて補正式を作ればセンサー同士の「相対的な精度」を上げることができる. 例えば京都大学の酒井教授のグループでは 利用するセンサーについて徹底的に較正を行い, センサ同士の相対的な精度を精度の 1/10 程度まで押さえ込んでいる.

しかしながら, 今回は較正にかける十分な時間がないため, 「センサーが壊れていないか」「精度がデータシート通りになっているか」を把握することを目的とする.

準備:スクリプトの調整

今回は 3 名で 1 チームとする. チーム内で代表者を決め, 代表者のサーバに全部のデータを送るよう各自のスクリプト (sensor.sh) を調整する. 以下のスクリプトの例では変数 url1 に代表者のサーバの URLを設定し, そこへ curl コマンドを用いてデータを送信している.

また, 今回は念のために教員のサーバにもデータを送って欲しい. 以下のスクリプトの例では変数 url2 に教員のサーバの URLを設定している.

$ vi sensor.sh

  ...(略)...
  url1=iot-YY.epi.it.matsue-ct.jp/~herohero/php/monitoring.php  #代表者のサーバ (YY, herohero は適宜変更のこと)
  url2=iot-50.epi.it.matsue-ct.jp/~hogehoge/php/monitoring.php  #教員のサーバ (修正の必要はない)
  ...(略)...
  do
    sec=`date +"%S"`
    if [ $sec = "00" ] ; then
      ...(略)...
      curl -u user:passwd "https://$url?hostname=$hostname&time=$time&temp=$temp&humi=$humi&lux=$lux"  # 自分のサーバに送る
      curl -u user1:passwd1 "https://$url1?hostname=$hostname&time=$time&temp=$temp&humi=$humi&lux=$lux"  # 代表者のサーバに送る
      curl -u herohero:hogehero "https://$url2?hostname=$hostname&time=$time&temp=$temp&humi=$humi&lux=$lux" #教員のサーバに送る. 教員のサーバはパスワードをかけていない.
    fi
    ...(略)...
  done

設定が終わったらラズパイを再起動し, 以下の 2 点を確認する.

  1. ラズパイで ps aux コマンドを用いて sensor.sh が実行されていることを確認する
  2. 代表者の VM のデータベースに観測値が追加されていることを確認する.

較正の具体的なやりかた

全員のセンサーを隣接させ, ほぼ同じ場所の温度・湿度の計測を行う. センサーがある付近の空気をよくかき混ぜるために, 団扇や下敷きなどで風を送ると良い.

もし, ケーブルが短くてセンサー同士を隣接させづらい場合は, 1 m の長いケーブルを使うと良い. 但し, センサーによっては長いケーブルを使う場合には値が取れないことがあるのに注意せよ (i2c はノイズに弱いため). その場合は長いケーブルを使う人を交代するなど, 臨機応変にうまく対応して欲しい.

また, 時間的な余裕があれば, センサーをドライヤーで温めたり, センサーを保冷剤に近づけてみること (決してセンサーを保冷剤に触れさせないこと. 水に濡れると壊れる).

時系列プロット

grafana でチーム全員のデータを時系列プロットし, その値が大きくずれていないことを確認する.

得られた結果から, センサー間の誤差がどの程度か把握すること. また, もし値の大きく外れるセンサーがあれば教員に報告すること.

散布図

較正を行う際は時系列プロットで比べるよりも, 散布図を作る方が一般的である. 代表者の Si7021 センサーを基準として, 横軸を基準センサーの値, 縦軸を基準センサーからのずれとする. 較正に使う物理量は温度と湿度とする. なお, センサーごとに散布図に打つ点の色を変えること (3 人組みの場合, 2 色の点が打たれることになる).

grafana では散布図は作れないため, grafana から各人のデータを csv ファイルに出力し, それを Windows 上のエクセル (もしくは Linux 上の gnuplot) で散布図にせよ. 具体的なやり方については WBT 上のエクセルファイルを参照されたい.

csv の出力方法: grafana を使う場合

grafana でグラフのタイトル部分を右クリックし, Inspect > Data > Download CSV の順で選択すると csv ファイルを出力することができる. ダウンロードした CSV ファイルを用いて散布図を作成すると良い.

  • Data Option の選択肢はデフォルトで良い
    • Formatted data : ON
    • Download for Excel : OFF

[参考] csv の出力方法 : データベース (MySQL) からテーブルの値を CSV 出力

mysqldump コマンドを使って csv ファイルを出力することができる. このコマンドは mysql ユーザ権限でファイルを作成するので, /tmp などの全ユーザに書き込み権限があるディレクトリに出力する必要がある. --tab オプションで出力先のディレクトリを指定する.

$ mysqldump -u hogehoge -p --tab=/tmp --fields-terminated-by=, iotex monitoring

上記の例では, /tmp/monitoring.txt というファイルが作成される. mysqldump ではテーブルの全データをダンプするので, テーブルのデータの一部のみを csv ファイルに保存する用途には向かない.

Excel での操作時の注意事項

  • ダウンロードした csv ファイルを Excel で開くが,csv 形式のままではグラフなどが保存できない.まず最初に,「名前を付けて保存」を選択して,Excel ブック形式で保存しなおすこと.
  • データ欠損のある時刻のデータは削除する.

課題

上記の「時系列プロット」で作成したダッシュボードのスナップショット, 「散布図」で作成した散布図, さらにはそれらの図から言えることを文書にまとめて wbt にて提出せよ. チームメンバー全員同じ図を提出するので構わない (代表者のみ提出する形にしないこと).