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 点を確認する.
- ラズパイで ps aux コマンドを用いて sensor.sh が実行されていることを確認する
- 代表者の VM のデータベースに観測値が追加されていることを確認する.
較正の具体的なやりかた
全員のセンサーを隣接させ, ほぼ同じ場所の温度・湿度の計測を行う. センサーがある付近の空気をよくかき混ぜるために, 団扇や下敷きなどで風を送ると良い.
もし, ケーブルが短くてセンサー同士を隣接させづらい場合は, 1 m の長いケーブルを使うと良い. 但し, センサーによっては長いケーブルを使う場合には値が取れないことがあるのに注意せよ (i2c はノイズに弱いため). その場合は長いケーブルを使う人を交代するなど, 臨機応変にうまく対応して欲しい.
また, 時間的な余裕があれば, センサーをドライヤーで温めたり, センサーを保冷剤に近づけてみること (決してセンサーを保冷剤に触れさせないこと. 水に濡れると壊れる).
![](./images/compare-00.png)
時系列プロット
grafana でチーム全員のデータを時系列プロットし, その値が大きくずれていないことを確認する.
得られた結果から, センサー間の誤差がどの程度か把握すること. また, もし値の大きく外れるセンサーがあれば教員に報告すること.
![](./images/compare-01.png)
散布図
較正を行う際は時系列プロットで比べるよりも, 散布図を作る方が一般的である. 代表者の Si7021 センサーを基準として, 横軸を基準センサーの値, 縦軸を基準センサーからのずれとする. 較正に使う物理量は温度と湿度とする. なお, センサーごとに散布図に打つ点の色を変えること (3 人組みの場合, 2 色の点が打たれることになる).
grafana では散布図は作れないため, grafana から各人のデータを csv ファイルに出力し, それを Windows 上のエクセル (もしくは Linux 上の gnuplot) で散布図にせよ. 具体的なやり方については WBT 上のエクセルファイルを参照されたい.
![](./images/compare-03.png)
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 にて提出せよ. チームメンバー全員同じ図を提出するので構わない (代表者のみ提出する形にしないこと).