Используйте магнитометр и акселерометр для точного расчета рысканья

В настоящее время я использую настройку 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

Теперь вычтите результат из текущего рыскания акселерометра.

ВАЛЛА!


person Roy K    schedule 19.07.2017    source источник


Ответы (1)


Вы не имеете в виду жиро? MotionManager имеет режим, в котором он объединяет 3 входа: акселерометр, гироскоп и магнитометр.

Для этого вам нужно настроить его на «Движение устройства».

Движение устройства. Вызовите метод startDeviceMotionUpdates (using :) или startDeviceMotionUpdates (), чтобы начать обновления и периодически обращаться к объектам CMDeviceMotion, считывая свойство deviceMotion. Метод startDeviceMotionUpdates (using :) (новый в iOS 5.0) позволяет указать опорный кадр, который будет использоваться для оценок отношения.

https://developer.apple.com/documentation/coremotion/cmmotionmanager.

Однако вы должны знать, что это немного увеличивает расход заряда батареи.

person Pochi    schedule 19.07.2017
comment
Это то, что я делаю в настоящий момент, как я уже сказал, я использую CMMotionManager для получения обновлений крена, тангажа и рыскания. Однако через некоторое время рыскание начинает дрейфовать, и я понимаю, что это обычная проблема с гироскопами. Ищу решение. - person Roy K; 19.07.2017