Определить, когда iPhone столкнулся - PullRequest
7 голосов
/ 04 августа 2011

Я хочу быть в состоянии обнаружить, столкнулся ли iphone с чем-то ... было бы лучше слушать гироскоп / акселерометр и судить, насколько быстро он перемещался или если он перемещался и внезапно останавливался.

На самом деле, как бы я оценил, если устройство переместилось, а затем внезапно остановилось?

Этот ответ великолепен, но в обратном порядке. iOS: точное определение энергии удара по выходному сигналу акселерометра - он сглаживает движение, если я хочу обнаружить резкое движение.

Также доступны ли гироскоп и акселерометр для 3GS?

ОБНОВЛЕНО С КОДОМ

Из документа Apple http://developer.apple.com/library/iOS/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html#//apple_ref/doc/uid/TP40009541-CH4-SW26

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

В листинге 4-6 показан упрощенный расчет фильтра верхних частот. Значения ускорения из предыдущего события сохраняются в переменных-членах accelX, accelY и accelZ класса. В этом примере вычисляется значение фильтра нижних частот, а затем вычитается из текущего значения, чтобы получить только мгновенный компонент движения.

Перечисление 4-6. Получение мгновенной части движения из данных акселерометра

define kFilteringFactor 0.1

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Subtract the low-pass value from the current value to get a simplified high-pass filter
    accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)) );
    accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)) );
    accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );

   // Use the acceleration data.
}

Как мне тогда использовать данные ускорения, чтобы определить, обнаружено ли мгновенное движение?

Ответы [ 5 ]

4 голосов
/ 31 мая 2013

Из предыдущих ответов я немного обобщил, чтобы получить следующее, которое работает довольно хорошо:

// Isolate Instantaneous Motion from Acceleration Data
// (using a simplified high-pass filter)
CMAcceleration acceleration = accelerometerData.acceleration;
float prevAccelX = w_self.accelX;
float prevAccelY = w_self.accelY;
float prevAccelZ = w_self.accelZ;
w_self.accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) +
                                   (w_self.accelX * (1.0 - kFilteringFactor)) );
w_self.accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) +
                                   (w_self.accelY * (1.0 - kFilteringFactor)) );
w_self.accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) +  
                                   (w_self.accelZ * (1.0 - kFilteringFactor)) );

// Compute the derivative (which represents change in acceleration).
float deltaX = ABS((w_self.accelX - prevAccelX));
float deltaY = ABS((w_self.accelY - prevAccelY));
float deltaZ = ABS((w_self.accelZ - prevAccelZ));

// Check if the derivative exceeds some sensitivity threshold
// (Bigger value indicates stronger bump)
float sensitivityThreshold = 1.0;
float bumpVectorLength = sqrtf(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ);
if ( bumpVectorLength > sensitivityThreshold ) {
    NSLog( @"BUMP:  |%.3f, %.3f, %.3f| = %.3f", deltaX, deltaY, deltaZ, bumpVectorLength);
}
4 голосов
/ 04 августа 2011

Правильным способом будет использование фильтра верхних частот и линейного ускорения после слияния датчика. Проверьте Sensor.TYPE_LINEAR_ACCELERATION здесь , это для Android. Насколько я знаю, в iPhone нет слияния сенсоров. Как указал Кей, Core Motion обеспечивает слияние сенсоров, см. Комментарий ниже.

Если вам интересно, вот отличное видео о слиянии датчиков , начало в 32: 10.

Несколько грязный обходной путь - использовать фильтр верхних частот и использовать данные акселерометра без слияния датчика. Если вы столкнетесь с чем-то по телефону, вы также можете получить всплески гироскопических данных, но по моему опыту акселерометры лучше, так как они обнаруживают внезапные изменения скорости.

Это грязно, потому что вы можете обмануть это, быстро поворачивая телефон.

3 голосов
/ 28 сентября 2011

Я использовал этот код:

#define kUpdateFrequency    100.0
#define kFilteringFactor    0.1
float accelZ;
int spikeZCount = 0; 

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0 / kUpdateFrequency];
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];

- (void) accelerometer: (UIAccelerometer *) accelerometer didAccelerate: (UIAcceleration *) acceleration 
{
    accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );

    if (accelZ > 0.0f)
    {
        if (spikeZCount > 9)
        {
            //  NSLog(@"SPIKE!");
            [[UIAccelerometer sharedAccelerometer] setDelegate:nil];

            [self isBumped];
        }
        else
        {
            spikeZCount++;
            //  NSLog(@"spikeZCount %i",spikeZCount);
        }
    }
    else
    {
        // NSLog(@"spikeZCount Reset");
        spikeZCount = 0;
    }
}
2 голосов
/ 04 августа 2011

iPhone 3GS имеет акселерометр, но не гироскоп. Тем не менее, есть поддержка гироскопа в соответствии с http://techcrunch.com/2010/06/18/iphone-4-gyroscope-perspectiverse/.

0 голосов
/ 04 августа 2011

Это зависит от разных обстоятельств:

  1. Независимо от того, выпал ли телефон в воздух (или его бросили), т.е. вы больше не держите его в руке.
  2. Если упадет свободно, я думаю, это зависит от угла падения в данный момент телефона наносит удар по препятствию. Если телефон падает точно на один из его лица, гироскоп не будет сообщать о вращении. Но это будет трудно определить.
  3. Эластичность материала, с которым вы сталкиваетесь.

Я согласен с ответом Али относительно ускорения, но не при броске. Но в любом случае имейте в виду, что приложение, которое заставляет пользователей бросать свои iPhone, вряд ли получит одобрение магазина приложений, -)

...