うさがにっき

読書感想文とプログラムのこと書いてきます

センサーから得られた値を整地して使う

概要

コンパスを作っていたら、センサーから取得した値は変動が大きくそのまま使うと振れ幅が大きく使えるものではなかった
センサーから得られた値をうまく整地する方法を考えてみた

詳細

コンパスを作る際には加速度センサーと地磁気センサーを使って実現する
実際の実装はここらへんを参考にさせて頂いた
[Android 開発] 端末の傾きと方位角を求める - Open MagicVox.net

だが、得られた角度は最大100degreesぐらいずれたものも取得されたりするので、そのまま使ったらコンパスとして使い物にならない、針がグルングルンに回る

平均値をとってみる

センサーから取得された値の平均値で整地してみた
・・・が、異常値がたまに取得されてるらしく少し落ち着いたもののまだまだぐるぐるまわる

中央値をとってみる

異常値が邪魔なので中央値で整地してみた
5回の中央値をとってコンパスのデータとして使ってみた
異常値が排除されていい感じになった

具体的には

            // 方位を取得する
            int orientDegrees = toOrientationDegrees(orientationValues[0]);

            orientDegreesList.add(orientDegrees);

            if(orientDegreesList.size() < 5) {
                return;
            }

            // 中央値取得
            Collections.sort(orientDegreesList);
            orientDegrees = orientDegreesList.get(orientDegreesList.size() / 2);

というわけでセンサー系から取得される値は異常値がきたりするので、中央値を使うのが良い