8

デバイスの磁北からの偏差を度単位で取得し、その値を作成しているコードで使用したいと思います。

デバイスの位置情報サービスを使用したくないので、真北を取得するのではなく、磁北を取得することに関心があります(デバイスの磁力計のみを使用)。

どのクラス(またはコーディングプロセス..)がその値を私に提供できますか(磁力計のみに依存しています)?

CLLocationManagerクラスとそのプロパティは、有効化/利用可能な位置情報サービスに依存しています

一方、CMMagnetometerDataクラスを備えたCore Motionフレームワークは、次のプロパティを提供します。

@property(readonly, nonatomic) CMMagneticField magneticField

A structure containing 3-axis magnetometer data

typedef struct {
   double x;
   double y;
   double z;
} CMMagneticField;

どうすればそれから学位を取得できますか?または、磁力計から度を取得するための他の方法(クラス/プロパティ/メソッド)はありますか?

その件に関して役立つ情報を持っている人に事前に感謝します!:)

4

2 に答える 2

12

iOSのドキュメントには、CMMagneticFieldデータは生であると記載されています。つまり、デバイス自体とその周辺から導入されたバイアスが含まれています。CMDeviceMotionは、フィルタリングされた同じ磁場値を提供します。

磁北を決定するには、フィルタリングされた値を使用する必要があり、デバイスは地球の表面と同じ高さにある必要があります。

磁場のx値とy値がわかれば、角度(磁北からの赤緯)は次ので計算できます。

if (y>0): heading = 90.0 - [arcTan(x/y)]*180/π
if (y<0): heading = 270.0 - [arcTAN(x/y)]*180/π
if (y=0, x<0): heading = 180.0
if (y=0, x>0): heading = 0.0

Obj-Cでは、というCMMagnetometerDataオブジェクトがあるとするとmagnetometerData、次のようになります。

 double heading = 0.0;
 double x = magnetometerData.magneticField.x;
 double y = magnetometerData.magneticField.y;
 double z = magnetometerData.magneticField.z;

 if (y > 0) heading = 90.0 - atan(x/y)*180.0/M_PI;
 if (y < 0) heading = 270.0 - atan(x/y)*180.0/M_PI;
 if (y == 0 && x < 0) heading = 180.0;
 if (y == 0 && x > 0) heading = 0.0;
于 2012-07-24T20:31:40.967 に答える
-2

Appleアプリケーションを模倣するには、センサーを融合する必要があります。彼らはジャイロ加速度計と磁力計を使用し、あなたがそのようなきれいな結果を生み出すことを学んだかもしれないし、学ばなかったかもしれない高度な数学を使用します。幸運を。あなたはおそらくそれらを模倣することはできません。

于 2013-03-08T21:37:25.840 に答える