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