酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phoneでコンパスセンサー(地磁気センサー)を使って方角を取得する

概要

コンパスセンサーはデバイスの向きを検出するセンサーデバイスです。

名前空間:Microsoft.Devices.Sensors

System.Object
 +--Microsoft.Devices.Sensors.SensorBase<CompassReading>
  +--Microsoft.Devices.Sensors.Compass

Tips

コンパスセンサー(地磁気センサー)で方角を取得する

コンパスセンサーはデバイスの向きを検出するセンサーデバイスです。電子コンパスとも呼ばれたりもします。

CurrentValueChangedイベントでは、検出された磁界についての情報がCompassReadingオブジェクトで通知されます。

Windows Phone OS 7.0時代に発売された端末は、基本的にコンパスセンサーが搭載されておりません。実際に方角を取得する前にCompass.IsSupportedメソッドでコンパスセンサーがサポートされている(搭載されている)端末であるかどうかを判定します。

Compass compass;

private void btnCompass_Click(object sender, RoutedEventArgs e) {

    // 実行する端末でコンパスセンサーが利用可能か調べる
    if (!Microsoft.Devices.Sensors.Compass.IsSupported) {
        throw new NotSupportedException("Not Supported device");
    }

    // センサーのオブジェクト生成
    compass = new Compass();
    // センサーの値を更新の間隔を100ミリ秒に設定
    compass.TimeBetweenUpdates = TimeSpan.FromMilliseconds(100);
    // CurrentValueChangedイベントのハンドラを設定
    compass.CurrentValueChanged += compass_CurrentValueChanged;
    // コンパスセンサーのデータ取得を開始
    compass.Start();
}

コンパスセンサーの向きを取得する

日本では大体5~10度のズレがあることを前提に、HeadingAccuracyプロパティで取得した地理的な北と地磁気北との誤差が15度以上の場合は、センサーから取得してきた値を採用しないようにガードを入れています。

デバイスの周りに磁石や金属があるとセンサーが干渉してしまい、正確な値を取得出来なくなってしまうようなので注意が必要です(端末を8の字を振らせるようにユーザーに注意を施しても良いかもしれません)。

コンパスセンサーは、北極点の方向を地理的な北(真北)と方位磁石が指す北(磁北)を取得することが出来ます。

CurrentValueChangedイベントのハンドラには、引数としてSensorReadingEventArgsオブジェクトが渡され、TrueHeadingプロパ ティで前者の地理的な北に対する相対的な向きを、MagneticHeadingプロパティで後者の地磁気北に対する相対的な向きを度単位で取得することが出来ます。

MagnetometerReadingプロパティでXYZ軸の磁束密度をマイクロテスラ単位で取得する事が出来ます。

void compass_CurrentValueChanged(object sender, 
        SensorReadingEventArgs<CompassReading> e) {

    // UI要素を変更したいのでUIスレッド上で実行させる
    Deployment.Current.Dispatcher.BeginInvoke(() => {

        // 地磁気北からの時計回りの方位を取得する
        var v = e.SensorReading.MagneticHeading;

        labelMagneticHeading.Text = string.Format("{0:0.0000}", v);
    });
}

参照