如何使用 CoreMotion 访问原始数据

How to access raw data with CoreMotion

我将开发一个基于 CoreMotion 和行人航位推算算法的 iPhone 应用程序。 我在读取陀螺仪和加速度数据时遇到了一些奇怪的行为(设备:iPhone 5s)。 这是我的代码:

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];
 }
 ];

这是我的日志:

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

之后,我尝试将 iPhone 的 IMU 数据与来自 Adafruit 的 10DOF IMU 的其他数据进行比较,我得到了这个日志:

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

我做错了什么?? iPhone 数据有偏差吗?如果是这样,我应该访问无偏见的数据吗? 希望有人会帮忙。谢谢你,贾科莫。

CMMotionManager 有很多不同的东西可以测量。我认为除了你正在使用的那个之外,其他人都是公正的。

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).

如果您想要无偏差的数据,请按照文档组合 gravityuserAcceleration 或直接测量加速度。