Не удается получить обновления ядра Motion с помощью watchOS 5: «[Gyro] Вручную установите калибровку прерывания гироскопа на 800» - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь получить данные 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.

1 Ответ

0 голосов
/ 18 июня 2019

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

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