はじめに
6月8日に、

MIX11では、

日本のチームが主力になって開発が進んでいるIMEの

今回のイベントで一番大きな出来事としては、

「キャリアとの調整」
Windows Phone OS 7.0でのセンサーのサポート
Windows Phone OS 7.
- 加速度センサー
- 環境光センサー
- 接近センサー
(端末間の差別化をしにくくなるというのはありますが)
例えば、
開発者からの視点で考えた場合には、
“Mango”アップデートにてサポートされるセンサー
“Mango”
- コンパスセンサー
(地磁気センサー) - ジャイロスコープ
- モーションセンサー
Windows Phone OS 7. 後ほど詳細な解説を書かせて頂きますが、 これはモーションセンサーを使う場合のコードですが、 次にそれぞれのセンサーの使い方についてご紹介いたします。 コンパスセンサーはデバイスの向きを検出するセンサーデバイスです。CurrentValueChangedイベントでは、
CurrentValue センサーの現在値を取得 CurrentValueChanged 値が変わった時に通知されるイベント TimeBetweenUpdates 値の更新間隔の設定/取得 Start センサーから値を取得開始 Stop センサーから値を取得終了 var motion = new Microsoft.Devices.Sensors.Motion();
motion.TimeBetweenUpdates= TimeSpan.FromMilliseconds(20);
motion.CurrentValueChanged+= motion_CurrentValueChanged;
motion.Start();
コンパス
HeadingAccuracy 精度。コンパスの測定値に対する正確さの取得 MagneticHeading デバイスの向き。磁北から時計回りの向きを取得 TrueHeading デバイスの向き。地球の地理的な北から時計回りでの向きを取得 MagnetometerReading XYZ軸の磁束密度の取得 Timestamp センサーから読み取りが行われた時刻を取得 コンパスセンサーのデータ取得を開始する
コンパスセンサーが搭載されているデバイスかどうかをあらかじめ調べます。Compass.IsSupportedメソッドでコンパスセンサーがサポートされているデバイスかどうかを判定することが可能です。
private void Button_Click(object sender, RoutedEventArgs e)
{
// 実行する端末でコンパスセンサーが利用可能か調べる
if (!Microsoft.Devices.Sensors.Compass.IsSupported)
{
txtResult.Text = "Not Supported";
return;
}
// センサーのオブジェクト生成
compass = new Compass();
// センサーの値を更新の間隔を100ミリ秒に設定
compass.TimeBetweenUpdates = TimeSpan.FromMilliseconds(100);
// CurrentValueChangedイベントのハンドラを設定
compass.CurrentValueChanged += compass_CurrentValueChanged;
// コンパスセンサーのデータ取得を開始
compass.Start();
}
コンパスセンサーの向きを取得する
日本では大体5~10度のズレがあることを前提に、
コンパスセンサーは、
MagnetometerReadingプロパティでXYZ軸の磁束密度をマイクロテスラ単位で取得することができます。
void compass_CurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e)
{
// 地理的な北と地磁気北との誤差が15度以上であれば処理しない
if (e.SensorReading.HeadingAccuracy > 15)
{
return;
}
this.Dispatcher.BeginInvoke(() =>
{
// 地理的な北に対する向き(単位:度)
var trueHeading = e.SensorReading.TrueHeading;
// 地磁気北に対する向き(単位:度)
var magneticHeading = e.SensorReading.MagneticHeading;
// XYZ軸の磁束密度(単位:マイクロテスラ)
var magnetometerX = e.SensorReading.MagnetometerReading.X;
var magnetometerY = e.SensorReading.MagnetometerReading.Y;
var magnetometerZ = e.SensorReading.MagnetometerReading.Z;
// コンパスセンサーの値を表示する
txtResult.Text = string.Format("TrueHeading:{0:0.000}", trueHeading);
txtResult.Text += string.Format("MagneticHeading:{0:0.000}", magneticHeading);
txtResult.Text += string.Format("MagnetometerReading x:{0:0.000} y:{1:0.000} z:{2:0.000}",
magnetometerX, magnetometerY, magnetometerZ);
});
}
ジャイロスコープ
ジャイロスコープは、
RotationRate | 角速度。デバイスの各軸周りの回転速度の取得 |
Timestamp | センサーから読み取りが行われた時刻を取得 |
ジャイロスコープのデータ取得開始
ジャイロスコープが搭載されているデバイスかどうかをあらかじめ調べます。Gyroscope.IsSupportedメソッドでジャイロスコープがサポートされているデバイスかどうかを判定することが可能です。private void Button_Click(object sender, RoutedEventArgs e)
{
// 実行する端末でジャイロスコープが利用可能か調べる
if (!Microsoft.Devices.Sensors.Gyroscope.IsSupported)
{
txtResult.Text = "Not Supported";
return;
}
// センサーのオブジェクト生成
gyro = new Gyroscope();
// センサーの値を更新の間隔を100ミリ秒に設定
gyro.TimeBetweenUpdates = TimeSpan.FromMilliseconds(100);
// CurrentValueChangedイベントのハンドラを設定
gyro.CurrentValueChanged += gyro_CurrentValueChanged;
// ジャイロスコープのデータ取得を開始
gyro.Start();
}
ジャイロスコープの角速度を取得する
void gyro_CurrentValueChanged(object sender, SensorReadingEventArgs<GyroscopeReading> e)
{
// センサーの値を表示させたいのでUIスレッドで実行
Dispatcher.BeginInvoke(() =>
{
// ジャイロスコープの値を表示する
var rotX = e.SensorReading.RotationRate.X;
var rotY = e.SensorReading.RotationRate.Y;
var rotZ = e.SensorReading.RotationRate.Z;
txtResult.Text = string.Format("x:{0:0.000} y:{1:0.000} z:{2:0.000}",
rotX, rotY, rotZ);
});
}
モーションセンサー
“Mango”
これらの個別のセンサーからの生データを取得することは前記の通り簡単ですが、
例えば、
CurrentValueChangedイベントで、
Attitude | ラジアンでのデバイスの姿勢 |
DeviceAcceleration | デバイスの直線加速の取得 |
DeviceRotation | デバイスの回転加速度の取得 |
Gravity | MotionReadingに関連付けられている重力ベクトルの取得 |
Timestamp | センサーから読み取りが行われた時刻を取得 |
端末がモーションセンサーに対応しているか調べる
モーションセンサーが搭載されているデバイスかどうかをあらかじめ調べます。Gyroscope.
private void Button_Click(object sender, RoutedEventArgs e)
{
// 実行する端末でモーションセンサーが利用可能か調べる
if (!Microsoft.Devices.Sensors.Motion.IsSupported)
{
txtResult.Text = "Not Supported";
return;
}
// センサーのオブジェクト生成
motion = new Motion();
// センサーの値を更新の間隔を100ミリ秒に設定
motion.TimeBetweenUpdates = TimeSpan.FromMilliseconds(100);
// CurrentValueChangedイベントのハンドラを設定
motion.CurrentValueChanged += motion_CurrentValueChanged;
// モーションセンサーのデータ取得を開始
motion.Start();
}
モーションセンサーの各種値を取得する
Motionクラスは、
定型的にセンサーの測定値を利用するのであればMotionクラスで十分かと思いますが、
void motion_CurrentValueChanged(object sender, SensorReadingEventArgs<MotionReading> e)
{
// センサーの値を表示させたいのでUIスレッドで実行
Dispatcher.BeginInvoke(() =>
{
// デバイスの角速度の値を表示する
var rotX = e.SensorReading.DeviceRotation.RotationRate.X;
var rotY = e.SensorReading.DeviceRotation.RotationRate.Y;
var rotZ = e.SensorReading.DeviceRotation.RotationRate.Z;
// デバイスの加速度の値を表示する
var accX = e.SensorReading.DeviceAcceleration.Acceleration.X;
var accY = e.SensorReading.DeviceAcceleration.Acceleration.Y;
var accZ = e.SensorReading.DeviceAcceleration.Acceleration.Z;
txtResult.Text = string.Format("RotationRate x:{0:0.000} y:{1:0.000} z:{2:0.000}",
rotX, rotY, rotZ);
txtResult.Text += string.Format("Acceleration x:{0:0.000} y:{1:0.000} z:{2:0.000}",
accX, accY, accZ);
});
}
さいごに
今回ご紹介したセンサーAPIは、
Emulatorに付いているAdditional Toolsの実装はまだ完全と言える状態ではありませんので、
以上で今回は終わりです。ありがとうございました。