如何使用 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).
如果您想要无偏差的数据,请按照文档组合 gravity
和 userAcceleration
或直接测量加速度。
我将开发一个基于 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).
如果您想要无偏差的数据,请按照文档组合 gravity
和 userAcceleration
或直接测量加速度。