本サイトからスピンオフした姉妹サイトです。Plugin」プラグインを紹介。今回は、Magnetometer(磁気)センサー、Compass(コンパス)の機能を使う方法を説明する。Plugin」で使えるセンサー機能のうち、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサーを紹介した。今回は引き続きMagnetometer(磁気)センサー、Compass(コンパス)を紹介する。Studioの最新版を使用している。8.1の6つのプロジェクトが作成されるが、本連載ではAndroid/iOS/UWPでのスクリーンショットを使用している。最新版にアップデートしてUWPアプリの作成も試してもらいたい。Studioの場合は[ソリューション]ビューの各プロジェクト項目からNuGetパッケージを追加できる)。Motionを全てのプロジェクトに対して[インストール]する。Pluginの概要だ。CrossDeviceMotionクラス(DeviceMotion.Plugin名前空間)のCurrentプロパティを使用して、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサー、Magnetometer(磁気)センサー、Compass(コンパス)にアクセスできる。センサーの種類を表すMotionSensorType列挙体にAccelerometer、Gyroscope、Magnetometer、Compassが含まれており、センサーの応答間隔を表すMotionSensorDelay列挙体には以下が含まれている。200戻り値の型であるMotionSensorValueType列挙体はSingleとVectorがあり、Accelerometer、Gyroscope、MagnetometerがVector値を、CompassがSingle値を返す。APIの詳細はGitHubのReadme(英語)を参照してほしい。今回は「Magnetometer」と「Compass」を紹介する。端末に組み込まれた磁気センサーに磁石が近づいた際に大きく反応するセンサーだ(もちろん地磁気にも反応する)。2は右中央に磁気センサーの存在が確認できた。5とSH-01Fは左上に、GL07Sは中央上にセンサーを確認できた。MagnetometerセンサーもAccelerometerと同様に、次のコードでX/Y/Z軸方向の磁力を取得できるが、近づける磁石の極や磁力によって取得できる値のS極/N極や大きさが変わる(※そのため、この数値だけを使って処理を分岐するなどは難しいだろう。通常は、他のセンサーの値と組み合わせて、例えば後述するコンパスのような方位計算やデバイスの位置計算などを実現する場合が多い)。磁気センサーのX/Y/Z値を取得するコード例Accelerometerと同じ注意点となるが、念のため再掲する。CurrentプロパティでCrossDeviceMotionクラスのインスタンスを取得する。そのインスタンスをメンバー変数に代入して保持しておかないと、ガベージコレクションによりオブジェクトが自動削除されることがあるので注意してほしい。Startメソッドに、引数としてMotionSensorType(センサーの種類)とMotionSensorDelay(センサー値の取得間隔)を与えて、センサー値の取得を開始する。sensorType)メソッドでセンサーがアクティブなことを確認し、SensorValueChangedイベントのイベントハンドラーで、磁力が変化した際の処理を記述すればよいだろう。SensorValueChangedイベントハンドラーの引数として渡されたSensorValueChangedEventArgsオブジェクトのValueプロパティ値は、2で指定したMotionSensorType値に基づき、適切な型にキャストしてほしい。リスト1では、X/Y/Zの値を取得するためにMotionVector型にキャストしている。センサー値の取得は、バックグラウンドのスレッドで動作している。}でくくる必要があるので注意してほしい(※上記のコードでは、Viewが動作するメインスレッドにアクセスする必要がないのでコメントアウトしている)。BeginInvokeOnMainThreadメソッドは、名前のとおりだが、メインスレッド上のコードを呼び出すためのものである。8(Silverlight)では動作しない。Pluginを使えば上記のように簡単に磁気センサーを取得できるが、これを使わずに自力で取得する方法も説明しておこう。Xamarin.iOSでのMagnetometerの取得方法ざっくりとした説明はAccelerometer(加速度)センサー/Gyroscope(ジャイロスコープ)センサーの説明に記載したのでそちらを参照してほしい。CMMotionManagerオブジェクトのStartMagnetometerUpdatesメソッドでセンサー値の取得を開始するとよい。CMMagnetometerDataオブジェクトのMagneticField.X/MagneticField.Y/MagneticField.Zプロパティで各値を取得できる。Xamarin.AndroidでのMagnetometerの取得方法こちらも、ざっくりとした説明はAccelerometer(加速度)センサー/Gyroscope(ジャイロスコープ)センサーの説明に記載したのでそちらを参照してほしい。SensorManagerオブジェクトのRegisterListenerメソッドを使用してセンサー監視を登録する。その第2引数に指定するSensorオブジェクトは、Sensor.GetDefaultSensorメソッドで取得した値である。このGetDefaultSensorメソッドの引数には、SensorType列挙体の(AccelerometerやGyroscopeの代わりに)MagneticFieldを指定するとよい。Compass(コンパス)名前そのものでコンパスを使用する。コンパスのセンサー値を取得するコードは、先ほどのMagnetometerの場合と比較して、MotionSensorType列挙体のCompass値を指定する点とSensorValueChangedイベントハンドラーの引数として渡されたSensorValueChangedEventArgsオブジェクトのValueプロパティ値が(MotionVector型ではなく)MotionValue型となる点が異なる。キャストも不要でDebug.WriteLine(a.Value.Value);などのコードで確認できる*1。XXX」という値を取得してしまうため。Value.Valueプロパティ値を参照することで数値を取得できる。iOSでコンパスセンサーを使用する際は、OSが誤差を自動的に吸収してくれる。誤差があると判断された場合は以下のような画面が表示されるのはOS標準のコンパスアプリと同様だ。Pluginを使わずに自力で取得する方法を説明しておこう。Xamarin.iOSでのCompassの取得方法iOSでコンパスを使用するにはCLLocationManagerオブジェクトのStartUpdatingHeadingメソッドを使用してセンサー値の取得を開始する。HeadingオブジェクトのMagneticHeadingプロパティで「磁北」*2のdouble値を取得でき、TrueHeadingプロパティで「真北」*2のdouble値を取得できる。取得を停止するにはStopUpdateHeadingメソッドを使用する。次のようなコードで取得できる。Pluginのコンパスで取得される値は、「真北」を基準にした方位角(=TrueHeadingプロパティ値)となり、このコードの実行結果の値とは微妙に異なる可能性がある。Xamarin(英語)」を参照してほしい。「磁北」(=方位磁石のN極が指す方向)と「真北」(=北極点を指す方位)の値は微妙にずれている(=磁気偏角)。地磁気測量:地磁気を知る」を参考にしてほしい。Xamarin.AndroidでのCompassの取得方法Androidでは、コンパスセンサーが存在しないため、加速度センサーと磁気センサーを使用して(磁北を基準にした)方位角を算出する必要がある。Booleanメソッドで第2引数にSensorType.Accelerometer列挙体値とSensorType.MagneticField列挙体値をそれぞれ指定して加速度センサーと磁気センサーの取得を開始する。Single[]メソッドで方位角と傾きを求める*3。センサーの取得停止はUnregisterListener(ISensorEventListener)で行う。次のようなコードで取得できる。Pluginのコンパスで取得される値も、同じく「磁北」を基準にした方位角となっているが、執筆時点のソースコードを確認する限り、非推奨のSensor.TYPE_ORIENTATIONを使用しており、結果の値に違いが出る可能性がある(※ちなみにAndroidにおける方位角は、このコードのように、GetRotationMatrix()/RemapCoordinateSystem()/GetOrientation()メソッドを組み合わせて算出することが推奨されている)。ほとんどの場合、この磁方位角で事足りるだろうが、真方位角を取得したい場合には、その計算のために磁気偏角(declination)を求める必要がある。詳しいコード内容は割愛するが、磁気偏角はGeomagneticFieldクラス(Android.Hardware名前空間)のDeclinationプロパティを使って取得でき、磁北+磁気偏角で真北の方位角が得られる。Xamarin(英語)」を参照してほしい。SIN@SAPPOROWORKSの覚書」を参照されたい。Phoneなどで簡単に各種センサーの機能を使用できる。皆さんのアプリに、タップ以外のモーションによる操作を追加したい場合にぜひ活用してほしい。※以下では、本稿の前後を合わせて5回分(第62回~第66回)のみ表示しています。INDEX]を参照してください。Xamarinを複数回にわたって紹介していく。Storage」プラグインを説明する。Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。Plugin」プラグインを紹介。今回は、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサーの機能を使う方法を説明する。Plugin」プラグインを紹介。今回は、Magnetometer(磁気)センサー、Compass(コンパス)の機能を使う方法を説明する。Workbooksの基本的な使い方を解説。機械学習エンジニアを目指す人~初中級者のための技術情報サイトです。2023最適なビューへの切り替えを推奨します:スマートフォン用表示に。