有三种获取磁力计数据的方法,如上图所示
-
Core Motion框架
CMMotionManagers
的CMMagnetometer
类 -
Core Motion框架
CMDeviceMotion
的CMCalibratedMagneticField
属性 -
Core Location框架
CLLocationManager
的CLHeading
1.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;
2.CMDeviceMotion(CMCalibratedMagneticField
*)
磁场磁场 计读数针对器件偏差(板载磁场)进行了校正,没有器件偏差。
/*
* 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);
CMCalibratedMagneticField包括两个字段:field(XYZ轴上的磁场强度)和accuracy(磁场长度的精度)。
3.CLHeading [x | y | z]
针对器件偏置校正磁性计读数并过滤以消除局部外部磁场(通过器件移动检测 - 如果器件随器件移动,忽略它;否则测量)
/*
* 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.
CLHeading是“ 偏离设备跟踪的磁场线”,而magnetometerData.magneticField是设备观察到的总磁场,等于地球的地磁场加上设备本身及其周围的偏置“ 。
因此,CLHeading会提供经过滤的值,其中“参照系”是现有的地球磁场。而磁力计数据提供未经过滤的值,参考帧是设备。
例子
#import <CoreMotion/CoreMotion.h>
@property (nonatomic, strong) CMMotionManager * motionManager;
- (void)viewDidLoad {
[super viewDidLoad];
_motionManager = [[CMMotionManager alloc] init];
// 判断设备是否支持磁强计
if (_motionManager.magnetometerAvailable){
[_motionManager startMagnetometerUpdates];
NSLog(@"该设备支持磁强计");
}else{
NSLog(@"该设备不支持磁强计");
}
// 磁强计 开启
[_motionManager startMagnetometerUpdates];
[self useMagnetometerPush];
}
// 使用第二种CMDeviceMotion的CMCalibratedMagneticField属性
- (void)useMagnetometerPush{
// 设定获取间隔时间
_motionManager.magnetometerUpdateInterval = 0.5;//0.1f;
// 添加线程
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
[_motionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXArbitraryCorrectedZVertical toQueue:queue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {
NSLog(@"磁强计X = %.04f 磁强计Y = %.04f 磁强计Z = %.04f 精度:%d",motion.magneticField.field.x,motion.magneticField.field.y,motion.magneticField.field.z, motion.magneticField.accuracy);
}];
}
// 通过第一种CMMotionManagers的CMMagnetometer类获取原始数据
- (void)useMagnetometerPushOriginal{
_motionManager.magnetometerUpdateInterval = 0.5;//0.1f;
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
[_motionManager startMagnetometerUpdatesToQueue:queue withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
NSLog(@"磁强计X = %.04f 磁强计Y = %.04f 磁强计Z = %.04f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z);
}];
}
最后
如果你想知道哪里是磁性或真正北方的位置,推荐使用CLHeading
,可以做指南针的一类应用。如果想要创建一个响应紧邻设备磁场的应用,或者想要执行某种特定的传感器融合,可以尝试创建一个AHRS,然后使用CMMagneticField
即第二种方式。
网友评论