2016-07-02 48 views
2

Ich versuche die Bewegung (nach rechts oder nach links) zu finden, die von Benutzern ausgeführt wird. Wir gehen davon aus, dass der Benutzer mit ausgestrecktem Arm vor ihm anfängt und dann seinen Arm nach rechts oder nach links bewegt (etwa 90 Grad aus der Mitte).Physische Bewegung von iPhone/Apple Watch erkennen

Ich habe CMMotionManager integriert und möchte die Erfassungsrichtung über startAccelerometerUpdatesToQueue und startDeviceMotionUpdatesToQueue Methoden verstehen.

Kann jemand vorschlagen, wie man diese Logik auf einem iPhone und dann auf einer Apple Watch implementiert?

Antwort

3

Apple bietet WatchOS 3 SwingWatch sample code zeigt, wie CMMotionManager() und startDeviceMotionUpdates(to:) zu zählen, um Schaukeln in einem Racket-Sport zu zählen.

Ihr Code zeigt, wie die Richtung eines Bewegungsintervalls von einer Sekunde erkannt wird, obwohl Sie möglicherweise die Schwellenwerte anpassen müssen, um die Eigenschaften der Bewegung zu berücksichtigen, die Sie verfolgen möchten.

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