I have a very simple application where I am trying to use the gyroscope thru core motion.
At this point, for test purposes, I am just grabbing the values of roll, pitch and yaw and printing on screen. According to the picture below and as far as I know, roll, pitch and yaw correspond to the red, green and blue axis, right?
OK. When I put the iphone on a table resting on its left side (home button on the right), perfectly at 90 degrees in relation to the table plane, these are the values I read for roll, pitch and yaw: -90, 0, 0. Then I start to rotate the iPhone according to the table's vertical axis in an anti-clockwise fashion, that would be on the positive direction according to the table vertical axis. On the iPhone, that would mean a pitch rotation, but as I rotate, pitch remains constant and YAW is the one that changes!!!!!
If the iPhone is resting on its left side on the table, the green axis (pitch) is vertical. If I am rotating the device anti-clockwise (positive) on X, I should see an increase on the pitch angle, not yaw.
The only explanation I have for this is, the gyroscope axis don't rotate when you rotate the device. So, if I am using the default attitude reference, the iPhone considers that the face up resting position is the default and the blue axis (yaw) will always be the vertical one. Is this correct?
This is the code I am using...
on the main code
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0/60.0; //60 Hz
[motionManager startDeviceMotionUpdates];
timer = [[NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
target:self
selector:@selector( readIt )
userInfo:nil
repeats:YES]
retain];
the remaining code
#define degrees(x) (180.0 * x / M_PI)
- (void) readIt {
// CMAttitude *referenceAttitude;
CMAttitude *attitude;
CMDeviceMotion *motion = motionManager.deviceMotion;
if (!motion) {
return;
}
attitude = motion.attitude;
NSLog(@"roll = %f... pitch = %f ... yaw = %f", degrees(attitude.roll), degrees(attitude.pitch), degrees(attitude.yaw));
}