简体   繁体   中英

How to access raw data with CoreMotion

I'm going to develop an iPhone application based on CoreMotion and Pedestrian Dead Reckoning Algorithm. I'm experiencing a little strange behaviour reading gyroscope and acceleration data (device: iPhone 5s). Here is my code:

motionManager = [[CMMotionManager alloc] init];

motionManager.deviceMotionUpdateInterval=0.008;

[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion * motion, NSError *error)
 {
     NSString *Acc_x = [[NSString alloc] initWithFormat:@"%f ",motion.userAcceleration.x];
     NSString *Acc_y = [[NSString alloc] initWithFormat:@"%f ",motion.userAcceleration.y];
     NSString *Acc_z = [[NSString alloc] initWithFormat:@"%f ",motion.userAcceleration.z];

     NSData *AccData_x = [Acc_x dataUsingEncoding:NSUTF8StringEncoding];
     NSData *AccData_y = [Acc_y dataUsingEncoding:NSUTF8StringEncoding];
     NSData *AccData_z = [Acc_z dataUsingEncoding:NSUTF8StringEncoding];

     NSString *Gyro_x = [[NSString alloc] initWithFormat:@"%f ",motion.rotationRate.x];
     NSString *Gyro_y = [[NSString alloc] initWithFormat:@"%f ",motion.rotationRate.y];
     NSString *Gyro_z = [[NSString alloc] initWithFormat:@"%f ",motion.rotationRate.z];

     NSData *GyroData_x = [Gyro_x dataUsingEncoding:NSUTF8StringEncoding];
     NSData *GyroData_y = [Gyro_y dataUsingEncoding:NSUTF8StringEncoding];
     NSData *GyroData_z = [Gyro_z dataUsingEncoding:NSUTF8StringEncoding];


     [HandleAcc seekToEndOfFile];
     [HandleAcc writeData:AccData_x];
     [HandleAcc writeData:AccData_y];
     [HandleAcc writeData:AccData_z];
     [HandleAcc writeData:GyroData_x];
     [HandleAcc writeData:GyroData_y];
     [HandleAcc writeData:GyroData_z];


     NSDate *DataOra = [NSDate date];

     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
     [dateFormatter setDateFormat:@"HH:mm:ss\r\n"];


     NSString *dataString = [dateFormatter stringFromDate:DataOra];
     NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
     [HandleAcc writeData:data];
 }
 ];

And here is my log:

acc_x    acc_y    acc_z     gyro_x   gyro_y   gyro_z    time
0.006040 0.003147 -0.011406 0.001642 0.002079 -0.000864 01:04:40
0.006472 0.000715 -0.008345 -0.003239 -0.001569 -0.000839 01:04:40

After, I tried to compare iPhone's IMU data with other from an Adafruit's 10DOF IMU and I obtain this log:

acc_x     acc_y     acc_z    gyro_x    gyro_y   gyro_z   time
-4.773060 -1.769106 8.427839 -0.030030 0.022133 0.002239 0.008333
-4.789249 -1.741337 8.442565 -0.028949 0.009581 0.000027 0.016667

What am I doing wrong?? Are iPhone data biased? If so, should I acces unbiased data? Hope someone will help. Thank you, Giacomo.

CMMotionManager has many different things it can measure. I think all but the one you are using are unbiased.

After creating an instance of CMMotionManager, an app can use it to receive four types of motion: raw accelerometer data, raw gyroscope data, raw magnetometer data, and processed device-motion data (which includes accelerometer, rotation-rate, and attitude measurements).

If you want unbiased data, either combine gravity and userAcceleration as documented or measure acceleration directly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM