Не удается получить обновления ядра Motion с помощью watchOS 5: "[Gyro] Вручную установите калибровку прерывания гироскопа на 800"

Я пытаюсь получить данные Core Motion от Apple Watch 3 (WatchOS 5.1), но хотя DeviceMotion доступна (isDeviceMotionAvailable свойство true), обработчик никогда не срабатывает. Я получаю следующее сообщение в консоли сразу после разбора super.willActivate():

[Gyro] Вручную установите калибровку прерывания гироскопа на 800

Я использую следующую функцию для получения обновлений Device Motion:

func startQueuedUpdates() {
    if motion.isDeviceMotionAvailable {
        self.motion.deviceMotionUpdateInterval = 1.0 / 100.0
        self.motion.showsDeviceMovementDisplay = true
        self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, to: self.queue, withHandler:{
            (data, error) in
            // Make sure the data is valid before accessing it.
            if let validData = data {

                print(String(validData.userAcceleration.x))

            }
        })
    }
}

В InterfaceController я объявил

let motion = CMMotionManager()
let queue : OperationQueue = OperationQueue.main

Кто-нибудь встречал это сообщение раньше и смог его решить?

Примечание: я проверил isGyroAvailable собственность и это false,

0 ответов

Уловка здесь в том, чтобы соответствовать startDeviceMotionUpdates(using: CMAttitudeReferenceFrameпараметр к возможностям вашего устройства. Если у него нет магнитометра, он не может относиться к магнитному северу, и даже если у него есть магнитометр, он не может относиться к истинному северу, если он не знает, где вы находитесь (т.е. имеет широту и долготу). Если у него нет возможностей соответствовать выбранному вами параметру, обновление будет вызвано, но данные будутnil.

Если запустить с минимальным .xArbitraryZVerticalвы будете получать обновления от акселерометра, но не получите значимого заголовка, только относительного, черезCMDeviceMotion.attitude свойство...

if motion.isDeviceMotionAvailable {
    print("Motion available")
    print(motion.isGyroAvailable ? "Gyro available" : "Gyro NOT available")
    print(motion.isAccelerometerAvailable ? "Accel available" : "Accel NOT available")
    print(motion.isMagnetometerAvailable ? "Mag available" : "Mag NOT available")

    motion.deviceMotionUpdateInterval = 1.0 / 60.0
    motion.showsDeviceMovementDisplay = true
    motion.startDeviceMotionUpdates(using: .xArbitraryZVertical) // *******

    // Configure a timer to fetch the motion data.
    self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
        if let data = self.motion.deviceMotion {
            print(data.attitude.yaw)
        }
    }
}
Другие вопросы по тегам