代码之家  ›  专栏  ›  技术社区  ›  fogelbaby

核心运动陀螺仪旋转有问题

  •  0
  • fogelbaby  · 技术社区  · 14 年前

    我正在开发一个应用程序,它需要检测到iPhone的旋转手势。我已经编写了一些代码,在CMMotionManager中对旋转数据进行轮询,但是由于某种原因,这些值会不断变化,即使手机在桌子上静止不动。我不知道我在这里做错了什么。我已经咨询过苹果的文档,看起来我正在按照他们的建议做,事情确实没有崩溃,但是得出的数字毫无意义。以下是我要做的:

        -(void)startDetectingMotion {
    
     if (!motionQueue){
      motionQueue = [[NSOperationQueue mainQueue] retain];
     }
    
     if (motionManager.isDeviceMotionAvailable) {
    
      CMDeviceMotionHandler motionHandler = ^ (CMDeviceMotion *motion, NSError *error) {
      [self processMotion:motion withError:error];
     };
    
    
     [motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:motionHandler];
    
     }
     else {
      NSLog(@"motion not available");
     }
    
    }
    

    -(void)processMotion:(CMDeviceMotion *)motion withError:(NSError *)error {
    
     CMRotationRate rotation = motion.rotationRate;
     if(rotation.y > 2 || rotation.y < -2) {
      NSLog(@"CM Motion X rotation:%f, Y rotation:%f, Z Rotation:%f", rotation.x, rotation.y, rotation.y);
      ....
    
      [self stopDetectingMotion];
    
     }
    }
    

    Y>2或lt;2的陷阱点是寻找iPhone在水平面上的快速旋转,这正是我要寻找的。

    输出如下:

    2010-08-15 16:15:43.475 Pokerfoldtest[539:307]cm运动x旋转:11.415660,y旋转:7.865920,z旋转:7.865920

    2010-08-15 16:04:33.843 Pokerfoldtest[539:307]cm运动x旋转:8.925084,y旋转:8.414384,z旋转:8.414384

    2010-08-15 16:11:14.314 Pokerfoldtest[539:307]cm motion x rotation:10.245130,y rotation:8.243847,z rotation:8.243847

    2010-08-15 16:11:16.136 Pokerfoldtest[539:307]cm motion x rotation:10.212860,y rotation:4.303616,z rotation:4.303616

    2010-08-15 16:11:18.242 Pokerfoldtest[539:307]cm运动x旋转:9.988654,y旋转:-7.074587,z旋转:-7.074587

    2010-08-15 16:11:19.678 Pokerfoldtest[539:307]cm运动x旋转:16.092894,y旋转:-10.562743,z旋转:-10.562743

    2010-08-15 16:15:41.662 Pokerfoldtest[539:307]cm运动x旋转:12.854285,y旋转:7.247667,z旋转:7.247667

    因为这些数字应该是弧度/秒的旋转,所以他们建议当手机静止在桌子上时,它会剧烈地旋转。我勒个去?有没有可能我的手机陀螺仪坏了?

    1 回复  |  直到 14 年前
        1
  •  1
  •   tc.    14 年前
    • 检查一下 motion 不等于零 error 是零)。如果在nil上调用struct返回方法,则会得到垃圾数据。
    • 您只打印极限值(看起来每隔几秒钟就会得到一个极限值,而更新率应该要高得多)。如果你打印所有的更新,你可能对正在发生的事情有更好的了解。