CMDeviceMotion проблемы с multiplyByInverseOfAttitude - PullRequest
0 голосов
/ 12 июня 2011

Я впервые поиграю с Core Motion, у меня возникла проблема, и я не могу понять, что происходит. Я уверен, что это будет простой вопрос. Вот некоторый код:

.h файл

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>

@interface TempVC : UIViewController {
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
CMAttitude *attitude;
}
- (void)updateData;
@end

.m файл

#import "TempVC.h"
#define DEGREES(radians) (radians / M_PI * 180.0)
@implementation TempVC

- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor brownColor];

motionManager = [[CMMotionManager alloc] init]; 
referenceAttitude = nil;

CMDeviceMotion *dm = motionManager.deviceMotion;
attitude = dm.attitude;
referenceAttitude = [attitude retain];

motionManager.deviceMotionUpdateInterval = 0.1;
[motionManager startDeviceMotionUpdates];

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateData) userInfo:nil repeats:YES];

}

- (void)updateData
{
attitude = motionManager.deviceMotion.attitude;
[attitude multiplyByInverseOfAttitude:referenceAttitude];
NSLog(@"\n Roll: %.0f\n Pitch: %.0f\n Yaw: %.0f",DEGREES(attitude.roll), DEGREES(attitude.pitch), DEGREES(attitude.yaw));
}

Этот код вылетает без реального указания на то, что идет не так. Если я закомментирую

[attitude multiplyByInverseOfAttitude:referenceAttitude];

все отлично работает ??? Я неправильно реализовал ссылку?

1 Ответ

2 голосов
/ 12 июня 2011

Вы получаете доступ к свойству CMMotionManager's deviceMotion перед запуском обновлений.Там вы сохраняете свою referenceAttitude, которая в то время все еще будет равна нулю.Когда через несколько миллисек вызывается updateData, [attitude multiplyByInverseOfAttitude:referenceAttitude]; завершится ошибкой.

Попробуйте вместо этого установить referenceAttitude при первом вызове updateData, и он должен работать.

...