2016-07-02 6 views
2

사용자가 수행 한 (오른쪽 또는 왼쪽으로) 움직임을 감지하려고합니다. 사용자는 팔을 앞쪽으로 뻗은 채로 시작하여 팔을 오른쪽 또는 왼쪽으로 움직여야한다고 가정합니다 (중앙에서 약 90도 벗어남).iPhone/Apple의 물리적 이동 감지

나는 CMMotionManager을 통합했으며 startAccelerometerUpdatesToQueuestartDeviceMotionUpdatesToQueue 방법을 통해 방향을 감지하는 것을 알고 싶습니다.

누구나 iPhone과 Apple Watch에서이 로직을 구현하는 방법을 제안 할 수 있습니까?

답변

3

Apple은 watchOS 3 SwingWatch sample code을 제공하여 CMMotionManager()startDeviceMotionUpdates(to:)을 사용하여 라켓 스포츠의 스윙을 계산하는 방법을 보여줍니다.

코드는 1 초 간격의 움직임을 감지하는 방법을 보여 주지만, 추적하려는 움직임의 특성을 설명하기 위해 임계 값을 조정해야 할 수도 있습니다.

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() 
    } 
}