В настоящее время я использую настройку CMMotionManager, чтобы получить крен, тангаж и рыскание. Однако после нескольких минут рысканья начинает дрейфовать и становится неточным.
Я читал, что есть способ рассчитать рыскание с помощью комбинации акселерометра и магнитометра, который будет поддерживать точность рыскания с компенсацией постоянного дрейфа, однако я еще не нашел рабочей формулы.
Вот небольшая часть моего кода, который я использую для получения обновлений движения.
motionManager.deviceMotionUpdateInterval = 0.1
motionManager.showsDeviceMovementDisplay = true
motionManager.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, to: OperationQueue.current!)
{ deviceManager, error in
if let deviceManager = deviceManager {
let roll = deviceManager?.attitude.roll
let pitch deviceManager?.attitude.pitch
let yaw = deviceManager?.attitude.yaw // Get drifted over time
...
Любая идея?
ОБНОВЛЕНИЕ
Я мог бы компенсировать отклонение от курса, используя следующую формулу:
Создайте начальную точку отсчета (фиксированную мировую систему отсчета) с помощью магнитометра:
m_w = (m_x,m_y,m_z)
Возьмите текущую точку магнитомера (также фиксированную мировую систему отсчета) с помощью магнитометра:
n_w = (n_x,n_y,n_z)
Преобразование прогнозируемого показания в углы
a = atan2(m_z,m_x)
b = atan2(n_z,n_x)
Дрейф рысканья можно рассчитать следующим образом
y_d = (a-b) * 180 / PI
Теперь вычтите результат из текущего рыскания акселерометра.
ВАЛЛА!