我正在尝试使用磁力计来确定信号的水平和垂直轨迹。
CMMotionManager的deviceMotion.magneticField
在3轴(x,y和z)上提供磁场数据。 x值从左到右,y从手机的底部到顶部,z轴穿过屏幕,负z轴朝向手机背面,正z轴朝向正面。例如,高的正x值表示设备右侧的值为强,而高的负x值表示设备左侧的值为强。
除了磁场之外,我还知道设备相对于重力的俯仰/倾斜/偏航。
我写了一个扩展名,以给出与设备有关的磁场的水平和垂直轨迹:
struct Trajectory {
var horizontalTrajectory: Double
var verticalTrajectory: Double
}
extension CMMagneticField {
var magnitude: Double {
return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2))
}
var trajectory: Trajectory {
let horizontalTrajectory = atan2(x, y)
let horizontalMagnitude = sqrt(pow(x, 2) + pow(y, 2))
let verticalTrajectory = atan2(z, horizontalMagnitude)
return Trajectory(horizontalTrajectory: horizontalTrajectory, verticalTrajectory: verticalTrajectory)
}
}
当设备平放时,垂直轨迹与重力有关,水平轨迹与设备面对的方式有关。因此上面的功能将为我提供所需的结果。
但是,当设备未平放时-假设它的倾斜角度为45º,则会更改x / y / z值。我将如何“校正” x / y / z值以便相对于重力给出它们?
平坦时的信号示例(以度为单位的值):
pitch: 0.7, yaw: 65.4, roll: 0.5
field x: 13.2, y: -28.2, z: -37.1, magnitude: 48.5
接近45º时的示例信号:
pitch: 41.2, yaw: 65.2, roll: 1.0
field x: 13.0, y: -45.8, z: -8.6, magnitude: 48.4
我想在后一个示例中校正x / y / z磁力计的值,以便它们与前一个示例中的值大致匹配。