运动传感器,读取旋转

时间:2012-02-02 15:04:56

标签: objective-c ios

我在android和ios上都试过这个项目但收效甚微。这个东西很有可能就在我头上。但是我想我会在这里发布我的问题作为最后的努力 我想弄清楚设备何时旋转或翻转。我的应用程序应该知道它何时执行180,360或者设备是否垂直翻转 为了理解它的工作方式,我尝试下载两个示例项目:AccelerometerGraph和CoreMotionTeapot。有了这些和其他东西的混合,我发现我正在尝试这个:

motionManager = [[CMMotionManager alloc] init]; 
motionManager.accelerometerUpdateInterval = 0.01;
motionManager.deviceMotionUpdateInterval = 0.01;
[motionManager startDeviceMotionUpdates];

if (motionManager.gyroAvailable) {
    motionManager.gyroUpdateInterval = 1.0/60.0;
        motionManager.deviceMotionUpdateInterval = 0.01;
    [motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue]
                               withHandler: ^(CMGyroData *gyroData, NSError *error)
     {
         CMRotationRate rotate = gyroData.rotationRate;
         NSLog(@"rotation rate = [%f, %f, %f]", rotate.x, rotate.y, rotate.z);
     }];
} else {
    NSLog(@"No gyroscope on device.");
}

但我不知道如何从这三个值(x,y,z)收集所需信息(水平和垂直旋转)。

4 个答案:

答案 0 :(得分:1)

你所尝试的并不是微不足道的,但肯定是可能的。此视频应该非常有助于了解设备的功能以及如何更接近您的目标: http://www.youtube.com/watch?v=C7JQ7Rpwn2k

虽然他在谈论Android,但同样的概念适用于iPhone。

答案 1 :(得分:0)

来自苹果的文档:CMMotionManager类参考(很抱歉很多阅读,我加粗了一些句子以便快速阅读)

  

创建CMMotionManager实例后,应用程序可以使用它来接收四种类型的运动:原始加速度计数据,原始陀螺仪数据,原始磁力计数据和处理过的设备运动数据(包括加速度计,旋转速率和态度测量)。 Core Motion的传感器融合算法提供的经过处理的设备运动数据可以提供设备的姿态,旋转速率,校准磁场,重力方向以及用户赋予设备的加速度。

     

重要应用程序应该只创建CMMotionManager类的单个实例。此类的多个实例可能会影响从加速度计和陀螺仪接收数据的速率。   应用程序可以在接收运动数据时采用两种方法之一,通过以指定的更新间隔处理它或定期采样运动数据。使用这两种方法时,应用程序应在完成处理加速度计,旋转速率,磁力计或设备运动数据时调用适当的停止方法(stopAccelerometerUpdates,stopGyroUpdates,stopMagnetometerUpdates和stopDeviceMotionUpdates)。

     

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

     

加速度计。设置accelerometerUpdateInterval属性以指定更新间隔。调用startAccelerometerUpdatesToQueue:withHandler:方法,传入一个CMAccelerometerHandler类型的块。加速度计数据作为CMAccelerometerData对象传递到块中。   的陀螺。设置gyroUpdateInterval属性以指定更新间隔。调用startGyroUpdatesToQueue:withHandler:方法,传入一个类型为CMGyroHandler的块。旋转速率数据作为CMGyroData对象传递到块中。   磁力。设置magnetometerUpdateInterval属性以指定更新间隔。调用startMagnetometerUpdatesToQueue:withHandler:方法,传递一个CMMagnetometerHandler类型的块。磁场数据作为CMMagnetometerData对象传递到块中。   设备运动。设置deviceMotionUpdateInterval属性以指定更新间隔。调用或者startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:或startDeviceMotionUpdatesToQueue:withHandler:方法,传入一个CMDeviceMotionHandler类型的块。使用前一种方法(iOS 5.0中的新增功能),您可以指定用于态度估计的参考帧。旋转速率数据作为CMDeviceMotion对象传递到块中。   运动数据的周期性采样   为了通过定期采样处理运动数据,应用程序调用不带参数的“start”方法,并定期访问属性为给定类型的运动数据保存的运动数据。这种方法是游戏等应用程序的推荐方法。处理块中的加速度计数据会带来额外的开销,大多数游戏应用程序只对渲染帧时的最新运动数据样本感兴趣。

     

加速度计。调用startAccelerometerUpdates开始更新,并通过读取accelerometerData属性定期访问CMAccelerometerData对象。   陀螺仪。调用startGyroUpdates开始更新,并通过读取gyroData属性定期访问CMGyroData对象。   磁力。调用startMagnetometerUpdates以开始更新并通过读取magnetometerData属性定期访问CMMagnetometerData对象。   设备运动。调用startDeviceMotionUpdatesUsingReferenceFrame:或startDeviceMotionUpdates方法以开始更新,并通过读取deviceMotion属性定期访问CMDeviceMotion对象。 startDeviceMotionUpdatesUsingReferenceFrame:方法(iOS 5.0中的新增功能)允许您指定用于态度估计的参考框架。

关于收集数据:

@property(readonly) CMGyroData *gyroData

讨论 如果没有可用的陀螺仪数据,则此属性的值为nil。调用startGyroUpdates后接收陀螺仪数据的应用程序会定期检查此属性的值并处理陀螺仪数据。

所以你应该有像

这样的东西
gyroData.rotationRate.x
gyroData.rotationRate.y
gyroData.rotationRate.z

通过存储它们并定期比较它们,您应该能够看到设备是否绕轴转动等。

答案 2 :(得分:0)

这完全取决于iPhone的位置。比方说,如果手机在y轴周围翻转360度,指南针就不会改变'因为在翻转过程中它仍然会以相同的方式指向。这不仅仅是它。我的提示是你记录加速度计并将你收集的数据与所做的动作进行比较,然后确定技巧的各个阶段并为每个技巧制作一个阶段列表。

答案 3 :(得分:0)

那么也许您正在寻找的只是设备方向。你应该看看UIDevice Class Reference

特别是

– beginGeneratingDeviceOrientationNotifications
– endGeneratingDeviceOrientationNotifications

方法

并像这样使用它:

[UIDevice currentDevice].orientation

你会得到这些可能的值:

typedef enum {
    UIDeviceOrientationUnknown,
    UIDeviceOrientationPortrait,
    UIDeviceOrientationPortraitUpsideDown,
    UIDeviceOrientationLandscapeLeft,
    UIDeviceOrientationLandscapeRight,
    UIDeviceOrientationFaceUp,
    UIDeviceOrientationFaceDown
} UIDeviceOrientation;

因此,您可以检查它是纵向(向上还是向下)还是横向(向左或向右)以及是否已翻转。

您将能够实施以下方法:

- willRotateToInterfaceOrientation
- didRotateToInterfaceOrientation

您可以查看this link以查看如何实施这些方法。