哪个 iOS 类/代码返回磁北?
Posted
技术标签:
【中文标题】哪个 iOS 类/代码返回磁北?【英文标题】:Which iOS class/code returns the magnetic North? 【发布时间】:2012-07-08 04:44:05 【问题描述】:我想获取设备与磁北的偏差(以度为单位),并在我正在编写的一些代码中使用该值。
我不想使用设备的定位服务,因此我对获取真北不感兴趣,而是对磁北感兴趣(仅使用设备的磁力计)。
哪个类(或编码过程..)可以为我提供该值(仅依靠磁力计)?
CLLocationManager 类及其属性依赖于启用/可用的定位服务
Core Motion 框架及其 CMMagnetometerData 类为我们提供了以下属性:
@property(readonly, nonatomic) CMMagneticField magneticField
A structure containing 3-axis magnetometer data
typedef struct
double x;
double y;
double z;
CMMagneticField;
我如何从中获得学位?还是有其他方法(类/属性/方法)可以单独从磁力计中获取度数?
提前感谢任何提供有关此问题的有用信息的人! :)
【问题讨论】:
【参考方案1】:ios documentation 声明 CMMagneticField 数据是原始数据,这意味着它包括从设备本身及其周围环境引入的偏差。 CMDeviceMotion 提供相同的磁场值过滤。
要确定磁北,您应该使用过滤后的值,并且设备应该与地球表面保持水平。
知道磁场的 x 和 y 值后,可以使用以下formula 计算角度(以度为单位的磁北偏角):
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 中,假设你有一个名为 magnetometerData
的 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;
【讨论】:
如果我想获得磁北而不管我如何拿着设备怎么办?例如无论我如何拿着设备,iPhone 4S 上的数字罗盘都会返回磁北(位置服务已禁用)。我怎样才能做到这一点? 你建议的公式是无效的Objective-C 无论您如何握住设备,要获得磁北,我想您应该使用 CMDeviceMotion 的过滤磁值,而不是 CMMagnetometerData 的未过滤值。 这种措辞使您似乎可以仅使用 x 和 y 变量来计算偏角。这不可能。计算偏角需要经度、纬度、高度和时间。如计算它的这个android源代码所示。 android.googlesource.com/platform/frameworks/base/+/refs/heads/…【参考方案2】:您需要融合传感器来模仿苹果应用程序。他们使用陀螺加速度计和磁力计,以及您可能学过或未学过的高级数学来产生如此清晰的结果。祝你好运。你可能无法模仿它们。
【讨论】:
你读过这个问题吗?请仔细检查作者的要求。以上是关于哪个 iOS 类/代码返回磁北?的主要内容,如果未能解决你的问题,请参考以下文章
Java:list.listIterator() 返回的对象属于哪个类?