如何确定磁力计信号的水平/垂直轨迹?

时间:2018-10-19 14:32:06

标签: ios 3d core-motion magnetometer

我正在尝试使用磁力计来确定信号的水平和垂直轨迹。

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磁力计的值,以便它们与前一个示例中的值大致匹配。

0 个答案:

没有答案