0

现在我正在使用以下代码从设备的陀螺仪中获取欧拉值。这是应该如何使用的吗?或者有没有更好的方法不使用 NSTimer?

- (void)viewDidLoad {
[super viewDidLoad];
CMMotionManager *motionManger = [[CMMotionManager alloc] init];
[motionManger startDeviceMotionUpdates];

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

- (void)read {
CMAttitude *attitude;
CMDeviceMotion *motion = motionManger.deviceMotion;
attitude = motion.attitude;
int yaw = attitude.yaw; 
}
4

2 回答 2

1

你可以用这个...

    [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error)
 {
     CMAttitude *attitude;
     attitude = motion.attitude;
     int yaw = attitude.yaw; 
 }];
于 2012-12-21T06:42:06.300 回答
1

直接引用文档

以指定的间隔处理运动更新

为了在特定的时间间隔接收运动数据,应用程序调用一个“start”方法,该方法采用一个操作队列(NSOperationQueue 的实例)和一个特定类型的块处理程序来处理这些更新。运动数据被传递到块处理程序中。更新频率由“间隔”属性的值决定。

[...]

设备运动。设置 deviceMotionUpdateInterval 属性以指定更新间隔。调用或 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler: 或 startDeviceMotionUpdatesToQueue:withHandler: 方法,传入 CMDeviceMotionHandler 类型的块。使用前一种方法(iOS 5.0 中的新方法),您可以指定用于姿态估计的参考框架。旋转速率数据作为 CMDeviceMotion 对象传递到块中。

所以例如

motionManger.deviceMotionUpdateInterval = 1.0/6.0; // not 1/6; 1/6 = 0
[motionManager 
    startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
    withHandler:
        ^(CMDeviceMotion *motion, NSError *error)
         {
             CMAttitude *attitude;
             attitude = motion.attitude;
             int yaw = attitude.yaw; 
         }];

我只是懒惰地使用了主队列,但这仍然可能是比 NSTimer 更好的解决方案,因为它会给运动管理器一个明确的线索,告诉你多久需要更新一次。

于 2012-12-21T06:42:18.187 回答