Обнаружение, когда iphone был наткнулся


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

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

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

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

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

Из Apple doc 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 7

5 ответов:

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

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

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

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

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

// 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);
}

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

#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;
    }
}

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

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

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

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