2012-07-08 4 views
8

磁気北からのデバイスの偏差を度で求め、私が書いているコードでその値を使用したいとします。どのiOSクラス/コードが磁気北を返しますか?

私はデバイスの位置情報サービスを使いたくないので、私は真北を取得するのではなく、磁気北(デバイスの磁力計のみを使用する)に興味を持っています。

(磁力計のみに依存して)その値を私に与えるクラスやコーディングプロセスはどれですか?

CLLocationManagerクラスとそのプロパティはそのCMMagnetometerDataクラスとのコアモーションフレームワークには、次のプロパティを提供してくれますよう

/利用できる有効にされている場所サービスに依存している:

@property(readonly, nonatomic) CMMagneticField magneticField 

A structure containing 3-axis magnetometer data 

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

私はどのように入手できますかそれから何度ですか?または磁力計から度を単独で取り出すための他の方法(クラス/プロパティ/メソッド)がありますか?

事前に、その問題に関する有用な情報をお持ちいただきありがとうございます。 :)

答えて

12

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

磁北を決定するには、フィルタリングされた値を使用する必要があり、デバイスは地球の表面に水平になるはずです。磁場のxとyの値(度磁北からの偏角)の角度を知ることが

以下formulaに算出することができる:オブジェクト - Cにおいて

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 

、あなたがCMMagnetometerDataオブジェクトを持っていると仮定しますあなたはリンゴのアプリケーションを模倣するためにセンサーを融合させる必要がある

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; 
+0

どうすれば私がデバイスを持っているかにかかわらず、Magnetic Northを取得したいのですが?例えばiPhone 4Sのデジタルコンパスは、どのようにデバイスを持っているかにかかわらず、Magnetic North(位置情報サービスが無効)を返します。それをどうすれば実現できますか? –

+0

提案した式が有効ではありませんObjective-C –

+0

有効なObjective-Cコードに変換しましたが、常に0度になります。 –

-2

:次のようになりますよう、magnetometerDataと呼ばれます。彼らは、ジャイロの加速度計と磁力計を使い、高度な数学を学んだことがあります。がんばろう。おそらくそれらを模倣することはできません。

+1

あなたは質問を読んだことがありますか?作者が求めていたことを注意深くチェックしてください。 – Trinimon

関連する問題