WPDT7.1 Tool Betaのセンサー紹介


6月8日にWindows Phone Developer Dayにお越しいただいた皆様、ありがとうございました。お蔭様で楽しく盛り上がったイベントになりました。

私は会場のある場所に篭って、Ustの投稿とTwitterの#wpdevdayが付いたツイートと睨めっこしながら、イベント会場の様子を見て、@embedded_georgeのアカウントで呟きまくっていました。沢山のポジティブな投稿をありがとうございました。
ご存知の通りWindows Phone Developer Tool 7.1のベータは既に公開され、皆さんがお使いいただける状態になっています。どんどん使ってみてください。
折角なので、4/15のDeep Diveで私のセッションで説明したセンサー周りがどう変わったか紹介しますね。

センサーは、Microsoft.Devices.Sensors名前空間に、

  • Accelerometer : 加速度センサー
  • Gyroscope : ジャイロセンサー(お~男のロマン)
  • Compass : コンパスセンサー
  • Motion : モーションセンサー

の4つのクラスが定義されています。超残念ながら、ベータ版ではAccelerometerしかサポートされていません。これら4つのクラスはほぼ同じ形式のプロパティとイベントが用意されています。ざっと目ぼしいものをあげると

  • TimeBetweenUpdates
  • CurrentValue
  • CurrentValueChanged

最初のプロパティは、非同期で計測データを取得する際の時間間隔です。二番目は、同期的に計測データを取得するプロパティです。プロパティのデータ型は、センサーの名前の後ろにReadingをつけたもの(例えばMotionならMotionReading)です。そして最後は、計測値が変わった事の通知を受ける為のイベントで、以前はReadingChangeという名前だったものです。残っているのはStateプロパティぐらいなもので、もう名前も何も以前とは変わってしまい、全くの別人って感じですね。

センサーの使い方は超簡単です。先ずは、プロジェクトにMicrosoft.Devices.SensorsとMicrosoft.Xna.Frameworkアッセンブリーへの参照を加えて準備完了です。コードは、

var myAccelerometer = new Accelerometer();
myAccelerometer.TimeBetweenUpdates = TimeSpan.FromMilliSeconds(50);
myAccelerometer.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<AccelerometerReading>>(myAccelerometer_CurrentValueChanged);
myAccelerometer.Start();

と書けば、50msec毎に加速度センサーの値が計測され、変更があればイベントに登録したメソッドがコールされます。新たに追加されたTimeBetweenUpdatesで、計測間隔を指定することにより、無駄にガンガンCPUを使うことが無くなりました。(ちなみに、前のバージョンで実機で動かしっぱなしにしたら、電池の消耗の早いこと)
このプロパティを設定しておかないと、Start()メソッドコールに失敗するので、必ず設定してください。

そして、イベント受信メソッドは、

void myAccelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
    Dispatcher.BeginInvoke(() => ValueChanged(e.SensorReading));
}

と、センサー計測値を通知してくるスレッドがUIスレッドとは違うので、Dispatcherに処理をお願いします。ちなみに、ジャイロやモーション、コンパスの変更通知イベントの変数も全てSensorReadingプロパティを持っています(型は当然それぞれの型ですが)。

void ValueChanged(AccelerometerReading readingValue)
{
    var values = readingValue.Acceleration;
    textBoxAclX.Text = values.X;
    ...
}

と、こんな感じです。アッセンブリー追加のところで、「あれ?何でXNA?」と思った方、鋭いですねぇ。実はAccelerometerReading型の引数Accelerationは、XNAフレームワークのVector3型を使っているんです。なので、加速度を取り出すときには、以下の2つのusing宣言をしておいてくださいね。

using Microsoft.Devices.Sensors;
using Microsoft.Xna.Framework;

現状のバージョンでは使えないですが、参考までにジャイロ、コンパス、モーションで計測できるデータを紹介しておきますね。

ジャイロ:

  • RotationRate : 3軸回転角速度。こちらもXnaのVector3型

コンパス:

  • HeadingAccuracy : 誤差(だと思う)。double
  • MagneticHeading : 地磁気の北極からの角度。double
  • MagnetometerReading : 3軸の地磁気の強さ。型はVector3。これで正確に地球の磁気の北極に対するデバイスの角度が解る。お~本格的ぃ。
  • TrueHeading : 真の北極からの角度。double。地球の回転軸としての北極の位置と地磁気の北極の位置は違いますからねぇ。

モーション:

  • Attitude : デバイスの角度・姿勢(だとおもう)。Pitch、Yaw、Rollというfloat型の3つのプロパティを持っている。順にX軸、Y軸、Z軸を回転軸とする回転の角度。(たぶん)単位はラジアン。
  • DeviceAcceleration : Accelerationという名前のプロパティを持つ。AccelerometerのAccelerationと同じ(だと思う、たぶん)
    ほかに、RotationMatrix、QuartanionというMatrix型と、Quartanion型のプロパティを持っている。うん、本格的。
  • DeviceRotation : RotationRateという名前のプロパティを持つ。ジャイロのRotationRateと同じ(たぶん)

加速度センサー、ジャイロ、コンパスは、XXXReadingのプロパティとしてTimestampがあって、その値をいつ計測したかがわかるようになっています。モーションは、Attitude、DeviceAcceleration、DeviceRotationそれぞれにTimestampが用意される構成になっています。加速度と角加速度を知りたければモーションを使えば良いし、たとえば3Dモデルを動かす時も、RotationMatrixやQuartanionが用意されているので、こちらの方が使いやすいでしょう。
それから、XnaとSilverlightの融合という話もありますが、クラスの定義にもバンバンXnaの定義を使っていて、ここでも融合ぅって感じです。(でもWin7のSensorをManaged化する時はそれで良いのか?という気もする)

ざっと書いてきましたが、ジャイロ、コンパス、モーションの3センサー、う~ん待ちどおしいですねぇ。

最後にエミュレータをちら見せ。(WPDT7.1をインストールすれば皆さんもお試しできますけどねw)

Comments (0)

Skip to main content