2017年2月22日水曜日

超音波流速計 優先順位の付け方を考える

 とりあえずPCの中でいろいろ試しています。実行時間は気にしないので、位相の動きは10フェーズ分を計算しています。実際の動作環境ではせいぜい8フェーズ程度ですが、まぁリソースに余裕あるし、人間的にキリがいいし。
 真面目に位相から気温と風速を計算すると10x10で100個の候補が出てくるので、さすがに何とかする必要があります。とりあえず明らかに計測レンジの外、例えば気温が+200℃だとか、風速が70m/sだとか、そういうのをある程度の閾値で止めます。今回は±55℃、±35m/sを閾値としました。サンプルデータは±50℃、±30m/sの範囲なのですが、計算誤差だったり丸めだったりで微妙にこの範囲を超える値があるので、大きめに閾値を設定しています。
 閾値で切った後でも、それなりの候補が残るので、とりあえずサーミスタの温度からn℃以内というフィルタを通すことにより、候補を5個程度まで絞り込みます。今回は5℃以内で切りました。

 で、そこからさらに信頼度を比較する必要があるのですが、色々比較方法を試した結果、以下のようになりました。
サンプルデータは前回のエントリの最後に貼ってありますが、ほぼ完璧というレベルで一致しています。「誤差の範囲で一致」というヤツですね。

 ちなみに、上のグラフは信頼度が一番高い値ですが、その下2個を含めると、以下のようになります。
温度も含めるとわけわからんことになるので風速だけですが。

 で、問題の「どういう比較をして値の順位を付けるか」ですが、「前回の風速と近い順にソートする」としています。前々回のエントリで「直前値は使えない」とか書いておきながらこのザマです。いやー、クローズドループって楽(おい。

 今回のテストデータは気温が1℃毎秒、風速が3m/s毎秒で変化するように作ってあります。しかし、実環境では温度が急激に変化する可能性は低いとは言え、風速が急激に変化するということは充分にありえます。
 特に位相位置をクローズドで回すと、一旦間違った値に飛んでしまった場合、正常な値に復帰するのが困難です。これは起動時の初期化にも言え、初期値を誤って判断した場合、偶然正しい位置へ飛べない限りは常に異常値を計測し続けることになります。

 ということで前回値を使わない、オープンループで現在の値を計算できる方法を探す必要があるわけですが、サクッと試した感じでは結構難しそうです。
 生データからは100個の候補が得られ、計測レンジとサーミスタの値で絞り込むと候補は5個程度まで減らせますが、そこからさらに絞り込む方法がありません。
 しかし、これが3軸のセンサを使えるとなると、候補は全体で300個となりますが、レンジで絞り込んで15個、そしてそれぞれの温度はすべて同じ値になるはずですから、温度でランキングすればさらに絞りこめるはずです。
 ということで、軸数を増やせばなんとかなるんじゃないかな、と甘い考えが有るわけです。
 じゃぁとっとと3軸のデータ作って試せよ、という話になるわけですが、単純に出力が3倍になるだけじゃなくて、入力の風速も3方向になったりとか、センサの設置向きを三角関数で計算して…とかとても面倒になります。
 そもそもノイズのない綺麗なデータで動いていても実環境で動くのか、という問題が出てきます。やっぱ風洞とかで試したいなぁ。

0 件のコメント:

コメントを投稿