これを解明するために、私は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
これはベクトルを保持する構造体です。これは、の校正済み磁場との未校正バージョン
で同じです。CMDeviceMotion
CMMagnetometer
/* 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プロパティは局所磁場に対してより敏感であるように思われます。搭載磁場を含むすべてのデータが必要な場合
magneticHeading
trueHeading
CMCalibratedMagneticField
magneticHeading
CMMagnetometerからの生の磁力計データ。デバイス自体に発生する磁場の影響を大きく受けるため、大量のフィルタリングを行う準備ができていない限り、これを使用してもあまり意味がありません。