ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

Windows 8,Windows Phone 8でアプリからセンサーを使ってみる

スレート型のWindows 8端末やWindows Phone 8端末にはさまざまなセンサーがついています。ここでは、センサーを扱ってみます。

一式のコードはこちらにあります。

Windows 8のセンサー

センサーを扱うためのクラスはWindows.Devices.Sensors名前空間に定義されており、次のセンサーが利用できます。

  • LightSensor:光センサー(明るさを取得する)
  • Accelerometer:加速度センサー(デバイスの向きを取得する)
  • Gyrometer:ジャイロセンサー
  • Inclinometer:傾斜センサー(デバイスの傾きを取得する)
  • OrientationSensor:デバイスの向きを回転行列と四元数で取得する
  • SimpleOrientationSensor:デバイスの向きを取得する
  • Compass:方角を取得する

Windows Phone 8のセンサー

Windows Phone 8ではWindows 8で利用可能ないくつかのセンサーは内容です。

  • Accelerometer:加速度センサー(デバイスの向きを取得する)
  • Gyrometer:ジャイロセンサー
  • Inclinometer:傾斜センサー(デバイスの傾きを取得する)
  • OrientationSensor:デバイスの向きを回転行列と四元数で取得する
  • Compass:方角を取得する

センサーを利用する

実際にセンサーを利用してみます。センサーはほぼ同じ使い方になっており、次の2つです。

  1. センサークラス.GetDefault() でインスタンスを取得する
  2. 値が変更された時の通知ハンドラを登録する

あとは値が変更されるごとに登録したハンドラが呼ばれます。注意点として、GetDefault()で取得したインスタンスは保持する必要があること、呼ばれるハンドラは別スレッドなのでUIを操作する場合はスレッドを戻す必要があります。

Windows 8では次のように取得します。センサーがない場合はnullが返ります。

// ジャイロメーター

gyrometer = Gyrometer.GetDefault();

if ( gyrometer != null ) {

gyrometer.ReadingChanged += MainPage_ReadingChanged;

}

else {

TextGyrometer.Text = @"ジャイロメーターはありません";

}

Windows Phone 8では、センサーがない場合は例外が発生します。手持ちのLumia 630はジャイロセンサーがないので、例外が発生しました。

// ジャイロメーター

try {

gyrometer = Gyrometer.GetDefault();

if ( gyrometer != null ) {

gyrometer.ReadingChanged += MainPage_ReadingChanged;

}

}

catch ( Exception ) {

TextGyrometer.Text = @"ジャイロメーターはありません";

}

続いて値が変更されたときに呼ばれるハンドラです。args.Reading にセンサーの値が入っているので、それを使います。Windows Phone 8では スレッドの切り替えが Dispatcher.BeginInvoke( new Action( ... ) ); になります。

async void MainPage_ReadingChanged( Gyrometer sender, GyrometerReadingChangedEventArgs args )

{

await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () =>

{

TextGyrometer.Text = string.Format( @"Gyrometer : X={0} Y={1} Z={2}",

args.Reading.AngularVelocityX.ToString(),

args.Reading.AngularVelocityY.ToString(),

args.Reading.AngularVelocityZ.ToString() );

} );

}