Не удается получить обновления ядра 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)
}
}
}