65

iOSデバイスの磁力計を使用して磁場(強度、x、y、z)を取得する方法は2つあります。

1)コアの場所メソッド
からのCLHeadingを使用しました。これは、AppleのTeslameterサンプルアプリに似ています。 CLLocationManagerDelegatelocationManager:didUpdateHeading:

2)のから
使用されるコアモーション。 CMMagneticFieldCMMotionManagermagnetometerData.magneticField

質問:
a)2つの違いは何ですか?両方から異なる値を取得しています。私はそれらが同じ値を返すことを期待していました。
この違いは、アプリを静止位置(テーブルで上向き)から起動してから、デバイスを空中に持ち上げたときに最も顕著になります。
b)違いがある場合、コアロケーションの見出しからの磁場をいつ使用する必要がありますか?コアモーションからの磁場をいつ使用する必要がありますか?

注:コアの位置とコアの動きの「磁場」が異なる磁場の概念を参照しているかどうかもわかりません。
注:両方のアプローチについて、強度を(x ^ 2 + y ^ 2 + z ^ 2)の平方根として計算しました。

4

4 に答える 4

191

これを解明するために、私はAppleのドキュメントを掘り下げるのに少し時間がかかりすぎました。

磁力計データを取得する方法は3つあります

1/コアモーションフレームワーク
CMMotionManagersのCMMagnetometerクラス

2/コアモーションフレームワーク
CMDeviceMotion CMCalibratedMagneticFieldプロパティ

3/コアロケーションフレームワーク
CLLocationManagerのCLHeading

1/磁力計から「生の」データを提供します。
2/および3/は「派生」データを返します。両方の場合の数値は類似しています(完全に同じではありませんが)。

CoreMotionのCMMagnetometerとCMCalibratedMagneticFieldの違い

1/と2/-どちらもCoreMotionフレームワークとは異なります-次のように異なります。

CMDeviceMotionクラスリファレンス

@property(readonly, nonatomic) CMCalibratedMagneticField magneticField

考察
このプロパティによって返されるCMCalibratedMagneticFieldは、デバイスのバイアスなしで、デバイスの近くの全磁場を提供します。CMMagnetometerクラスのmagnetFieldプロパティとは異なり、これらの値は、地球の磁場と周囲の磁場からデバイスのバイアスを差し引いたものを反映しています。

CMMagnetometerは生データを提供し、CMCalibratedMagneticFieldは調整されたデータです。

CoreMotionのCMCalibratedMagneticFieldとCoreLocationのCLHeadingの違い

ドキュメントは2/と3/の違いについてすぐにはわかりませんが、異なる数値を生成するので、掘り下げてみましょう…。

コアロケーションフレームワーク
CLHeading

LocationAwarenessプログラミングガイドから

見出し関連のイベントの取得

磁力計を含むデバイスで実行されているアプリでは、見出しイベントを利用できます。磁力計は、地球から放射される近くの磁場を測定し、それらを使用してデバイスの正確な方向を決定します。磁力計は、オーディオスピーカー、モーター、および他の多くの種類の電子デバイスに見られる固定磁石から発する磁場などの局所磁場の影響を受ける可能性がありますが、Core Locationは、デバイスとともに移動する磁場をフィルターで除去するのに十分スマートです。

CLHeading関連する「生の」プロパティ は次のとおりです

@property(readonly, nonatomic) CLHeadingComponentValue x
@property(readonly, nonatomic) CLHeadingComponentValue y
@property(readonly, nonatomic) CLHeadingComponentValue z

[x | y | z]軸の地磁気データ(マイクロテスラで測定)。(読み取り専用)
この値は、デバイスによって追跡されている磁力線からの[x | y|z]軸の偏差を表します。(古いバージョンのドキュメントでは、次のように追加されます。 )このプロパティによって報告される値は、-128〜+128の範囲に正規化されます。

マイクロテスラ測定を+/-128の範囲に「正規化」(圧縮?クリップ?)し、それでも測定と主張する単位を表す方法がわかりません。おそらくそれがその文がドキュメントから削除された理由です。iPad miniのユニットはこの種の範囲に準拠しているように見えますが、iPhone4Sは、200〜500などのより高い範囲でCMMagnetometerの読み取り値を提供します。

APIは、派生プロパティを使用することを明確に想定しています。

@property(readonly, nonatomic) CLLocationDirection magneticHeading
@property(readonly, nonatomic) CLLocationDirection trueHeading

これにより、安定したN / SE / Wコンパスの読み取り値が度単位で示されます(0 =北、180 =南など)。真北からの磁気の偏差を取得するには、他のコアロケーションサービス(ジオロケーション)が必要です。

CLHeadingこれがヘッダーファイルの抜粋です

/*
 *  CLHeading
 *  
 *  Discussion:
 *    Represents a vector pointing to magnetic North constructed from 
 *    axis component values x, y, and z. An accuracy of the heading 
 *    calculation is also provided along with timestamp information.
 *  
 *  x|y|z
 *  Discussion:
 *    Returns a raw value for the geomagnetism measured in the [x|y|z]-axis.

コアモーションフレームワーク
CMDeviceMotionCMCalibratedMagneticField

/*
 *  magneticField
 *  
 *  Discussion:
 *          Returns the magnetic field vector with respect to the device for devices with a magnetometer.
 *          Note that this is the total magnetic field in the device's vicinity without device
 *          bias (Earth's magnetic field plus surrounding fields, without device bias),
 *          unlike CMMagnetometerData magneticField.
 */
