Использование CMDeviceMotion для отслеживания наклона iPhone с течением времени - PullRequest
2 голосов
/ 17 апреля 2011

Я пытаюсь использовать CMDeviceMotion, чтобы отследить, когда iPhone наклонен назад, а затем что-то сделать. Я успешно создал CMMotionManager, получаю данные о движении из системы и фильтрую результаты, превышающие определенное ускорение.

Что я хочу сделать, так это определить, когда устройство наклоняется назад или вперед выше определенной скорости. Как мне это сделать?

Вот код, который у меня есть:

ОБНОВЛЕНИЕ: я думаю, что решил это. Я искал свойство вращение, CMRotationRate. Я соединил их вместе, мне действительно нужно только значение x, поэтому я буду продолжать над ним работать. Если у кого-то есть советы по приведенному ниже коду, это очень ценится.

    - (void)startMotionManager{
        if (motionManager == nil) {
            motionManager = [[CMMotionManager alloc] init];
        }

        motionManager.deviceMotionUpdateInterval = 1/15.0;
        if (motionManager.deviceMotionAvailable) {

            NSLog(@"Device Motion Available");
            [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                               withHandler: ^(CMDeviceMotion *motion, NSError *error){
                                                       //CMAttitude *attitude = motion.attitude;
                                                       //NSLog(@"rotation rate = [%f, %f, %f]", attitude.pitch, attitude.roll, attitude.yaw);
                                                   [self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES];

                                               }];
                //[motionManager startDeviceMotionUpdates];


        } else {
            NSLog(@"No device motion on device.");
            [self setMotionManager:nil];
        }
    }

   - (void)handleDeviceMotion:(CMDeviceMotion*)motion{
    CMAttitude *attitude = motion.attitude;

    float accelerationThreshold = 0.2; // or whatever is appropriate - play around with different values
    CMAcceleration userAcceleration = motion.userAcceleration;

    float rotationRateThreshold = 7.0;
    CMRotationRate rotationRate = motion.rotationRate;

    if ((rotationRate.x) > rotationRateThreshold) {
        if (fabs(userAcceleration.x) > accelerationThreshold || fabs(userAcceleration.y) > accelerationThreshold || fabs(userAcceleration.z) > accelerationThreshold) {

            NSLog(@"rotation rate = [Pitch: %f, Roll: %f, Yaw: %f]", attitude.pitch, attitude.roll, attitude.yaw);
            NSLog(@"motion.rotationRate = %f", rotationRate.x);

            [self showMenuAnimated:YES];
        }
    }

    else if ((-rotationRate.x) > rotationRateThreshold) {
        if (fabs(userAcceleration.x) > accelerationThreshold || fabs(userAcceleration.y) > accelerationThreshold || fabs(userAcceleration.z) > accelerationThreshold) {

            NSLog(@"rotation rate = [Pitch: %f, Roll: %f, Yaw: %f]", attitude.pitch, attitude.roll, attitude.yaw);
            NSLog(@"motion.rotationRate = %f", rotationRate.x);

            [self dismissMenuAnimated:YES];
        }
    }
}

1 Ответ

2 голосов
/ 17 апреля 2011

Вы смотрели на CMAttitude ? Похоже, что вам нужно, плюс немного математики, я думаю.


РЕДАКТИРОВАТЬ: Хорошо, вы сделали.

Цитирование Документация Apple , в главе «Получение текущей ориентации устройства» :

Если вам нужно знать только общее ориентация устройства, а не точный вектор ориентации, вы следует использовать методы UIDevice класс для получения этой информации. Использовать интерфейс UIDevice просто и не требует, чтобы вы рассчитать вектор ориентации сами.

Отлично, они делают математику для нас. Тогда я предполагаю, что ускорение слежения, как вы, + ориентация слежения, как объясняется в документации, приведенной выше, должно выполнять эту работу, используя UIDeviceOrientationFaceUp и UIDeviceOrientationFaceDown?

Если ни один из UIDeviceOrientation не соответствует вашим потребностям, то вам нужно будет рассчитать некоторые пространственные углы из двух CMAttitude ссылок, что дает rotationMatrix и quaternion ... эти школьные математические вычисления - далеко прочь для меня ... Я бы тогда предложил поискать / задать математический вопрос только с этими.

...