AR系アプリ作成に必要な要素 その4

前回の続き。

  1. カメラプレビューへのオーバレイ表示
  2. 端末の向いている方角/姿勢の取得
  3. 端末の現在地(緯度/経度)の取得
  4. カメラの画角情報取得
  5. 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
「屋外のような外乱影響の少ないところでは、地磁気方向(北)を正確に測定できると思いますが、ビルなどの屋内では鉄筋の影響を受けて磁場が歪んでいるので、正確な地磁気方向を測定することは難しいと思います。」