Обнаружение, когда iphone был наткнулся
Я хочу быть в состоянии обнаружить, если iphone был наткнулся на что-то...было бы лучше прислушаться к гироскопу / акселерометру и судить, насколько быстро он двигался или если он двигался и внезапно остановился.
В самом деле, как бы я мог судить, если бы устройство двигалось, а затем внезапно остановилось?
Этот ответ велик, но в обратном порядке iOS: точное определение энергии удара с выхода акселерометра - это сглаживает движение, если что-то я хочу обнаружить резкое движение.
Также доступны ли гироскоп и акселерометр для 3GS ?
ОБНОВЛЕНО КОДОМ
Изоляция мгновенного движения от данных ускорения Если вы используете данные акселерометра для обнаружения только мгновенного движения устройство, вы должны быть в состоянии изолировать внезапные изменения в движении от постоянного воздействия гравитации. Вы можете сделать это с помощью фильтра высоких частот.
В листинге 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 ответов:
Правильным было бы использовать фильтр высоких частот и линейное ускорение после слияния датчиков. Проверьте Датчик.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/.
Это зависит от различных обстоятельств:
- падает ли телефон свободно в воздухе (или был брошен), т. е. вы больше не держите его в руке.
- если падение свободно, то мое предположение зависит от угла падения в данный момент телефона. поражает препятствие. Если телефон падает точно на один из его грани, гироскоп не будет сообщать о вращении. Но это будет трудно определить.
Эластичность материала, в который вы врезаетесь.Согласен с ответом Али относительно ускорения, но не при броске. Но в любом случае имейте в виду, что приложение, которое заставляет пользователей бросить свой iPhone, не будет иметь хороших шансов получить одобрение app store, -)