哪个 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 中,假设你有一个名为 magnetometerDataCMMagnetometerData 对象,它看起来像:

 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 类/代码返回磁北?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定从iOS后台返回前台时加载哪个视图?

Java:list.listIterator() 返回的对象属于哪个类?

从父类返回子类

eclipse如何返回上一步代码处?

当出现错误时,我们是不是应该强调返回哪个特定的 HTTP 响应代码?

ios开发之自己定义默认生成的导航栏 标题 颜色 返回button