@property(readonly, nonatomic) CMCalibratedMagneticField magneticField NS_AVAILABLE(NA,5_0);

CMMagnetometer

 *  magneticField
 *  
 *  Discussion:
 *    Returns the magnetic field measured by the magnetometer. Note
 *        that this is the total magnetic field observed by the device which
 *        is equal to the Earth's geomagnetic field plus bias introduced
 *        from the device itself and its surroundings.
 */
@property(readonly, nonatomic) CMMagneticField magneticField;  

CMMagneticField
これはベクトルを保持する構造体です。これは、の校正済み磁場との未校正バージョン
で同じです。CMDeviceMotionCMMagnetometer

/*  CMMagneticField - used in 
 *  CMDeviceMotion.magneticField.field
 *  CMMagnetometerData.magneticField
 *  
 *  Discussion:
 *    A structure containing 3-axis magnetometer data.
 *
 *  Fields:
 *    x:
 *      X-axis magnetic field in microteslas.
 *    y:
 *      Y-axis magnetic field in microteslas.
 *    z:
 *      Z-axis magnetic field in microteslas.

2/と3/の違いはここで示唆されています:

コアロケーションCLHeading

軸成分値x、y、およびzから構築された磁北を指すベクトルを表します

Core Locationは、デバイスとともに移動するフィールドを除外するのに十分スマートです

コアモーション CMCalibratedMagneticField

[表す]デバイスバイアスなしの地球の磁場と周囲の磁場

したがって、ドキュメントによると、次のようになります。

1/ CMM
磁力計磁力計からの生の読み取り値

2 / CMDeviceMotion(CMCalibratedMagneticField *)磁気
フィールド磁力計の読み取り値がデバイスのバイアス(オンボード磁場)に対して補正されました

3 / CLHeading [x | y | z]
磁力計の読み取り値は、デバイスのバイアスを補正し、局所的な外部磁場を除去するためにフィルタリングされます(デバイスの動きによって検出されます。磁場がデバイスとともに移動する場合は無視します。それ以外の場合は測定します)。

理論のテスト

ここに画像の説明を入力してください

これらの違いのいくつかを表示するMagnet-O-MeterデモアプリをgitHubに配置しました。アプリの実行中にデバイスの周りに磁石を振って、さまざまなAPIがどのように反応するかを観察することは非常に明白です。

CMMagnetometerは、希土類磁石を近づけない限り、何にも反応しません。搭載されている磁場は、局所的な外部磁場や地球の磁場よりもはるかに重要であるように思われます。私のiPhone4Sでは、常にデバイスの左下を指しています。iPad miniでは、通常、右上を指します。

CLHeading。[x|y | z] は、デバイスに対して移動しているか静的であるかに関係なく、ローカルの外部フィールドに対して最も脆弱です(応答します)。

(CMDevice)CMCalibratedMagneticFieldは、さまざまな外部フィールドに直面しても最も安定していますが、それ以外の場合は、コアロケーションの対応するCLHeading。[x | y|z]をかなり厳密に追跡します。

CLHeading.magneticHeading-磁気コンパスの読み取りに関するAppleの推奨事項-は、これらのどれよりもはるかに安定しています。磁力計のデータを安定させるために、他のセンサーからのデータを使用しています。しかし、x、y、zの生の内訳は得られません

             influenced by
             onboard fields    local external fields   earth's field
yellow               X                   X                 X
green                _                   X                 X
blue                 _                   _                 X
red                  _                   _                 X           

黄色のCMMagnetometer
緑のCLHeading。[x|y|z]
青のCMCalibratedMagneticField
赤のCLHeading.magneticHeading

これは、CLHeading。[x | y|z]がCMCalibratedMagneticFieldよりもローカル外部フィールドの影響を受けにくいことを示唆するドキュメントと矛盾しているようです。

どのようなアプローチを取るべきですか?私の限られたテストに基づいて、私は提案します…<br> CLHeadingを読み取るコンパスが必要な場合は、最も正確で最も安定したコンパスの読み取りが得られます。コアロケーションを回避する必要がある場合は、 CMDeviceMotionが次に最も望ましいようですが、よりも安定性と精度が大幅に低下します。局所磁場に興味がある場合、 CLHeadingの「生の」xyおよびzプロパティは局所磁場に対してより敏感であるように思われます。搭載磁場を含むすべてのデータが必要な場合
magneticHeadingtrueHeading

CMCalibratedMagneticFieldmagneticHeading



CMMagnetometerからの生の磁力計データ。デバイス自体に発生する磁場の影響を大きく受けるため、大量のフィルタリングを行う準備ができていない限り、これを使用してもあまり意味がありません。

于 2013-03-18T05:59:43.470 に答える
0

私は、magnetometerData.magneticField は位置ではなく加速度を伝えていると思います (したがって、大きな値が静止から移動に移動する理由)、ロケーション マネージャーはデバイスが指している方向に関するデータを提供します。

于 2013-03-15T12:15:20.817 に答える