酢ろぐ!

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

Windows Phoneでジャイロスコープセンサーで角速度を取得する

概要

ジャイロスコープは、デバイスの各軸周りの回転速度を取得出来るセンサーデバイスです。

名前空間:Microsoft.Devices.Sensors

System.Object
 +--Microsoft.Devices.Sensors.SensorBase<GyroscopeReading>
  +--Microsoft.Devices.Sensors.Gyroscope

Tips

ジャイロスコープセンサーで角速度を取得する

ジャイロスコープが搭載されているデバイスかどうかを予め調べます。

Gyroscope.IsSupportedメソッドでジャイロスコープがサポートされているデバイスかどうかを判定する事が可能です。

Gyroscope gyro;

private void btnGyroscope_Click(object sender, RoutedEventArgs e) {
    // 実行する端末でジャイロスコープが利用可能か調べる
    if (!Gyroscope.IsSupported) {
        throw new NotSupportedException("Not Supported device");
        return;
    }

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

ジャイロスコープの角速度を取得する

データの取得が開始されると、gyro_CurrentValueChangedメソッドに角速度の値が通知されます。

void gyro_CurrentValueChanged(object sender, 
    SensorReadingEventArgs<GyroscopeReading> e) {

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

        // ジャイロスコープの値を表示する
        var v = e.SensorReading.RotationRate;

        labelX.Text = string.Format("{0:0.0000}", v.X);
        labelY.Text = string.Format("{0:0.0000}", v.Y);
        labelZ.Text = string.Format("{0:0.0000}", v.Z);
    });
}

参照