AR系アプリ作成に必要な要素 その4
前回の続き。
- カメラプレビューへのオーバレイ表示
- 端末の向いている方角/姿勢の取得
- 端末の現在地(緯度/経度)の取得
- カメラの画角情報取得
- 2-4の情報から表示情報を計算
とりあえず上記の1-5までが実装出来ましたが、加速度センサがノイズだらけでターゲットが激しく動き回ってしまいました。ノイズの除去が必要なようです。
加速度センサ/地磁気センサのノイズ除去
まず、移動平均を取ってみましたが、スパイクノイズに引っ張られてしまいイマイチ。
そこで、スパイクノイズに強いメディアンフィルタをかけてみました。過去3サンプルと5サンプルで比較して安定した5サンプルを採用。
それでも、小刻みな振動が気になったので、メディアンフィルタの出力に対して、ローパスフィルタをかけました。
これでそれなりに安定しました。
磁場の補正
加速度センサのノイズが安定したところで、対象物を正しく補足できているか確認したところ、常に数度のずれが発生。
その1で書いた、磁気偏角の補正はやはり必要なようです。GeomagneticFieldクラスを使います。
http://developer.android.com/reference/android/hardware/GeomagneticField.html
地磁気センサの出力は、getRotationMatrix()に食わせて回転行列にしてしまったので、world's coordinate system のZ軸周りの回転には不向き。
そこで、対象物をworld's coordinate system で表した座標系のほうをZ軸周りに回転させて補正することにしました。
これで、磁気偏角の補正も完了し、対象物を補足できるようになりました。
しかし、それは屋外の条件のみ。鉄筋の建物の内部では、地磁気が乱れるため正しい方角が得られないようです。これは原理的にどうしようもなさそう。
https://groups.google.com/forum/#!topic/android-group-japan/69LPDTJTWzA
「屋外のような外乱影響の少ないところでは、地磁気方向(北)を正確に測定できると思いますが、ビルなどの屋内では鉄筋の影響を受けて磁場が歪んでいるので、正確な地磁気方向を測定することは難しいと思います。」