8

我想以度数获取设备与磁北的偏差,并在我正在编写的一些代码中使用该值。

我不想使用设备的定位服务,因此我对获得真北不感兴趣,而是对磁北感兴趣(仅使用设备的磁力计)。

哪个类(或编码过程..)可以为我提供该值(仅依靠磁力计)?

CLLocationManager 类及其属性依赖于启用/可用的定位服务

其中,带有 CMMagnetometerData 类的 Core Motion 框架为我们提供了以下属性:

@property(readonly, nonatomic) CMMagneticField magneticField

A structure containing 3-axis magnetometer data

typedef struct {
   double x;
   double y;
   double z;
} CMMagneticField;

我如何从中获得学位?还是有其他方法(类/属性/方法)可以单独从磁力计中获取度数?

提前感谢您提供有关此问题的一些有用信息的任何人!:)

4

2 回答 2

12

iOS 文档指出 CMMagneticField 数据是原始数据,这意味着它包括从设备本身及其周围环境引入的偏差。CMDeviceMotion提供相同的过滤磁场值。

要确定磁北,您应该使用过滤后的值,并且设备应该与地球表面保持水平。

知道磁场的 x 和 y 值,可以使用以下公式计算角度(以度为单位的磁北偏角) :

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

 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;
于 2012-07-24T20:31:40.967 回答
-2

您需要融合传感器来模仿苹果应用程序。他们使用陀螺加速度计和磁力计,以及您可能学过或未学过的高级数学来产生如此清晰的结果。祝你好运。你可能无法模仿它们。

于 2013-03-08T21:37:25.840 回答