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

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

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

Я использую следующую функцию для получения обновлений движения устройства:

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.


person jiko    schedule 18.02.2019    source источник


Ответы (1)


Хитрость здесь в том, чтобы сопоставить параметр 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)
        }
    }
}
person Grimxn    schedule 18.06.2019
comment
Приносим извинения за поздний ответ. Теперь он работает отлично. Я также попробую с новыми Apple Watch Series 5, у которых есть магнитометр, чтобы увидеть, отличается ли он. - person jiko; 21.11.2019