我将开发基于CoreMotion和Pedestrian Dead Reckoning算法的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数据有偏见吗?如果是这样,我应该访问无偏差数据吗? 希望有人会帮忙。谢谢你,贾科莫。
答案 0 :(得分:0)
CMMotionManager有许多不同的东西可以衡量。我认为除了你正在使用的那个之外的所有人都是公正的。
创建CMMotionManager实例后,应用程序可以使用它来接收四种类型的动作:原始加速度计数据,原始陀螺仪数据,原始磁力计数据和已处理设备运动数据(包括加速度计,旋转速率和姿态测量)。
如果您想要无偏见的数据,请将gravity
和userAcceleration
结合起来,或直接衡量加速度。