检测 iPhone/Apple Watch 的物理运动 [英] Detect physical movement of iPhone/Apple Watch
问题描述
我正在尝试检测用户执行的移动(向右或向左).我们假设用户开始时将手臂伸到他面前,然后向右或向左移动手臂(偏离中心约 90 度).
I'm trying to detect the movement (to the right or left) performed by users. We assume that the user starts with his arm extended in front of him and then moves his arm to the right or to the left (about 90 degrees off center).
我已经集成了 CMMotionManager
并想通过 startAccelerometerUpdatesToQueue
和 startDeviceMotionUpdatesToQueue
方法了解检测方向.
I've integrated CMMotionManager
and want to understand detecting direction via startAccelerometerUpdatesToQueue
and startDeviceMotionUpdatesToQueue
methods.
谁能建议如何在 iPhone 和 Apple Watch 上实现这个逻辑?
Can anyone suggest how to implement this logic on an iPhone and then on an Apple Watch?
推荐答案
Apple 提供 watchOS 3 SwingWatch 示例代码 演示了如何使用 CMMotionManager()
和 startDeviceMotionUpdates(to:)
来计算球拍运动中的摆动次数.
Apple provides watchOS 3 SwingWatch sample code demonstrating how to use CMMotionManager()
and startDeviceMotionUpdates(to:)
to count swings in a racquet sport.
他们的代码演示了如何检测一秒间隔运动的方向,尽管您可能需要调整阈值以说明您想要跟踪的运动特征.
Their code demonstrates how to detect the direction of a one-second interval of motion, although you may have to tweak the thresholds to account for the characteristics of the motion you want to track.
func processDeviceMotion(_ deviceMotion: CMDeviceMotion) {
let gravity = deviceMotion.gravity
let rotationRate = deviceMotion.rotationRate
let rateAlongGravity = rotationRate.x * gravity.x // r⃗ · ĝ
+ rotationRate.y * gravity.y
+ rotationRate.z * gravity.z
rateAlongGravityBuffer.addSample(rateAlongGravity)
if !rateAlongGravityBuffer.isFull() {
return
}
let accumulatedYawRot = rateAlongGravityBuffer.sum() * sampleInterval
let peakRate = accumulatedYawRot > 0 ?
rateAlongGravityBuffer.max() : rateAlongGravityBuffer.min()
if (accumulatedYawRot < -yawThreshold && peakRate < -rateThreshold) {
// Counter clockwise swing.
if (wristLocationIsLeft) {
incrementBackhandCountAndUpdateDelegate()
} else {
incrementForehandCountAndUpdateDelegate()
}
} else if (accumulatedYawRot > yawThreshold && peakRate > rateThreshold) {
// Clockwise swing.
if (wristLocationIsLeft) {
incrementForehandCountAndUpdateDelegate()
} else {
incrementBackhandCountAndUpdateDelegate()
}
}
// Reset after letting the rate settle to catch the return swing.
if (recentDetection && abs(rateAlongGravityBuffer.recentMean()) < resetThreshold) {
recentDetection = false
rateAlongGravityBuffer.reset()
}
}
这篇关于检测 iPhone/Apple Watch 的物理运动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!