Pregunta

I have a problem getting pitch, roll and yaw angles from CMAttitude class.

First, I did a normal Gyro using 'CMMotionManager' class and atributes x,y,z and worked fine. Then, I tried to use CMAttitude for "absolute angles", but I doesn't work because It seems that is not updating data. Angles are always 0 (but the isn't errors or warnings)

I have searched a lot in stackoverflow, and used some solutions I find, but I have the same problem. Here's my code:

- (void)viewDidLoad
{
  [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

  motionManager = [[CMMotionManager alloc] init];

  CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
  CMAttitude *attitude = deviceMotion.attitude;
  referenceAttitude   = attitude;

  [motionManager startGyroUpdates];

  timer = [NSTimer scheduledTimerWithTimeInterval:1/30.0
                                         target:self
                                       selector:@selector(doGyroUpdate)
                                       userInfo:nil
                                        repeats:YES];
}

-(void)doGyroUpdate {


 //cambia el frame de referencia
  [motionManager.deviceMotion.attitude multiplyByInverseOfAttitude: referenceAttitude];

  double rRotation = motionManager.deviceMotion.attitude.roll*180/M_PI;
  double pRotation = motionManager.deviceMotion.attitude.pitch*180/M_PI;
  double yRotation = motionManager.deviceMotion.attitude.yaw*180/M_PI;

NSString *myString = [NSString stringWithFormat:@"%f",rRotation];
self.angYaw.text = myString;

myString = [NSString stringWithFormat:@"%f",pRotation];
self.angPitch.text = myString;

myString = [NSString stringWithFormat:@"%f",yRotation];
self.angRoll.text = myString;

}

Thanks a lot! :D

¿Fue útil?

Solución

motionManager has 4 modes: Accelerometer, Gyroscope, Magnetometer and Device motion.

Depending on which one you need, you need to start appropriate mode: startAccelerometerUpdates, startGyroUpdates, startMagnetometerUpdates or startDeviceMotionUpdates.

You are starting startGyroUpdates but reading deviceMotion property. In your case only gyroData will be available.

do this instead and you will be getting the deviceMotion data:

[motionManager startDeviceMotionUpdates];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top