おはよう君需要なし

求不得苦な日々

【Visual Studio】スマホの向きを検出しようとしたらつまづいた【Xamarin】

Androidバーチャルリアリティ的な、もっといえばオキュラスリフト的なアプリケーションを作ろうとしたときに、 絶対に必要になってくるのがスマートフォンの姿勢だと思います。

傾きを知ろう!

Xamarinでは以下のステップで各センサの値が取れるらしいです。

www.buildinsider.net

www.buildinsider.net

というわけで、スマートフォンの姿勢を知るために色々とリサーチした結果をこの場でちょこっと書きたいと思います。

  • 加速度センサは重力方向がわかる!
  • ジャイロは各軸周りの角速度がわかる!

はい。高校生でもわかりそうなことを書いてみました。一見、こんだけわかればもう姿勢なんて簡単にわかるじゃ~んと思われるかもしれませんが、 そうでもないみたいです。

加速度センサの欠点

加速度センサは重力方向がわかると書きましたが、それだけでは姿勢は求まりません。というのも、 スマホを立てて考えてもらえばわかるんですが、重力方向を回転軸にする運動は、このセンサでは検知できません。 (向心力がありますが、難しすぎる)

あと、当然ながら人間が加速度を与えた場合(平行移動させた場合)、当然ながら重力方向以外の加速度まで拾ってしまいます。

ジャイロスコープの欠点

扱いが難しい。ある程度3次元空間での運動に関しての知識があればいいのですが、私はそういったものが大の苦手です。

まず、角速度の積分値は意味を成しません。たとえば、スマホがx軸方向に90°回転している状態においてスマホがy軸周りに回転したとします。 そのとき出てくるy軸周りの角速度というのは、ワールド座標系においてはz軸方向の回転なのです。

つまり、姿勢を考慮したうえで角速度を積分しなければいけないわけですが、これは現在のR行列に左から角速度分の回転行列をかけてあげることと 結果的に近い値が出るので、今回はその値を使ってみることにしました。

結果、ジャイロスコープのバイアスによって常に動き続ける(机の上に置いておいても姿勢が変化し続ける)ことになってしまいました。

センサーフュージョンだ!

というわけで、スマートフォンには複数のセンサがついているので、それらを組み合わせてよりよい姿勢の「推定」を行おうと日々研究を行っている人々がいます。

結論

GoogleのCardBoardのSDK使おう。私のアプリケーションはこれでだいぶ改善しました(笑)

Cardboard の概要  |  Cardboard  |  Google Developers

非公式ですが、C#用のパッケージがXamarinから配布されていて、もちろんVisual Studioでの開発にも用いることができます。