我需要用iPhone上的陀螺仪提供一些帮助。 我无法理解从CMAttitude关于俯仰,滚转和偏航在特定情况下的读数。
这是我的代码
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
}
让我们假设iPhone已铺设在一个平面上,如下图所示:
俯仰,滚转和偏航(几乎)在0度和任何转绕轴返回理解读数。 例如,打开设备右,偏航降低,俯仰和横滚保持为0。
现在iPhone是在以下位置:
与测量重新开始。
读数是:偏航= 0,间距= 90,无障碍= 0
因为设备围绕该轴线旋转时,间距增大。
移动iPhone到这个位置:
读数是:偏航= 30,间距= 90,无障碍= 0
再次,由于设备周围的偏航轴线,该值的变化和其他不旋转。
移动绕侧倾轴的设备:
读数是:偏航= 0,间距= 90,无障碍= -20。
现在我无法理解。 移动iPhone周围半径R的圆(R> 0),如在该图中:
偏航变同时俯仰和横滚没有。
我本来期望偏航一直保持不变,轧辊发生了变化。
因为我有兴趣专门围绕偏航轴的旋转由用户做出如何弥补呢?
我有另外一个问题是漂流。 iPhone是在第二图中所描述的位置,在静止时间长(1分钟以上)的我的手作出。 偏航不断加大。 任何想法如何补偿漂移?
先感谢您
UPDATE我跟随凯建议,但没有任何变化。 在我的代码的一些更详细。 我想用偏航仅旋转的UIImage的当用户绕横摆轴旋转的装置。 这工作,但是当用户绕其自身的垂直轴的偏转改变。 我想,是不是因为当绕其垂直轴线用户移动,设备不围绕其自身的偏航轴旋转正确。 也许是我错了。 这是我原来的代码:
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
CMAttitude *attitude = motion.attitude;
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}
这是凯建议后的代码:
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
CMAttitude *attitude = motion.attitude;
if (startAttitude == 0) {
startAttitude = attitude;
}
[attitude multiplyByInverseOfAttitude:startAttitude];
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}
我开始与设备运动监控
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error){
[self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES];
}];