0

我正在使用 Apple 的iOS 事件处理指南。我正在使用附近描述的 pull 方法startAccelerometerUpdates。pull 方法适合我的目的,因为我只需要从传感器读取一次。

在 iPhone 4、iPad Mini 和 iPad Retina 上的以下代码中,accelerometerData我从对 的调用中得到零。isGyroAvailable isMagnetometerAvailable YES`。两个问题:gyroDatamagnetometerDataisAccelerometerAvailable,, andeach return

如何确定 和 的startAccelerometerUpdates结果startGyroUpdates?它们是void函数,所以我可以假设它永远不会失败吗?(否则,它会抛出或返回 a BOOL)。

如何从对和的调用accelerometerData中获得最后一个错误?gyroDatamagnetometerData

编辑:我不得不打电话[NSThread sleepForTimeInterval:0.150f]从传感器中获取数据。更少,传感器不会产生有效数据。

睡眠增加了第三个问题:当硬件存在时,需要暂停多长时间才能确保数据到达?

提前致谢。

static CryptoPP::RandomPool pool;
static dispatch_once_t once = 0;

dispatch_once(&once, ^{
    CryptoPP::SecByteBlock seed(32);
    CryptoPP::OS_GenerateRandomBlock(true, seed.data(), seed.size());
    pool.IncorporateEntropy(seed.data(), seed.size());
});

// First, send in all the uninitialized data. Then:
//  sesnors[0,1,2] use accelerometer, if available
//  sesnors[3,4,5] use gyroscope, if available
//  sesnors[6,7,8] use magnetometer, if available
CryptoPP::SecBlock<double> sensors(3 * 3);
pool.IncorporateEntropy(sensors.BytePtr(), sensors.SizeInBytes());

CMMotionManager* mgr = [[CMMotionManager alloc] init];
if(mgr) {

    [mgr startAccelerometerUpdates];
    [mgr startGyroUpdates];
    [mgr startMagnetometerUpdates];

    [NSThread sleepForTimeInterval:0.150f];

    if([mgr isAccelerometerAvailable]) {
        CMAccelerometerData* accelData = [mgr accelerometerData];
        if(accelData) {
            sensors[0] = [accelData acceleration].x;
            sensors[1] = [accelData acceleration].y;
            sensors[2] = [accelData acceleration].z;
        }
    }

    if([mgr isGyroAvailable]) {
        CMGyroData* gyroData = [mgr gyroData];
        if(gyroData) {
            sensors[3] = [gyroData rotationRate].x;
            sensors[4] = [gyroData rotationRate].y;
            sensors[5] = [gyroData rotationRate].z;
        }
    }

    if([mgr isMagnetometerAvailable]) {
        CMMagnetometerData* magnetData = [mgr magnetometerData];
        if(magnetData) {
            sensors[6] = [magnetData magneticField].x;
            sensors[7] = [magnetData magneticField].y;
            sensors[8] = [magnetData magneticField].z;
        }
    }

    pool.IncorporateEntropy(sensors.BytePtr(), sensors.SizeInBytes());

    [mgr stopMagnetometerUpdates];
    [mgr stopGyroUpdates];
    [mgr stopAccelerometerUpdates];
    [mgr release], mgr = nil;
}
4

1 回答 1

1

当你这样做时:

mgr startAccelerometerUpdates];
[mgr setAccelerometerUpdateInterval:0.01f];

这意味着您将在 0.01 秒后才开始接收信息,即便如此,您也只会在主线程空闲时收到更新

在检查数据之前您没有等待 0.01 秒,实际上您等待了大约 0.00000000001 秒。而且我不确定,但我认为即使您等待更长时间,您的主线程也可能需要空闲。

我认为您应该返回文档并查看应该如何从传感器读取信息。

我建议使用块来处理运动数据:

[mManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
    // process data
}];

如果您只想要一次,您可以告诉加速度计在收到第一个值后立即停止。

于 2013-09-01T06:38:03.120 回答