Irregular timestamp in CMMotionManager

风格不统一 提交于 2019-12-24 01:59:31

问题


Researched this a lot for the past week but could not find a similar issue. I am collecting accelerometer data on the Apple Watch and looking at the timestamp outputted by the the DeviceMotion class which presents an issue. The timestamps do not always go in chronoligcal order. For example, if I collect a few minutes of motion data at 100Hz, I get the following timestamps from a CSV file I generate in the same app (these are UTC timestamps):

1531099702.768570
1531099702.778460
1531099702.788380
1531099702.798270
1531099702.738870
1531099702.748780
1531099702.758670
1531099702.768590

If you notice, at the 5th timestamp, the time has jumped back by a significant amount compared to the 4th one.

Does anyone know what might cause this? Thanks!

This is my code:

func startUpdates() {
    motionManager = CMMotionManager()
    if motionManager.isDeviceMotionAvailable {
        self.motionManager.deviceMotionUpdateInterval = updateInterval
        self.motionManager.showsDeviceMovementDisplay = true
        self.motionManager.startDeviceMotionUpdates(using: .xArbitraryZVertical, to: .main, withHandler: { (data, error) in
            // Make sure the data is valid before accessing it.
            if let validData = data {
                // find boot time of device to normalize timestamps
                if (self.accArray.isEmpty) {
                    self.bootTime = Date(timeIntervalSinceNow:-validData.timestamp)
                }

                self.accArray.append([validData.timestamp + self.bootTime.timeIntervalSince1970,
                                      validData.attitude.pitch,
                                      validData.attitude.roll,
                                      validData.attitude.yaw,
                                      validData.userAcceleration.x,
                                      validData.userAcceleration.y,
                                      validData.userAcceleration.z,
                                      validData.rotationRate.x,
                                      validData.rotationRate.y,
                                      validData.rotationRate.z,
                                      validData.gravity.x,
                                      validData.gravity.y,
                                      validData.gravity.z])

                if (self.accArray.count == 100) {
                    let accChunk = NSKeyedArchiver.archivedData(withRootObject: self.accArray)
                    watchSessionManager.sharedManager.sendMessageData(accChunk: accChunk)
                    self.reset()
                }
            }
        })
    }
}

All data from accArray is inserted into a CSV file which is generated in the following manner:

// Create CSV with collected array
    func createCSV() -> String {
        if(self.accArray.count == 0) {
            return("No data captured")
        }
        else {
            // Create CSV structure
            var csvText = "Number,Pitch,Roll,Yaw,RotX,RotY,RotZ,GravX,GravY,GravZ,AccX,AccY,AccZ,Time\n"
            for index in 0...accArray.count-1 {
                let newLine = [String(index),
                               String(accArray[index][1]),
                               String(accArray[index][2]),
                               String(accArray[index][3]),
                               String(accArray[index][4]),
                               String(accArray[index][5]),
                               String(accArray[index][6]),
                               String(accArray[index][7]),
                               String(accArray[index][8]),
                               String(accArray[index][9]),
                               String(accArray[index][10]),
                               String(accArray[index][11]),
                               String(accArray[index][12]),
                               String(accArray[index][0])].joined(separator: ",")
                // Insert data into CSV file
                csvText.append(newLine + "\n")
            }
            self.reset()
            return(csvText)
        }
    }

来源:https://stackoverflow.com/questions/51254944/irregular-timestamp-in-cmmotionmanager

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!