IOSデバイスの磁力計を使用して磁場(強度、x、y、およびz)を取得する2つの方法があります。
1)コアの場所CLLocationManagerDelegate
メソッドlocationManager:didUpdateHeading:
からCLHeadingを使用しました。これは、AppleのTeslameterサンプルアプリに似ています。
2)コアモーションCMMagneticField
のmagnetometerData.magneticField
からCMMotionManager
を使用しました。
質問:
a)2つの違いは何ですか?両方から異なる値を取得しています。それらが同じ値を返すことを期待していました。
この違いは、アプリを静止位置(表を上にして)から起動し、デバイスを空中に持ち上げたときに最も顕著になります。
b)違いがある場合、Core Locationの見出しからの磁場をいつ使用し、Core Motionの磁場をいつ使用する必要がありますか?
注:また、コアロケーションとコアモーションの「磁場」が異なる磁場の概念を指しているかどうかもわかりません。
注:両方のアプローチについて、強度を(x ^ 2 + y ^ 2 + z ^ 2)の平方根として計算しました。
これを解明するために、Apple docs。
磁力計データを取得するには3つの方法があります
1/ Core Motion framework
CMMotionManagersの CMMagnetometer
クラス
2/Core Motionフレームワーク
CMDeviceMotionCMCalibratedMagneticField
プロパティ
3/ コアロケーションフレームワーク
CLLocationManagerのCLHeading
1 /磁力計からの「生の」データを提供します。
2 /および3 /は、「派生」データを返します。両方の場合の数値は似ています(正確に同じではありません)。
Core MotionのCMM磁力計とCMCalibratedMagneticFieldの違い
1 /および2 /-どちらもCore Motionフレームワークから-次のように異なります。
CMDeviceMotionクラスリファレンス
@property(readonly, nonatomic) CMCalibratedMagneticField magneticField
討論
このプロパティによって返されるCMCalibratedMagneticFieldは、デバイスバイアスなしでデバイスの近傍の全磁場を提供します。 CMMagnetometerクラスのmagneticFieldプロパティとは異なり、これらの値は、地球の磁場に周囲の磁場を加え、デバイスバイアスを引いたものを反映しています。
CMMagnetometerは生データを提供し、CMCalibratedMagneticFieldは調整されたデータです。
コアモーションのCMCalibratedMagneticFieldとコアロケーションのCLHeadingの違い
ドキュメントは2 /と3 /の違いについてすぐにはわかりませんが、異なる数値を生成するので、掘り下げましょう。
コアロケーションフレームワーク
CLHeading
From Location Awareness Programming Guide
ヘディング関連のイベントを取得する
見出しイベントは、磁力計を含むデバイスで実行されているアプリで利用できます。磁力計は、地球から発する近くの磁場を測定し、それらを使用してデバイスの正確な方向を決定します。磁力計は、オーディオスピーカー、モーター、および他の多くの種類の電子機器に見られる固定磁石から発生する磁場など、局所的な磁場の影響を受ける可能性がありますが、Core Locationは、デバイスとともに移動する磁場を除去するのに十分スマートです。
関連するCLHeading
'raw'プロパティは次のとおりです。
@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などのより高い範囲でCMM磁力計測定値を提供します。
APIは、派生プロパティを使用することを明確に期待しています。
@property(readonly, nonatomic) CLLocationDirection magneticHeading
@property(readonly, nonatomic) CLLocationDirection trueHeading
安定したN/S E/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);
CMM磁力計
* 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から構築された磁北を指すベクトルを表します
コアロケーションは、デバイスと共に移動するフィールドを除外するのに十分スマートです
コアモーションCMCalibratedMagneticField
[表す]地球の磁場と周囲の磁場、デバイスバイアスなし
だから-ドキュメントによると-私たちは持っています:
1 /CMM磁力計
磁力計からの生の測定値
2 /CMDeviceMotion(CMCalibratedMagneticField *)magneticField
デバイスのバイアスを補正した磁力計の読み取り値(オンボード磁場)
3 /CLHeading [x | y | z]
磁力計の読み取り値は、デバイスのバイアスを補正し、ローカルの外部磁場を除去するためにフィルター処理されます(デバイスの動きによって検出される-磁場がデバイスとともに移動する場合は無視し、そうでない場合は測定します)
理論のテスト
gitHubのマグネット-O-メーターデモアプリ を追加しました。これらの違いの一部が表示されます。アプリの実行中にデバイスの周囲に磁石を振ると、さまざまなAPIがどのように反応するかを見ることができます。
CMM磁力計は、希土類磁石を近づけない限り、何にも反応しません。機内の磁場は、局所的な外部磁場や地球の磁場よりもはるかに重要であると思われます。私のiPhone 4Sでは、常にデバイスの左下を指しています。 iPad miniでは、通常は右上を指します。
CLHeading。[x | y | z]は、デバイスに対して移動するか静的であるかにかかわらず、ローカル外部フィールドに対して最も脆弱です(応答します)。
(CMDevice)CMCalibratedMagneticFieldはさまざまな外部フィールドに直面して最も安定していますが、それ以外の場合は対応するコアロケーションのトラックCLHeading。[x | y | z ]かなり近い。
CLHeading.magneticHeading-磁気コンパスの読み取りに関するアップルの推奨事項-これらのいずれよりもはるかに安定しています。他のセンサーからのデータを使用して、磁力計のデータを安定させています。しかし、x、y、zの生の内訳は得られません。
influenced by
onboard fields local external fields earth's field
yellow X X X
green _ X X
blue _ _ X
red _ _ X
黄色CMM磁力計
緑CLHeading。[x | y | z]
青CMCalibratedMagneticField
redCLHeading.magneticHeading
これは、CLHeading。[x | y | z]がCMCalibratedMagneticField。
どのようなアプローチを取るべきですか?私の限られたテストに基づいて、私はお勧めします…
コンパスの読み取りが必要な場合
CLHeadingのmagneticHeading
およびtrueHeading
は、最も正確で最も安定したコンパス読み取りを提供します。
コアロケーションを回避する必要がある場合
CMDeviceMotionのCMCalibratedMagneticField
は、magneticHeading
よりも安定性と精度がかなり劣りますが、次に最も望ましいようです。
局所磁場に興味がある場合
CLHeadingの「生の」x yおよびzプロパティは、局所磁場に対してより敏感なようです。
オンボード磁場を含むすべてのデータが必要な場合
CMMagnetometerからの生磁力計データ。大量のフィルタリングを実行する準備ができていない限り、デバイス自体で生成される磁場の影響を大きく受けるため、これを使用してもあまり意味がありません。
この回答は、以下のドキュメントリンクの解釈に基づいています
a)CLHeadingは「deviationデバイスによって追跡されている磁力線からの偏差」であり、一方、magnetometerData.magneticFieldは「地球の地磁気にデバイス自体とその周囲から導入されたバイアスを加えたものに等しい、デバイスによって観測される全磁場」.
したがって、CLHeadingは、Frame of Referenceが地球の既存の磁場であるフィルター値を提供します。 magnetometerDataは、Frame of referenceがデバイスであるフィルターなしの値を提供します。
b)磁気または真北がどこであるかを知りたい場所で何かをしていた場合、CLHeadingを使用することをお勧めします。すぐ近くのデバイスの磁場に応答するアプリを作成したい場合、または特定のセンサーフュージョンを実行したい場合は、たとえばAHRSを作成してからCMMagneticFieldを使用してください。
CLHeading。[x | y | z]値を使用して局所磁場強度を計算する際に覚えておくべき重要なことは、CLLocationManagerDelegateメソッドが
yESを返すように設定する必要があります。この校正警告がオフになっていると、磁力計の読み取り値が校正されず、その結果、デバイスの向きが変更されたときに計算された磁場強度が非常に不安定になることがわかりました。
MagnetometerData.magneticFieldは、位置ではなく加速度を示していると思うので(大きな値が静止から移動に移動する理由)、ロケーションマネージャーはデバイスが指している方向のデータを提供します。