Search code examples
iosswiftcore-motion

How to work with accelerometer data from the Apple Watch?


Via the code below I am getting accelerometer data, now I want to work with it to track the user's movement, specifically speed. Looking around at code using Core Motion on the iPhone they are using a motionManager object which can set a value for accelerometerUpdateInterval as well as get the .acceleration.x value for example. How can I work with the raw data I'm given back so that I can determine e.g. how fast a person is moving or how fast their arm is swinging?

//Record the data
if CMSensorRecorder.isAccelerometerRecordingAvailable() {
            print("Accelerometer available")
            recorder.recordAccelerometer(forDuration: 20 * 60)  // Record for 20 minutes
        }
  //Read the data
  if CMSensorRecorder.isAccelerometerRecordingAvailable() {
                let accelerometerData = recorder.accelerometerData(from: startDate, to: endDate)
                for (index, data) in (accelerometerData?.enumerated())! {
                    print(index, data)

                }
            }

Prints: 

0 388, 208409.082611, 529770182.607276, (0.038574, -0.762207, -0.652832)
1 388, 208409.102722, 529770182.627387, (0.027588, -0.763184, -0.660889)
2 388, 208409.122863, 529770182.647528, (0.027100, -0.763184, -0.661865)
3 388, 208409.142974, 529770182.667639, (0.030029, -0.756836, -0.661865)
4 388, 208409.163116, 529770182.687781, (0.026611, -0.764648, -0.665039)

Edit: I found this lib which looks like it would be perfect but hasn't been updated in 3 years...anything similar that is still maintained? https://github.com/MHaroonBaig/MotionKit


Solution

  • I found that using a CMMotionManager on the watch works just as good as it does on iPhone. This way you can implement startAccelerometerUpdates in awake and receive real time feed back on watch positions for X Y Z coordinates so that you can get a better grasp of the data;

    var motionManager = CMMotionManager() 
    
    override func awake(withContext context: Any?) {
            super.awake(withContext: context)
    
            manager.accelerometerUpdateInterval = 0.2
    
            manager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
                if let myData = data {
    
                     print("x: \(myData.acceleration.x) y: \(myData.acceleration.y) z: \(myData.acceleration.z)")
                    if myData.acceleration.x > 1.5 && myData.acceleration.y > 1.5 {
    
                    }
                }
            }
    
    
    
        }