Как определить горизонтальную / вертикальную траекторию сигнала магнитометра? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь использовать магнитометр для определения горизонтальной и вертикальной траектории сигнала.

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 в последнем примере, чтобы они приблизительно соответствовали значениям в предыдущем примере.

...